Activity的生命周期和启动模式以及调用模式

本文详细介绍了Android中Activity的生命周期方法,包括启动模式、任务栈管理、配置变更处理及不同模式下的行为特点。同时探讨了如何在屏幕旋转时避免Activity重建,以及如何正确使用标志位进行Activity启动。

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

Activity声明周期方法相关

1、Activity A启动Activity B 如果B的主题模式为透明主题,那么A不会调用onStop()方法
2、Activity从后台回到前台时,声明周期的执行顺序是:onRestar()->onStart->onResume.
3、onStart onResume onPause onStop 这四个方法,随着屏幕的点亮和熄灭 这四个方法会多次别调用
4、onPause和onStop不能做耗时操作,如果非要做 ,就在onStop中做

Activity意外销毁的数据保存

横竖屏

1、onSaveInstanceState,和onRestoreInstanceState这两个Activity的方法,用于Activity意外销毁时这两个方法会被调用,对数据保存和取出,注意只要意外退出才会调用,正常Activity创建和退出不会被调用
2、onRestoreInstanceState在onStop之前调用,onPause之前和之后不一定,onSaveInstanceState在onStart之后调用
3、VIew也有onSaveInstanceState和onRestoreInstanceState这两个方法,也是用于数据保存和取出,
4、意外退出数据保存的执行流程;Activity.onSaveInstanceState()->window->decorVIew->通知所以子View保存数据

资源内存不足导致Activity被杀死

1、前台activity:正在交互的,可见非前台Activity:后台的Activity弹出一个dialog对话框,后台Activity:不可见的执行了onStop。优先级比较:前台>可见非前台>后台
2、一个进程没有四大组件运行,这个进程很容易被杀死,后台的工作最好启动一个服务,在服务中工作,才不会容易被杀死。

屏幕旋转Activity不重新创建

1、如下配置:

android:configChanges=“orientation|screenSize”

2、Activity设置了如上配置,则Activity旋转屏幕时,则不会调用onSaveInstanceState和onRestoreInstanceState,而是调用onConfigurationChanged。

Activity的启动模式

有启动模式的原因:多次启动同一Activity,系统会创建多个实例,这样不是很傻吗?

standard(标准模式)

1、多次启动多次创建,不管实例是否存在
2、一个任务栈可以有多个实例,每个实例也可以在不同的栈
3、Activity在它的启动者的任务栈
4、ApplicationContext启动Activity会报错,以为ApplicationContext不在所谓的栈里,如3中说的,Activity就咩有栈了,所以会报错。

singleTop(栈顶复用模式)

1、被启动的Activity如果在栈顶,则直接调用,不会从新创建,会调用onNewIntent()方法
2、被启动的Activity不在栈顶,则创建新的Activity,会调用oncreate()方法

singleTask(栈内复用模式)

1、只要在指定的任务栈中存在,就不会被重建,调用onNewIntent方法,如果在指定的任务栈中不存在,则在指定任务栈中创建新的实例,调用onCreat方法,并加入指定栈中。
2、前台任务栈,存在A,后台任务栈存在B、C,B和c都是SingleTask模式,B为后台任务栈顶,c为后台任务栈低,
第一种情况:A启动B ,则 B和C会跑到前台任务栈,后台任务栈切换到前台,前台任务栈变成 ACB ,B为栈顶
第二种情况:A启动C,则C会跑到前台任务栈,B会被清除后台任务栈,后台任务栈切换到前台,前台任务栈变成AC,C为栈顶。

singleInstance(单实例模式)

1、加强版的singleTask,Activity只能单独存在一个任务栈中。任务栈中只能有一个Activity。

Activity任务栈

1、任务栈分为前台任务栈和后台任务栈
2、TaskAffinity,这个标识就是任务栈所需的名字,这个标识在Singletask和singleInstace使用有意义,以为和包名不同,standard和singTop都是在默认情况下的任务栈,任务栈的名字就是包名。
3、TaskAffinity为字符串,并且字符串中必须包含“.”
4、TaskAffinity和allowTaskReparenting结合使用时,
A应用启动B应用的一个Activity,如果A应用设置了allowTaskReparenting为Ture的话,B应用的某个启动模式为singleTask的Activity,则B的Activity会掉入到A的应用中,这个时候启动B的应用,则B的应用显示刚才启动的Activity,而不是启动B的主Activity。

指定启动模式

1、在AndroidMenifest指定,或者动态在java代码中指定,这两种方式都存在的话,以动态为主
2、AndroidMenifest无法为Activity指定Flag_Activtiy_Clear_Top标识,动态代码中无法为Activity指定singleInstance模式

Activity的Flags(标志位)

标志位有很多,讲几个常用的,这几个标志位都动态指定的。
1、FLAG_ACTIVITY_NEW_TASK:mainifest中的singleTask
2、FLAG_ACTIVITY_SINGLE_TOP: mainifest中的singleTop
3、FLAG_ACTIVITY_CLEAR_TOP: 类似singtask,栈内启动的activity之上的全部清除。
4、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 启动的activity不会存进activity的历史列表中,比如按返回键时,此activity不会出现。

启动Activity调用模式

1、显式调用模式:intent需要指定启动对象的组件信息,包括包名和类名。
2、隐式调用模式:Activity在Mainifest中指定IntentFilter标签属性,intent启动activity时,不许指定包名和类名,只需要指定的action、category、data,和intentFilter内的属性的值按照相关规则相符就可以启动成功
3、隐式调用时,需要判断,否则报错,通过PackageManage的resolveActivity或者Intent的resolveActivity的方法判断返回是否为null。

intentFilter匹配规则(interFilter包含的属性值)
action:

(1)是一个字符串,区分大小写,intentFilter中的可以存在过个action值,采用隐式启动,则intent必须指定action,和IntentFilter中的一个相同成功。

category:

(1)字符串,intent启动可以不指定,如果指定,则必须和intentFilter中的相同,不管有几个,每个都要和interFilter中的category相同。
(2)intent如果不指定,系统会给intent添加一个默认值,而intentFilter中在创建时,系统也会为其创建默认值,这两个默认值是相同的,所以会启动成功,说到底,还是要求category指定。

data:

data分为两部分:
(1)mimeType:通过媒体类型,比如图片,视频、音乐。
(2)URI:值得即使具体路径,比如http://www.baidu.com:80/或者本地硬盘路径。
(3)intent指定data需要用setDataAndType()方法,不能用setData和setType方法,因为他俩相清除对方的值。
(4)在service和broadcastReceiver中也可以通过隐式调用,不过不推荐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值