Activity

2018-12-17  本文已影响0人  CrazyLeeY

生命周期流程图:


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;

上一篇下一篇

猜你喜欢

热点阅读