(一)Activity的生命周期和启动模式

2019-08-26  本文已影响0人  YongtaoHuang

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生命周期的切换过程.png
⭐新旧两个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进行设置。

上一篇 下一篇

猜你喜欢

热点阅读