Activity生命周期#
应用层管理Activity生命周期的方式#
方法1:
- 在
Application
中存储一个全局数据集list,子元素是Activity
BaseActivity#onCreat
e调用Application
的#add方法添加Activity
- 在退出
App
时,遍历数据集的所有Activity
,调用finsh
方法
方法2:
- 在
Application
中调用registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
- 编写
ActivityLifecycleCallbacks
子类实现,复写接口中生命周期监听方法 - 在每个监听方法里,对一个全局数据集list进行增删改查,list中的子元素是Activity
1 | package com.shaunsheep.activity.lifecycle; |
影响生命周期的因素#
任务栈和返回栈#
任务栈和返回栈的属性对Activity生命周期的影响可以参考我的另一篇文章《ActivityConfig》
启动模式#
启动模式对Activity生命周期的影响可以参考我的另一篇文章《启动模式探索》
灭屏#
实验步骤:
- 启动
- adb灭屏
观察Android 27 log:
1 | com.shaunsheep.activity D/ScreenOffActivity: onCreate: |
发现Activity的生命周期如下:onCreate-onStart-onResume-onPause-onSaveInstanceState-onStop
观察Android30 log:
1 | 2021-11-17 10:31:45.105 15163-15163/com.shaunsheep.activity E/ScreenOffActivity: onCreate: |
发现Activity的生命周期如下:onCreate-onStart-onResume-onPause-onStop-onSaveInstanceState
onStop与onSaveInstanceState顺序在不同版本不一致
键盘#
实验步骤:
- Activity设置背景图,观察Activity布局的变化
- Activity配置一个输入框
- 调整
android:windowSoftInputMode
属性值,观察区别
结论先行:
键盘的弹出不会影响Activity生命周期
观察Android 27log:
1 | 2021-11-17 09:58:44.492 16853-16853/com.shaunsheep.activity E/KeyBordActivity: onCreate: |
观察Android30log:
1 | 2021-11-17 10:32:36.583 15163-15163/com.shaunsheep.activity E/KeyBordActivity: onCreate: |
预备知识:
在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:
1 | android:windowSoftInputMode="stateAlwaysHidden|adjustResize" |
windowSoftInputMode
值的含义列表如下:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
软键盘事件的配置
1 | <activity |
软键盘事件的监听
1 | package com.shaunsheep.activity.lifecycle; |
dialog#
android27 log:
1 | 2021-11-17 10:18:32.752 22304-22304/com.shaunsheep.activity E/DialogActivity: onCreate: |
android30 log:
1 | 2021-11-17 10:33:23.069 15163-15163/com.shaunsheep.activity E/DialogActivity: onCreate: |
启动新Activity#
android27 log:
1 | 2021-11-17 10:52:53.977 31132-31132/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
android30 log:
与27的差异在于onStop和onSaveInstanceState顺序不同
moveTaskToBack#
实验步骤:
- activity绑定事件
- 事件内调用Activity#moveTaskToBack
- 观察log
结论先行:
与灭屏的生命周期一致
android27 log:
1 | 2021-11-17 10:16:26.275 21791-21791/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
android30 log:
1 | 2021-11-17 10:34:25.846 15163-15163/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
onStop与onSaveInstanceState顺序在不同版本不一致
finsh#
实验步骤:
- activity绑定事件
- 事件内调用Activity#finish
- 观察log
android27log:
1 | 2021-11-17 10:18:57.869 22304-22304/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
android30log:
1 | 2021-11-17 10:36:09.328 15163-15163/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
进程退出#
预备知识:
进程退出的手段:
- 操作Activity
1 | finish(); |
- 操作进程
1 | System.exit(0);//正常退出 |
实验步骤:
- activity绑定事件
- 事件内调用操作进程退出的方法
- 观察log
结论先行:
只执行onCreate-onStart-onResume,不执行onPause、onStart、onResume
正常退出的log
1 | 2021-11-17 10:20:40.130 22773-22773/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
非正常退出的log
1 | 2021-11-17 10:21:34.676 23282-23282/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
killProcess的log
1 | 2021-11-17 10:22:41.862 23744-23744/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
主线程crash异常#
实验步骤:
- activity绑定事件
- 事件内调用一段异常代码
int a = 3 /0;
- 观察log
log:
1 | 2021-11-17 10:39:25.327 16634-16634/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
home键#
实验步骤:
- 按下home键
- 观察log
结论先行:
与moveTaskToBack一致,不同android版本,onStop与onSaveInstanceState执行顺序不同
android27log:
1 | 2021-11-17 10:43:29.979 28253-28253/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
android30log:
1 | 2021-11-17 10:41:40.785 16747-16747/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
横竖屏切换#
实验步骤:
- 设备打开横竖屏开关
- 启动该页面
- 旋转设备
- 再旋转设备
- 观察log
第一次启动并旋转
onCreate-onStart-onResume-onPause-onStop-onSaveInstanceState-onDestroy-onCreate-onStart-onRestoreInstanceState-onResume
第二次旋转
onPause-onStop-onSaveInstanceState-onDestroy-onCreate-onStart-onRestoreInstanceState-onResume
android30log:
1 | 2021-11-17 10:46:43.170 16747-16747/com.shaunsheep.activity E/StackProcessActivity: onCreate: |
好文: