Android开发艺术探索——1.Activity的生命周期和启动模式
1.1 Activity的生命周期
1.1.1典型情况的生命周期
- onCreate: Activity正在被创建,可以做一些初始化工作,比如调用setContentView加载界面布局资源,初始化Activity所需的数据。
- onRestart: Activity正在重新启动,一般情况,当前Activity从不可见变为可见
- onStart: Activity正在启动,这时Activity可见,但是还没有出现在前台,无法和用户进行交互,还在后台
- onResume: Activity已经可见了,并且出现在前台开始活动
- onPause: Activity正在停止,紧接着onStop就会被调用
- onStop: Activity即将停止,做一些稍微重量级的回收工作
- onDestroy: Activity即将被销毁,生命周期的最后一个回调,做一些回收工作和最终资源的释放
几种情况:
- 针对一个特定的Activity,第一次启动,回调如下:onCreate -> onStart -> onResume.
- 当用户打开新Activity或切换到桌面时,onPause -> onStop ,如果新Activity采用了透明主题,当前Activity不会回调onStop
- 再次回到原Activity时,回调如下 onRestart -> onStart -> onResume
- 按Back键退回,onPause -> onStop -> onDestroy
- 从整个生命周期来说,onCreate和onDestory是配对的,分别标志着Activity的创建和销毁,并且只可能有一次调用。
从Activity是否可见来说,onStart和onStop是配对的,从Activity是否在前台来说,onResume和onPause是配对的
几个问题:
1.onStart和onStop从Activity是否可见的角度进行回调,onResume和onPause从Activity是否位于前台的角度来回调
2.当前Activity为A,新打开一个ActivityB,ActivityA先onPause,然后新ActivityB再启动
ActivityA: onPause -> ActivityB: onCreate -> onStart -> onResume -> ActivityB:onStop
1.1.2 异常情况下的生命周期
1.资源相关配置发生改变导致Activity被杀死并重新创建
当系统配置改变后,Activity会被销毁,onPause,onStop,onDestroy均会被调用,由于是在异常情况下终止,系统会调用onSaveInstanceState保存当前Activity的状态,调用时机是onStop之前,和onPause没有既定的时序关系,这个方法只会出现在Activity被异常终止的情况下,当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,可以取出之前保存的数据并恢复,onRestoreInstanceState调用时机在onStart之后
2.资源内存不足导致低优先级的Activity被杀死
Activity按照优先级从高到低
1.前台Activity——正在和用户交互的Activity
2.可见但非前台——可见,位于后台无法和用户交互
3.后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低
如果一个进程中没有四大组件在执行,这个进程很快会被系统杀死,因此一些后台工作不适合脱离四大组件独自运行在后台中,比较好的是将后台工作放入Service中从而保证进程有一定的优先级
当系统配置发生变化时,Activity会被重新创建,若不想系统重新创建Activity,给Activity指定configChanges属性
例如不想让Activity在屏幕旋转时重新创建:
android:configChanges="orientation"
1.2 Activity的启动模式
1.2.1 Activity的LaunchMode
- standard:标准模式。每次启动一个Activity都会重新创建一个新的实例。这是一种典型的多实例实现,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
- singleTop:栈顶复用模式。 新的Activity已经位于任务栈的栈顶,此Activity不会被重新创建,同时他的onNewIntent方法会被回调,通过此方法可以取出当前请求的信息,onCreate,onStart不会被系统调用,因为它并没有发生改变。
- singleTask:栈内复用模式,单实例模式,只要Activity在一个栈中存在,多次启动此Activity都不会重新创建实例,也会毁掉onNewIntent。例如:在此模式下的Activity请求启动后,比如ActivityA,系统先寻找是否存在A想要的任务栈,若不存在,重新创建一个任务栈,然后创建A的实例把A放到栈中;若存在,系统把A调到栈顶并调用它的onNewIntent方法,同时singleTask默认具有clearTop的效果,会导致栈内所有在A上面的Activity全部出栈,如果实例不存在,就创建A实例并把A压入栈中。
- singleInstance:单实例模式,一种加强的singleTask模式,具有此种模式的Activity只能单独的位于一个任务栈中,当ActivityA启动后,系统为他建一个新的任务栈,A独自在这个新的任务栈里,由于栈内复用特性,后续的请求均不会创建新的 Activity,除非这个独特的任务栈被系统销毁了。
- 一种情况:
1.Activity所需的任务栈:TaskAffinity,这个参数标识了一个Activity所需的一个任务栈的名字,默认情况,所有Activity所需的任务栈的名字为应用的包名,也可以单独指定。 TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。(任务栈分为前台任务栈和后台任务栈)
2.TaskAffinity和singleTask:他是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
TaskAffinity和allowTaskReparenting:当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。
3.给Activity指定启动模式:
一.通过AndroidMenifest。
二.通过Intent中设置标志位为Activity指定启动模式
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
第二种的优先级高于第一种,第一种无法为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法为Activity指定singleInstance模式。
例:
1.2.2 Activity的Flags
标记位可以设定Activity的启动模式,可以影响Activity的运行状态
FLAG_ACTIVITY_NEW_TASK:为Activity指定“singleTask”启动模式。
FLAG_ACTIVITY_SINGLE_TOP:为Activity指定“singleTop”启动模式。
1.3 IntentFilter的匹配规则
启动Activity分为显式调用和隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。IntentFilter中的过滤信息有action,category,data。一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter,即可成功启动对应的Activity。
1.3.1 action的匹配规则
action是一个字符串,匹配规则是Intent中的action存在且必须和过滤规则中的action匹配,字符串值完全一样,区分大小写。
1.3.2 category的匹配规则
category是一个字符串,与action的不同,action是要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,category匹配要求Intent可以没有category,一旦有category,不管几个,每个都要能够和过滤规则中的任何一个category相同。
1.3.3 data的匹配规则
和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。
data由mimeType和URI组成,mimeType指媒体类型,URI包含很多
????/:/[
当通过隐式方式启动一个Activity时,做一下判断,判断方法有两种,采用PackageManger的resolveActivity或Intent的resolveActivity方法,如果他们找不到匹配的Activity就会返回null。另外PackageManager还提供了queryIntentActivities方法,和resolveActivity不同的是,不是返回最佳匹配的Activity信息而是返回所有成功匹配的Activity信息。
本文地址:https://blog.csdn.net/zhougongjinxuan/article/details/114272316
推荐阅读
-
android开发艺术探索 第一章 intentFilter的匹配规则 隐式启动匹配规则
-
android开发实例(activity生命周期和启动模式、IPC机制)
-
安卓开发艺术探索一——Activity的生命周期和启动模式
-
Android开发艺术探索——1.Activity的生命周期和启动模式
-
Android Studio 安卓活动的生命周期和启动模式
-
Activity启动模式--《Android开发艺术探索》阅读笔记--第一章part2
-
android开发艺术探索 第一章 intentFilter的匹配规则 隐式启动匹配规则
-
android开发实例(activity生命周期和启动模式、IPC机制)
-
Android开发艺术探索——1.Activity的生命周期和启动模式
-
Android Studio 安卓活动的生命周期和启动模式