美文网首页
(一)Activity的生命周期和启动模式

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

作者: YongtaoHuang | 来源:发表于2019-08-26 18:08 被阅读0次

    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进行设置。

    相关文章

      网友评论

          本文标题:(一)Activity的生命周期和启动模式

          本文链接:https://www.haomeiwen.com/subject/nmpqectx.html