1.1 Activity的生命周期全面分析
1.1.1 典型情况下的生命周期分析
典型情况下的生命周期是指在有用户参与的情况下,Activity所经过的生命周期的改变。
Activity的常用生命周期有如下7个:
1、onCreate(): Activity 正在创建
2、onRestart(): Activity 重新启动
3、onStart(): Activity 正在启动
4、onResume(): Activity 可见且在前台
5、onPause(): Activity 正在停止
6、onStop(): Activity 即将停止
7、onDestroy(): Activity 即将销毁
onCreate和onDestroy这一对,表示Activity是否存在
onStart和onStop这一对,表示Activity是否可见
onResume和onPause这一对,表示Activity是否显示在前台
⭐新旧两个Activity之间的切换:
第一步:旧Activity执行onPause;
第二步:新Activity执行onCreate,onStart,onResume;
第三步:旧Activity执行onStop。
所以,onPause不执行重量级操作,尽量在onStop中操作。
1.1.2 异常情况下的生命周期分析
异常情况下的生命周期是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。
Activity异常生命周期的切换过程.png
情况1、由于资源相关配置发生改变,导致Activity被杀死和重新创建
情况2、由于系统资源不足,导致优先级低的Activity被回收
优先级排序:
最高级:前台Activity
中间级:可见但非前台Activity
最低级:后台Activity
1.2 Activity的启动模式
1.2.1 Activity的LaunchMode
1、standard:标准模式、默认模式
每次启动一个Activity就会创建一个新的实例。
2、singleTop:栈顶复用模式
如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调onNewIntent(intent)方法。
3、singleTask:栈内复用模式
只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。
4、singleInstance:单实例模式
具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。
如何指定Activity启动的模式?
1、通过AndroidMenifest
<activity android:name=".MainActivity"
android:launchMode="standard"> // 标准模式
<activity android:name=".MainActivity"
android:launchMode="singleTop"> // 栈顶复用模式
<activity android:name=".MainActivity"
android:launchMode="singleTask"> // 栈内复用模式
<activity android:name=".MainActivity"
android:launchMode="singleInstance"> //单例模式
2、通过Intent设置标志位
Intent intent = new Intent(this,DoubleListViewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 栈内复用
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // 栈顶复用
startActivity(intent);
1.2.2 Activity的Flags
1、FLAG_ACTIVITY_SINGLE_TOP: 对应栈顶复用启动模式。
2、FLAG_ACTIVITY_NEW_TASK: 对应栈内复用模式。
1.3 IntendFilter的匹配规则
匹配规则:
1、一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算完全匹配,才能启动该Activity。
2、一个Activity可以有多个 intent-filter,一个 intent只要成功匹配任意一组 intent-filter,就可以启动该Activity。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(1) action匹配规则:
要求intent中的action 存在且必须和intent-filter中的其中一个 action相同。区分大小写。
(2)category匹配规则:
intent中的category可以不存在,这是因为此时系统给该Activity 默认加上了< category android:name="android.intent.category.DEAFAULT" />属性值。除上述情况外,有其他category,则要求intent中的category和intent-filter中的所有category 相同。
(3)data匹配规则:
如果intent-filter中有定义data,那么Intent中也必须也要定义date。data主要由mimeType(媒体类型)和URI组成。在匹配时通过intent.setDataAndType(Uri data, String type)方法对date进行设置。
网友评论