-
Activity是什么?
是APP与用户交互的接口
-
Activity的生命周期
- onCreate: 只在Activity被创建时调用,用于初始化界面,注册广播,恢复历史数据,初始化数据
- onStart: Activity由完全不可见变为可见状态
- onResume: Activity面获得焦点,可点击交互,不被顶层其他任何Activity遮挡;开始执行界面交互操作
- onPause: Activity面失去焦点,不可点击交互,被其他Activity(透明,dialog)遮挡,部分可见;此时应当停止交互相关等耗资源的操作,如动画、相机、视频等
- onStop: Activity完全不可见;保存重要数据,而不在onDestroy中执行,因为Activity在后台时进程被杀,则不调用
- onDestroy: Activity完全销毁,无法被onRestart重新唤醒;反注册广播,释放资源(注册反注册要在成对的生命周期中执行)
- onRestart: 将Activity从onStop状态中重新被打开
场景:
当用户点击A中按钮来到B时,假设B全部遮挡住了A(非透明)
A:onPause > B: onCreate > onStart > onResume > A:onStop
A的onPause方法和onStop中不要做耗时操作,不然会影响B的启动
此时如果点击Back键,将依次执行:
B:onPause > onStop > onDestroy > A:onRestart > onResume
此时如果按下Back键,系统返回到桌面,并依次执行:
A:onPause > onStop > onDestroy
当用户点击A中按钮来到B时,假设B全部遮挡住了A(透明)
A:onPause > B: onCreate > onStart > onResume
此时如果点击Back键,将依次执行:
B:onPause > onStop > onDestroy > A:onResume
-
异常状态下的生命周期
异常关闭:异常关闭一般有几种情况,常见的比如锁屏,home键,电话,任务管理键,使得Activity进入onStop状态,此时Activity可能因为内存不足而被杀死(异常关闭)
- Activity在异常关闭情况下的生命周期过程:
异常关闭时触发
onSaveInstanceState
方法保存数据activity重新启动时,通过
onRestoreInstanceState
或者onCreate
中的Bundle
参数恢复数据这两者之间的区别在于:
onRestoreInstanceState方法是在onReStart时调用的,并且会自行判断需不需要恢复数据
onCreate方法中通过Bundle参数恢复数据需注意,由于无法判断需不需要恢复数据,在activity第一次启动时,Bundle是空值,所以需要添加非空判断
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
系统设置改变:如屏幕旋转、键盘、语言等等,会触发Activity重新创建。若想要这些改变时,不触发Activity重启,可以通过在AndroidManifest里设置activity的configChanges属性。常用的有locale(语言区域)、orientation(屏幕方向)、keyboardHidden(键盘无障碍功能)、screenSize(当前可用屏幕尺寸发生了变化,旋转屏幕尺寸会触发)。
- 横竖屏切换
android:configChanges="orientation|keyboardHidden|screenSize"
配置后不会销毁activity,并调用onConfigurationChanged
方法
- 不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
00:50:22.432 3098-3098/com.yirong.androidpractice I/MainActivity: onPause
00:50:22.433 3098-3098/com.yirong.androidpractice I/MainActivity: onSaveInstance
00:50:22.433 3098-3098/com.yirong.androidpractice I/MainActivity: onStop
00:50:22.433 3098-3098/com.yirong.androidpractice I/MainActivity: onDestroy
00:50:22.464 3098-3098/com.yirong.androidpractice I/MainActivity: onCreate
00:50:22.468 3098-3098/com.yirong.androidpractice I/MainActivity: onStart
00:50:22.468 3098-3098/com.yirong.androidpractice I/MainActivity: onRestoreInstanceStateworld
00:50:22.468 3098-3098/com.yirong.androidpractice I/MainActivity: onResume
- 设置
configChanges="orientation|keyboardHidden|screenSize"
后,切屏不会销毁Activity,并调用onConfigurationChanged
方法
11:00:47.249 1103-1103/? I/MainActivity: onCreate
11:00:47.259 1103-1103/? I/MainActivity: onStart
11:00:47.279 1103-1103/? I/MainActivity: onResume
11:02:19.729 1103-1103/com.yirong.androidpractice I/MainActivity: onConfigurationChanged:横屏
11:02:29.889 1103-1103/com.yirong.androidpractice I/MainActivity: onConfigurationChanged:竖屏
- 软键盘弹出
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
-
启动模式
- Standard
- 默认的模式
- 每启动一个Activity都会创建一个新的实例
- 启动流程OnCreate->onStart->Resume
- SingleTask
- 根据当前Activity的TaskAffinity属性,去寻找属性对应名字的任务栈
- 如果目标任务栈不存在,就创建一个新的task
- 如果目标任务栈存在,则判断当前task中有无Activity的实例:若无,则创建一个新的Activity;若存在,则将该实例置于栈顶,并将此实例上的所有Activity全部销毁
- SingleTop
- 如果当前Activity实例不在栈顶,那么创建一个新的Activity实例
- SingleInstance
- 此模式启动的Activity具有全局唯一性
- 独自占有一个任务栈
网友评论