Activity

作者: CrazyLeeY | 来源:发表于2018-12-17 09:49 被阅读0次

    生命周期流程图:


    Activity生命周期执行过程:

    (1)启动Activity:系统会先调用onCreate()方法,然后调用onStart()方法,最后调用onResume(),Activity进入运行状态。界面可显示

    (2)当Activty被其他Activity覆盖上(例如Activity对话框)或者被锁屏:系统会调用onPause()方法,暂停当前Activity的执行。

    (3)当Activity由其被覆盖状态回到前台或解锁屏:系统会调用onResume()方法,再次进入运行状态。

    (4)当Activity跳转新的页面或者Home回到主屏,自身退到后台:系统会先调用onPause(),然后调用onStop()方法,进入停止状态。

    (5)当Activity由重新被启用或者从上个跳回:系统会先调用onRestart()方法,然后调用onStart()方法,最后调用onResume()方法,再次进入运行状态。

    (6)当Activity处于被覆盖状态或者后台不可见状态,系统内存不足时,杀死当前Activity,用户返回时:再次调用onCreate()->onStart()->onResume,进入运行状态

    (7)当退出当前Activity:系统先调用onPause()方法,然后调用onStop()方法,最后调用onDestory()方法,结束当前Activity。

    除了几个常见的方法外,介绍一下onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState几个常用方法:

    (1)onWindowFocusChanged():在Activity窗口获得或者失去焦点的时候被调用,例如首次创建界面显示时,当Activity被其他Activity覆盖,跳转到其他Activity或者Home回到主屏,退出当前Activity。以上情况都会被调用onWindowFocusChanged(),并且当Activity被创建时是在onResume()之后调用,当Activity被覆盖或者退出或者在后台时, 它是在onPause()之后被调用。

    (2)onSaveInstanceState():(a)在Activity被覆盖或者退后台之后,系统资源不足将其杀死,此方法会被调用;(b)在用户改变屏幕方向时会被调用;(c)在当前Activity跳转到其他Activity或者Home回主屏,此方法会被调用。

    (3)onRestoreInstanceState():(a)在Acitivity被覆盖或者后台时,系统资源不足将其杀死,然后用户又回到了Activity,此方法会被调用;(b)在用户改变屏幕方向时候会被调用。我们可以重写这个方法以便可以恢复一些临时数据。onRestoreInstanceState()调用是在onStart()之后。


    Activity四种启动模式

    (1)standard 标准模式

    standard模式是默认的启动模式,不用配置<activity>android:lauchMode属性即可,当然也可以制定值为standard。不管有没有已存在的实例,都生成新的实例。如下图,每次跳转都会在task中生成一个新的实例,并且放在栈的顶部,回退的时候看到原来的实例。

    (2)singTop 栈顶复用模式

    配置<activity>指定属性为android:lauchMode="singleTop",系统会按照singleTop启动模式处理跳转行为。如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。如果另一Activity处于栈顶,跳转其时生成新的实例。singleTop模式的原理如下图所示:

    (3)singleTask 栈内复用模式

    配置<activity>指定属性为android:lauchMode="singleTask",如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。singleTask模式的原理图如下图所示:

    (4)singleInstance 单例模式

    配置<activity>指定属性为android:lauchMode="singleInstance"  singleInstance启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",我们发现这两个Activity实例分别被放置在不同的栈结构中,关于singleInstance的原理图如下:

    如果我们修改FirstActivity的launchMode值为singleTop、singleTask、singleInstance中的任意一个,流程将会如图所示:

    singleInstance启动模式可能是最复杂的一种模式,为了帮助大家理解,我举一个例子,假如我们有一个share应用,其中的ShareActivity是入口Activity,也是可供其他应用调用的Activity,我们把这个Activity的启动模式设置为singleInstance,然后在其他应用中调用。我们编辑ShareActivity的配置:

    <activity android:name=".ShareActivity" android:launchMode="singleInstance">

                <intent-filter>

                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />

                </intent-filter>

                <intent-filter>

                <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" />

                    <category android:name="android.intent.category.DEFAULT" />

                </intent-filter>

            </activity>

    然后我们在其他应用中这样启动该Activity:

    Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE");

    startActivity(intent);

    当我们打开ShareActivity后再按后退键回到原来界面时,ShareActivity做为一个独立的个体存在,如果这时我们打开share应用,无需创建新的ShareActivity实例即可看到结果,因为系统会自动查找,存在则直接利用。大家可以在ShareActivity中打印一下taskId,看看效果。关于这个过程,原理图如下:


    Activity启动模式的设置

    启动模式设置有两种方法:在mainifest中设置、通过Intent设置标志。

    (1)<activity

    android:launchMode="standard"/>  standard 标准模式  singleTop 栈顶模式 singleTask 栈内复用模式  singleInstance 单例模式。

    (2)通过Intent设置标志

    Intent inten=new Intent(ActivityA.this,ActivityB.class);  

    Intent.addFlags(Intent.FlAG_ACTIVITY_NEW_TASK); 

     startActivity(intent);

    标记位属性及含义

    FLAG_ACTIVITY_SINGLE_TOP           指定启动模式为栈顶复用模式singleTop;

    FLAG_ACTIVITY_NEW_TASK              指定启动模式为栈内复用模式singleTask;

    FLAG_ACTIVITY_CLEAT_TOP             所有位于其上层的Activity都要移除,singleTask类似

    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS     具有该标记的Activity不会出现在历史Acitivity的列表中,即无法通过历史列表返回到该Activity上。

    两种设置方法的区别:优先级不同  intent>manifest设置方式      限定范围不同     manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式无法设置单例模式singleInstance;

    相关文章

      网友评论

          本文标题:Activity

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