Acitivity的生命周期和启动模式

本文详细介绍了Android中Activity的重要概念,包括其生命周期、启动模式、askAffinity参数的作用及Intent的显式与隐式启动方式。并通过图表展示了Activity在正常及异常情况下的生命周期变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

异常情况下的生命周期分析
异常情况下的程序生命周期简单总结如下图:
这里写图片描述
异常情况的发生主要有以下两种情况:

  1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建(如手机屏幕改变,系统语言更改)
    如果想让系统配置发生改变后不重新创建,我们可以通过在 < activity>节点中设置 以下的属性来实现:android:configChanges="orientation"
  2. 资源内存不足导致低优先级的Activity被杀死

Activity的启动模式
1. standard(标准模式).
2. singleTop(栈顶复用模式,也叫栈顶唯一模式).
3. singTask(栈内复用模式,也叫任务唯一模式).
4. singleInstance(单实例模式):这是一种加强的singleTask模式,它除了具有singTask的一切特性之外,还加强了一点,就是具有此模式的Activity只能单独的位于一个任务栈中.

askAffinity与Activity的关系

  • 每一个Activity都会有一个TaskAffinity参数,这个参数标识了Activity所需要进入的任务栈的名字。
  • 很多时候,在每一个应有程序之间都会存有一个任务栈,在这个应用中所创建出来的Activity,在一般情况下会放入同应用下的任务栈中,而这个任务栈的名字为应用的包名。

Activity制定启动模式的两种方法

  1. 在manifest文件中
android:launchMode="launchName"
  1. 在代码中
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值