Android 的生命周期和启动模式

典型情况下的生命周期分析

onCreate 表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中 我们可以做一些初始化工作,比如调用setContentView 去加载界面布局资源,初始化Activity所需数据

onRestart 表示Activity正在重启启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart 就会被重新调用。这种情况一般是用户行为所导致的,比如用户按Home键切换到桌面或者用户打开一个新的Activity,这时当前的Activity就会暂停,也就是说onPause 和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。

onStart 表示Activity正在被启动,即将开始,这时Activity已经可见了,但是还没有出现在前台,还无法和用户交互。这时候其实可以理解为Activity已经显示出来了,但是我们还看不到。

onResume 表示Activity已经可见了,并且出现在前台并开始活动。

onPause 表示Activity正在停止,正常情况下,紧接着onStop就会被调用,此时可以做一些存储数据,停止动画的操作,但是注意不能太耗时,因为这会影响到新的Activity的显示,onPause必须先执行完,新Activity的onResume才会执行。

onStop 表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

onDestroy 表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,在这里我们可以做一些回收工作和最终的资源的释放。

附加说明
1、针对一个特定的Activity,第一次启动,回调如下: onCreate -->onStart -->onResume
2、档用户打开新的Activity或者切换到桌面的时候,回调如下:onPause--->onStop,这里有一种特殊的情况,如果新的Activity采用了透明主题,那么当前Activity不会回调onStop
3、当用户再回到原Activity时,回调如下:onRestart-->onStart---onResume
4、当用户按back键回退时,回调如下 onPause-->onStop -->onDestroy
5、onCreate ---onDestroy 分别标识Activity的创建和销毁,并且只可能有一次调用。
     onStart---onStop Activity是否可见
    onResume---onPause 是否在前台

====================================================================================================================================
异常情况下的生命周期分析

1、资源相关的系统配置发生改变导致Activity被杀死并重新创建
Activity --意外情况下--onSaveInstanceState(会保存以前的状态会保存Bundle对象作为参数同时传递给onRestoreInstanceState 和onCreate)--onCreate ---onRestoreInstanceState(取出之前保存的数据并恢复)

2、资源内存不足的时候导致低优先级的Activity被杀死
Activity的优先级分为三种
(1)前台Activity-----正在和用户交互的Activity,优先级最高
(2)可见但非前台Activity---比如Activity中弹出一个对话框,导致Activity可见但是位于后天无法和用户直接交互。
(3)后台Activity--- 已经被暂停的Activity,比如执行了onStop,优先级最低


====================================================================================================================================

Activity 的启动模式
四种启动模式 standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)

standard(标准模式),这也是系统默认的模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。

singleTop(栈顶复用模式)在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果新的Activity的实例已经存在但不是在栈顶,那么新的Activity仍然会被重新创建。

singleTask(栈内复用模式),这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会被重新创建实例,和singleTop一样,系统也会回调其onNewIntent。
具体一点,当一个具有singleTask模式的Activity请求启动后,比如Activity A,系统首先会寻找是否存在A想要的任务栈,如果不存在就会重新创建一个任务栈,然后创建A的实例后把A放到栈中。如果存在A需要的任务栈,这时候要看A是否在栈中有实例存在,如果有实例存在就会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就会创建A的实例并把A压入栈中。

singleInstance (单实例模式)。这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,具有此种模式的Activity的只能单独地位于一个任务栈中。
==================================================================
如何给Activity指定启动模式?
1、AndroidMenifest中指定启动模式
android:launchMode="singleTask"
2、通过在Intent中设置标志位来为Activity指定启动模式
Intent intent = new Intent();
intent.setClass(MainActivity.class,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

这两种方式都可以为Activity指定启动模式,但是二者还是有区别的,首先优先级上,第二种方式的优先级要高于第一种,当两种同时存在的时候,以第二种为准,其次上述两种方式在限定范围上有所不同,第一种无法为Activity 设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种无法为Activity指定singleInstance模式。


查看Activity被启动了几次的命令

adb shell dumpsys activity 

找到 Running activities(most recent first)

===============================================================================

Activity的Flags (标记位)

FLAG_ACTIVITY_NEW_TASK
这个标记位的作用是为Activity 指定singleTask启动模式

FLAG_ACTIVITY_SINGLE_TOP
这个标记位是为Activity指定singleTop的启动模式

FLAG_ACTIVITY_CLEAR_TOP
具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有这个标记位的Activity不会出现在历史Activity的列表中,当某些情况下,我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。
它等同于在XML文件中指定Activity的属性 android:excludeFromRecents =“true”

==================================================================
IntentFilter 的匹配规则


。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值