Activity的生命周期和启动模式
Activity 生命周期的切换过程
典型状况下的生命周期
1.onCreate 表示Activity 正在被创建 做一些初始化 工作 ,加载布局资源 初始化 需要的数据。
2.onRestart 表示 activity 正在重新启动 。从当前不可见 变成可见 onrestart 被调用 。
3.onStart 表示activity 正在被启动 ,但是还没有出现在前台,无法和用户交互。
4.onResume 表示activity 已经可见了 ,并且出现在前台 并开始活动 。
5.onPause 表示 activity 正在停止,做 存储数据,停止动画等操作 不能太耗时 。
6.onStop 表示activity 即将停止 不能太耗时,但是可以放,做回收动作。
7.onDestory表示即将被销毁 ,做回收工作和最终的资源释放。
(一)生命周期 切换的方法
(1) 当 FirstActivity 要 启动SecondActivity (透明主题) 主题时 ,
仍然能看到FirstActivity 界面时。从 SecondActivity 按Back键 返回到FirstActivity 的时候, 不会执行 onStop 方法 。会从 SecondActivity 的 onPause 方法直接返回到FirstActivity 的OnResume方法 。
(2) 当用户按 Back 键回退时 :回调如下 :onPause—>onStop–>onDestory。
按 Home 键返回的时候 : 只会执行到 onPause ---->onStop。
(3)从生命周期来说 onCreate 和onDestory 方法 只会被调用一次。
OnStart 和 onStop 方法可能会被调用多次 。
(4) OnStart 和 OnResume 。onPause 和 onStop 有什么不同哪 ?
OnStart 和 onStop 这从是否可见的角度 回调的 。
OnResume 和 onPause 是否位于前台 来回调的。
1.A—B 的activity(aAcitivity进入bAcitivity的生命周期)
A的生命周期 onpause
B的生命周期 oncreate–> onstart–> onresume–>
A的生命周期 onstop
2.从B按Back键返回A的状态;
B的生命周期 onPause
A的生命周期 onRestart—>onStart–onResume
B的生命周期 onStop -> onDestory
3.按Home键回到桌面的情况;
onPasue–onStop
(二)OnSaveInstanceState 和 onRestoreInstance State调用的时机
- 调用时机
OnSaveInstanceState 调用时机在OnStop 之前 。
onRestoreInstanceState当Activity 被重新创建 系统会重新调用 在onStart 方法之后。
保护界面文本的内容
当系统认为一个Activity 有可能被回收时,系统会调用OnSaveInstanceState 方法
当一个被回收的Activity重新打开时。 系统会调用它的onRestoreInstanceState。
文本框(EditeText)中用户输入的数据,ListView滚动的位置等,这些view相关的状态系统都能够默认为我们恢复。
- 旋转屏幕导致重建保存数据
在默认的情况下Activity如果不做特殊处理,那么当系统配置发生改变时activity 会被销毁和重建。
当Activity的系统配置发生改变后,那么它被销毁之前,系统会通过 OnSaveInstanceState 来保存数据,同时会通过onRestoreInstanceState来恢复数据。
例如 还有横竖屏切换的时候 可以在清单文件里activity 标签里添加 Android:configchanges=“orientation|screenSize|keyboardHidden”。
添加上这个属性以后 activity 不会被重新创建 但是会调用onConfigurationChanged方法,可以在这个方法进行监听 横竖屏切换的特殊操作。
在 onRestoreInstanceState 里 可以直接获取 Bundle savedInstanceState 值不需要判断是否是空。
但是在Oncreate不行,正常启动情况下 oncreate 的 Bundle savedInstanceState 为null 。
- 资源不足导致低优先级的Activity被杀死
(1)前台Activity --------------正在和用户进行交互的Activity 优先级最高。
(2)可见但非前台Activity --------比如弹出对话框,导致Activity 可见但是位于后台无法与用户交互。
(3)后台Activity-----已经被暂停的Activity ,比如执行了onStop 优先级最低。
如果一个进程没有在四大组件中执行,那么这个进程很快会被系统杀死,最好放入Service组件中。
Actvitity的 启动模式
(1)standard 标准模式 也是系统的默认模式 。每次启动一个activity 都会创建一个新的Activity 实例 注意:在非activity类型的context(如ApplicationContext)并没有所谓的任务栈,所以不能通过ApplicationContext去启动standard模式的activity。
(2)singleTop 栈顶复用模式 在这种模式下,如果新Activity 已经位于任务栈的栈顶,那么此Activity 不会被重新创建。 调用onNewIntent 方法被回调 oncreate onstart 不会被调用。 使用场景如新闻类或者阅读类App的内容页面。
(3)singleTask 栈内复用模式 。 只要Activity 在一个栈中存在,那么多次启动此Activity 都不会被重新创建。 调用onNewIntent 方法被回调。同时具有清栈效果在他之上的所有Activity 都会被出栈。使用场景浏览器的主界面
(4)singleInstance单实例模式。 具有这个栈模式的Activity只能单独的位于一个任务栈中 后续不会再创建除非这个任务栈被销毁。 使用场景 闹铃提醒,将闹铃提醒与闹铃设置分离。