Android 有四大组件,Activity是其中最重要也是和一个应用程序中使用最多的组件.由于介绍Activity的文章很多了,特别基础和熟记于心的知识我就不再赘述,我就记录一些我感觉容易混淆和遗忘的知识点和使用方法。
生命周期
生命周期图如下:
生命周期呈现如上,值得注意的地方有以下:
1. onResume()方法的执行完后,Activity会请求ActivityManagerService(下称AMS)对它管理的视图进行渲染,此时的Activity位于栈顶且保持运行状态。在这个方法之前的onCreate和onStart方法会进行一些数据的初始化等准备工作。
2. onPause():该方法在Activity由可见状态逐渐变为不可见的状态的过程中调用。一般在系统准备去启动或者恢复另一个Activity的时候调用。这时可做一些数据存储、停止动画或者释放一些消耗的CPU资源等操作,但注意不要做耗时操作。否则会造成卡顿现象或者ActiviNotResponding异常(ANR)。
3. onStop():表示Activity处于停止,即完全不可见状态。
4. onDestory():在Activity被彻底销毁之前调用,表示着Activity被彻底移出了任务栈。是Activity的最后一个声明周期方法。
另外还有一种情况需要说明一下:
- 当新的Activity采用的是透明主题或者一个对话框式的Activity,旧Activity不回调onStop()方法,只会回调onPause()
异常情况下的生命周期分析
异常情况下的程序生命周期简单总结如下图:
异常情况的发生主要有以下两种情况:
- 资源相关的系统配置发生改变导致Activity被杀死并重新创建(如手机屏幕改变,系统语言更改)
如果想让系统配置发生改变后不重新创建,我们可以通过在 < activity>节点中设置 以下的属性来实现:android:configChanges="orientation"
- 资源内存不足导致低优先级的Activity被杀死
Activity的启动模式
1. standard(标准模式).
2. singleTop(栈顶复用模式,也叫栈顶唯一模式).
3. singTask(栈内复用模式,也叫任务唯一模式).
4. singleInstance(单实例模式):这是一种加强的singleTask模式,它除了具有singTask的一切特性之外,还加强了一点,就是具有此模式的Activity只能单独的位于一个任务栈中.
askAffinity与Activity的关系
- 每一个Activity都会有一个TaskAffinity参数,这个参数标识了Activity所需要进入的任务栈的名字。
- 很多时候,在每一个应有程序之间都会存有一个任务栈,在这个应用中所创建出来的Activity,在一般情况下会放入同应用下的任务栈中,而这个任务栈的名字为应用的包名。
Activity制定启动模式的两种方法
- 在manifest文件中
android:launchMode="launchName"
- 在代码中
Intent intent =new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
注:当两种方法同时应用时,以第二种方法为准。
显式启动和隐式启动Activity
1.显式启动:
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
2.隐式启动
- Intent与IntentFilter的联合工作
- IntentFilter的过滤信息
IntentFilter的过滤信息主要包括三种:action、category、data,三种过滤信息都有相应的功能。如果一个Intent传递的信息同时匹配了IntentFilter设定的过滤信息,那么才能成功启动目标Activity,否则就算失败。不过注意的是,一个Activity可以设定多个IntentFilter,只要有其中一组IntentFilter完全匹配,同样可以开启该Activity。
下面分别介绍三种过滤信息:
action的匹配规则
在IntentFilter中,我们可以定义多个action,只要有一个action和Intent传递的信息匹配,那么就算配合成功。
category匹配规则
如果Intent中含有category,那么不管你有几个,都需要和目标Activity在IntentFilter中设定的category匹配。哪怕有一个是不匹配的,都将报下面这个异常。
data匹配规则
如果IntentFilter中定义了data,那么Intent中必须也要定义可匹配的data。