有点疑问 了解中,未完待续

1.导语

一个Android项目中有各种生命周期,比如 Activity、Application、Dialog,这些正常情况下我们都非常熟悉了,这里我用一个例子来测试下。通过此demo学到了很多平常不可见的知识,同时也引发一些思考。

2.干货
2.1 application

这里先单独将 application 拿出来,继承 Application,然后重写其中的 onCreate (创建应用程序)、onTerminate (终止应用程序)方法,这里相当于 activity 的 onCreate 、onDestroy.。

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, " -----onCreate----- ");
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        Log.d(TAG, "  --------onTerminate-----  ");
    }

运行项目,打印如下

MyApplication: —–onCreate—–

  • 点击返回键退出 APP ,并没有执行 onTerminate 方法
  • 再试,再次从桌面 点击 APP 图表进入 项目, 并没有执行 onCreate 方法
  • 划掉该APP的进程,没有执行 onTerminate
  • 再次从桌面 点击APP进入项目,调用如下方法

MyApplication: —–onCreate—–

分析下其中的道理,

  • 每个项目第一次运行使用时,项目会调用 applicaiton 的 oncreate 创建一个进程,这就是我们常说的 PID 进程,只要此 PID 进程一直存在没有手动或被动杀死,都不会再次生成,也就是不会再次进入 oncreate
  • 就算我们退出app,只要进程还存在,app还是会在后台运行,也就是说 application 的引用还在被一些东西持有,没有被回收
  • 接着上面,我们平常说 不能 static activity/fragment ,也就是不能静态化他们此类的 context 实例,避免没有被使用时,不能被回收,造成内存泄漏,在这里我想了很久,一直没搞懂的是 为什么要 static activity ,没必要啊 ,平常的 activity/fragment 直接可以拿到 context ,直接拿不到的可以在方法或者类中传递 context
  • 然后就是我们常说的 尽量使用Application的Context而不是Activity的Context ,因为这样可以避免内存泄露 ,所以 我们经常可以看到如下的代码
    private static MyApplication mApplication;
    @Override
    public void onCreate() {
        super.onCreate();
        mApplication = this;
        Log.d(TAG, " -----onCreate----- ");
    }

    private static MyApplication getApplication(){
        return mApplication;
    }

这样写看起来没问题,其实只是巧合的没问题,首先一个静态static对象一旦加载就会在程序运行期间一直存在于内存中,而 application 前面说了就算推出了 app 也处于运行状态,不需要被回收,所以这样写刚好没问题,但是我个人还是不喜欢这样写。

  • 再来看 onTerminate ,竟然从头到尾没运行过,就算我手动将进程杀死也没有,有下面解释

此方法适用于仿真过程环境。它永远不会在生产Android设备上被调用,通过简单地杀死进程来删除进程; 这样做时不会执行用户代码(包括此回调)。

现在再添加两个方法 onLowMemory 和 onConfigurationChanged

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.d(TAG, "  --------onLowMemory-----  ");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "  --------onConfigurationChanged-----  ");
    }
  • onLowMemory 当手机内存不够时,并且该程序处于后台不可见运行状态,会清理该程序,同时会调用此方法,所以我们一般可以在这个方法中释放资源回收内存
  • onConfigurationChanged 字面上意思是配置改变,不知道其他的回调情况,但是我们平常见的多的 屏幕旋转 是属于配置改变,所以 屏幕旋转是会 回调 此方法的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值