Android的生命周期和启动模式

来源:互联网 发布:深入理解java泛型 编辑:程序博客网 时间:2024/06/06 05:08

Activity的生命周期和启动模式

大概分为如下模块进行分析:

  • 典型情况下的生命周期分析
  • 异常情况下的生命周期分析
  • Activity的LaunchMode
  • Activity的Flags
  • IntentFilter的匹配规则

生命周期

(1)正常情况下的生命周期

  • ①onCreate();表示Activity正在被创建,一般在这个方法里执行一些初始化工作,比如setContentView()加载界面布局资源.

  • ②onRestart();表示Activity正在重新启动,一般是当当前Activity从不可见重新变为可见的时候调用。比如用户按下Home键或者打开一个新的Activity后接着又回到Activity。

  • ③onStart(); 表示Activity正在启动,这时Activity可见了,只是还在后台没有到前台,还不可以与用户进行交互。可以理解成显示出来了,但是还看不到。

  • ④onResume(); Activity可见,也显示在前台了,可以与用户进行交互了。与onStart的区别可以理解为onStart时还在后台,onResume显示在前台。

  • ⑤onPause();表示正在停止,紧接着会调用onStop()方法。如果新的Activity为透明,可以执行停止动画、存储数据操作,不能执行耗时的操作。因为启动新的Activity,必须调用完前一个onPause方法才能调用新的Activity的onCreate方法。

  • ⑥onStop();表示即将停止,可以进行稍微重量级的回收工作,同样不能执行太过耗时的操作。

  • ⑦onDestroy();表示Activity即将销毁。可以进行最后的回收工作和资源的释放。


流程图:

生命周期流程图

注意:

  • (1)当用户切换至Home或者打开新的Activity的时候,调用onPause->onStop,有一种特殊情况:当新的Activity为透明的主题时,只会调用onPause方法,不会调用onStop方法。

  • (2)当返回至原Activity时,回调顺序如下:onRestart->onStart->onResume;

  • (3)当用户按下back回退键的时候,onPause->onStop->onDestroy;

(2)异常情况下的生命周期

  • Activity除了用户操作导致的生命周期调度外,还有一些异常情况,比如资源系统配置改变或者当内存不足时,Activity可能被杀死。

①资源相关的系统配置发生改变导致Activity被杀死及重新创建

  • 当屏幕为竖屏的时候突然转为横屏,这时候系统配置发生改变,Activity会回调onPause->onStop->onDestroy方法,然后重新创建Activity。同时,由于异常情况发生,系统会调用onSaveInstanceState方法保存当前Activity的状态。注意,只有当发生异常情况系统才会调用这个方法,否则不会调用。当Activity重新创建时,系统会调用onRestoreInstanceState方法,并且把onSaveInstanceState方法所保存的bundle对象作为参数传给onRestoreInstanceState方法和onCreate方法。

②当内存不足时低优先级的Activity被杀死

  • 这种情况的数据存储和恢复和①完全一致。优先级从高->低:
    1.前台Activity – 正在与用户进行交互的界面。
    2.可见但非前台的activity – 比如Activity弹出了一个对话框,activity可见但是位于后台不能与用户进行交互。
    3.已经暂停的Activity – 执行了onstop方法的优先级最低。
    当系统内存不足时就会按照如上优先级的高低进行杀死Activity,并在后续会调用onSaveInstanceState和onRestoreInstanceState进行数据的保存和恢复。

  • 当系统配置改变后,可不可以不要重新创建Activity呢?答案是可以的。设置configChanges属性,比如orientation(当屏幕旋转时,不重新创建),还有两个比较常见的locale和keyboardHidden。locale:一般指换了系统语言;keyboardhidden:键盘的可访问性发生了变化,比如用户调出键盘。不重新创建的时候调用的onConfigurationChanges方法。

启动模式

(1)Activity的launchMode

  • 为什么需要启动模式?在我们多次启动同一个activity的时候,系统会创建多个实例并一一放入任务栈中,当我们按back键时,会发现这些Activity会一一地回退。而任务栈是“后进先出”的栈结构,没按下一次back键就会有一个Activity出栈直到栈为空,当栈中没有任何Activity时系统会回收这个任务栈。问题来了:多次启动同一个Activity,系统重复创建多个实例。所以为了解决这个问题,Android提供了四中启动模式修改系统的默认行为。目前分别有四种启动模式:standard,singleTop,singleTask和singleInstance.

  • <2>singleTop:栈顶复用模式。如果新Activity已经位于任务栈的栈顶,则此Activity不会被创建,同事它的onNewIntent方法会被回调。注意这个Activity的onCreate,onStart不会被调用,因为它并没有发生改变。如果新的Activity不在栈顶,那么新的Activity仍然会重新创建。

  • <3>singleTask:栈内复用模式。这是一种单实例模式,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调它的onNewIntent方法。

  • <4>singleInstance:单实例模式。是加强版的SingleTask模式,他除了具有SingleTask模式的所有特性外,还加强了,那就是具有此种模式的Activity只能单独地位于一个任务栈中,不再区分任务栈。

  • 给Activity指定启动模式有两种方法,第一种是通过Androidmenifest为Activity指定启动模式。

<activity    android:name="...."    android:configChanges="orientation"    android:launchMode= "singleTask"    android:label = "..."</activity>
  • 第二种方式是通过在Intent中设置标志位来为Activity指定启动模式,比如:
    Intent intent = new Intent();    intent.setClass(MainActivity.this,SecondActivity.class);    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    startActivity(intent);
  • 以上两者有区别。首先,优先级上,第二种方式的优先级要高于第一种,当两种方式存在时以第二种为准;其次,在限定范围上有所不同,比如第一种方式无法直接Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式。

Activity的Flags

  • <1>FLAG_ACTIVITY_NEW_TASK
    这个标记为的作用是为Activity指定”singleTask”启动模式,其效果和在xml钟指定改启动模式相同。
  • <2>FLAG_ACTIVITY_SINGLE_TOP
    这个标记为的作用是为Activity指定”singleTop”启动模式,其效果和在xml钟指定改启动模式相同。
  • <3>FLAG_ACTIVITY_CLEAR_TOP
    具有此标记位的Activity,当它启动时,在同一个任务栈所有位于他上面的Activity都要出栈。这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用。
阅读全文
1 0
原创粉丝点击