先附上Activity的生命周期官方经典图:
针对此图:再具体说明一下,分如下几种情况:
- 1,针对一个特定的activity,第一次启动,回调方法如下:onCreate()–>onStart()–>onResume()。
- 2,当用户打开新的activity时或者切换到桌面的时候,回调方法如下:onPause()–>onStop()。还有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调onStop()。
- 3,当用户再次回到原Activity时,回调方法如下:onRestart()–>onStart()–>onResume()。
- 4,当用户按back键返回时,回调方法如下:onPause()–>onStop()–>onDestroy()。
- 5,当Activity被系统回收后再次打开,生命周期方法回调和步骤1一样,注意只是生命周期方法一样,不代表所有过程都一样,这个问题下一节详细说明。
- 6,从整个生命周期来说,onStart()和onDestroy()是一对,分别标识着Activity的创建和销毁,并且只有可能调用一次。从Activity是否可见来说,onStart()和onStop()是配对的,从Activity是否在前台来说,onResume()和onPause()是配对的,随着用户操作或者设备屏幕的点亮和熄灭,这两个方法可能会调用多次。
问题:1,onSatrt和onResume、onPause和onStop有什么区别呢?对开发者来讲有什么实质不同?
2,假设当前Activity为A,如果这是用户打开一个新的Activity B,那么B的onResume和A的onPause哪个先执行呢?
第一个问题,这两对回调方法的意义不同,onStart和onStop是从Activity是否可见这个角度来说的,而onResume和onPause这对方法是从Activity是否位于前台来讲的。
第二个问题,从源码看可以得到解释,Activity的启动比较复杂,涉及到,Instrumentation、ActivityThread和ActivityManagerService(简称AMS)。简单理解,启动Activity的请求由Instrumentation处理,然后它通过Binder来向AMS发请求,AMS内部维护一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用,在ActivityStack中的resumeTopActivityInnerLocked方法中,有这么一段代码:
1 |
从代码看出,在新Activity启动之前,栈顶的Activity需要先onPause(),新的Activity才能启动,最终,在ActivityStackSupervisor中的realStartActivityLocked方法才会调用如下代码:
1 |
不能在onRause做重量级的耗时操作,因为必须onPause后新Activity才能执行onResume方法,所以onPause和onStop都不能执行耗时的操作,我们应该尽量在onStop执行操作,使得Activity尽快显示出来并切换到前台。
1.2 异常情况下的生命周期分析
1,情况一:资源相关的系统配置发生改变导致Activity被杀死并重新创建
IntentFilter的匹配规则
启动Activity分为两种方式,显式调用和隐式调用。区别是显式调用要明确指定被启动对象的组件信息,包括包名和类名,而隐式调用则不需要明确指定组件信息。原则上一个Intent不应该既是显式调用又是隐式调用,如果二者共存的话以显式为主。显示调用较为简单,这里介绍隐式调用。隐式调用要求Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。IntentFilter中的过滤信息有action、category、data。下面详细分析各种属性的规则。
1,action的匹配规则
2,category的匹配规则
3,data的匹配规则