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 字面上意思是配置改变,不知道其他的回调情况,但是我们平常见的多的 屏幕旋转 是属于配置改变,所以 屏幕旋转是会 回调 此方法的。