作者:小宇宇宙2502862273 | 来源:互联网 | 2023-09-06 16:52
Activity生命周期这是Androidapi中所提供的Activity生命周期图,此外Activity还有四种状态:-running:Activity处于栈顶,接收输入事
Activity生命周期
这是Android api中所提供的Activity生命周期图,此外Activity还有四种状态:
- running:Activity处于栈顶,接收输入事件
- paused:Activity失去焦点(即Activity不处于栈顶但可见,不接收事件)。一种情况是其被非全屏的Activity占据(eg:Dialog弹框)再或者被透明的Activity占据。正常此时Activity所有成员变量,内存状态都还在(除非内存紧张)
- stoped:Activity完全被覆盖。正常此时Activity所有成员变量,内存状态都还在(除非内存紧张)
- killed:被系统回收掉,此时Activity所有成员变量,内存状态都不存在了
下面是Activity几个生命周期的几个关键方法
- onCreate():此时Activity尚不可见,根据setContentView读取根视图之后…
- onStart():此时Activity可见但还不能接收输入事件
- onResume():此时Activity可见且可接收输入事件
下面是Activity的几个常见场景的生命周期流转:
- 点击Home键:running->onPause->onStop
- 回到Activity:stoped->onRestart->onStart->onResume
- 退出Activity:running->onPause->onStop->onDestroy
- 横竖屏切换:(正常情况下,Activity会被销毁并重新创建)running->onPause->onStop->onDestroy->onCreate->onStart->onResume
- 锁屏、解锁屏:(正常情况下)锁屏onPause->onStop 解锁屏onRestart->onStart->onResume
横竖屏相关参数:
- android:screenOrientation:
“unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape”:横屏显示(宽比高要长)
“portrait”:竖屏显示(高比宽要长)
“user”:用户当前首选的方向
“behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
“nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了
- android:cOnfigChanges=”orientation|screenSize”。设置该属性横竖屏切换时Activity不会销毁重建,会调用onConfigurationChanged让我们可以做布局切换等工作
Activity启动模式
- standard:每次启动Activity都会创建Activity实例
- singletop:当启动的Activity与栈顶Acitivity相同则不会创建新的Activity实例
- singletask:当Activity栈中有相同的Activity,则将Activity之上的其他Activity出栈使其位于栈顶
- singleinstance:独立一个Activity任务栈
Activity任务栈
正常情况下,一个应用只有一个进程,而一个进程只有一个Activity栈
Activity(杂)
- onSaveInstanceState/onRestoreInstanceState:Activity很有可能被系统销毁的时候调用,用户点击back键或者主动销毁不调用。可以存储和恢复相关数据
- 隐式启动:隐式启动会根据条件匹配所有合适的对象以供选择
隐式启动需要在AndroidManifet.xml中设置Activity接收的intent-filter条件;然后startActivity的Intent中设置查找筛选条件
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.DIAL"/>
<data android:scheme="tel"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
activity>
//筛选条件
Intent intent = new Intent()
intent.setAction(Intent.ACTION_DIAL)
intent.setData(Uri.parse("tel:10086"))
startActivity(intent)
配置Acitivity的intent-fliter
intent-fliter有三种属性(action、data、category);action表示意图,查找的时候需要要有一个action匹配即可;category表示动作类别,需要全部匹配方可;data表示与动作要操纵的数据,匹配一组即可。
其中data有一下四种类型:
- android:scheme 用于指定数据的协议部分,如上例中的http部分
- android:host 用于指定数据的主机名部分,如www.baidu.com部分
- android:port 用于指定主机名和端口之后的部分,一般紧随在主机名之后
- android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定
Activity启动过程
这里假设从Launcher启动一个全新的App,整个启动过程主要关系到三个进程:Launcher,AMS,新启动的App进程
下面是一个简化的过程
下面是一个较为详细的过程图(从system_server启动Launcher画起)
附上原文件(用亿图打开)
杂
- 当此Activity的实例已经存在,并且此时的启动模式为SingleTask和SingleInstance,另外当这个实例位于栈顶且启动模式为SingleTop时也会触发onNewInstent(),而不触发onCreate