Activity
生命周期流程图:
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;