谈Activity的生命周期

摘自:http://blog.youkuaiyun.com/wyh0802/archive/2010/09/19/5895552.aspx

 

[两分钟彻底让你明白Android Activity生命周期(图文)!]

可借鉴:http://blog.youkuaiyun.com/android_tutor/article/details/5772285

 

1、Activity有三种状态:

 

  • 激活或者运行状态,运行在前台(在当前Activity栈的栈顶)。
  • 暂停状态,失去了焦点但是仍然对用户可见,比如有其他的Activity在它之上,或者透明或者没有遮住整个屏幕。
  • 停止状态,被其他Activity覆盖,需要注意的是包括暂停状态在内,这两种状态都仍然保存了所有状态信息,直到被系统终止。

 

 

2、操纵生命周期的七种方法:

 

 

方法描述是否可被杀死下一个操作
onCreate()初始化,创建views,绑定list的数据等等onStart()
onRestart()在Activity被停止后调用onStart()
onStart()在Activity被用户可见之前调用onResume() 或者 onStop()
onResume()在Activity和用户交互之前调用(快速,持久化)onPause()
onPause()在系统要激活另一个Activity时调用(快速)onResume() 或者 onStop()
onStop()在Activity不再可见时调用onRestart() 或者 onDestroy()
onDestroy()在Activity被销毁时调用

 

3、Activity的运作流程

  • 一般启动Activity:onCreate -> onStart -> onResume
  • 呼叫另一个Activity: onPause -> onCreate -> onStart -> onResume -> onStop
  • 还原Activity: onPause -> onRestart -> onStart -> onResume -> onStop -> onDestroy
  • 退出Activity: onPause -> onStop -> onDestroy
  • 回收再启动Activity: onCreate -> onStart -> onResume

4、作者经验

  • 许多人尤其是初学者都认为Activity的生命周期并不重要,只要onCreate了就ok,实际则不然,当你需要在多个Activity之间切换的时候生命周期的作用就展现了出来,尤其是在Activity之间进行数据传递或者对数据库操作的时候。
  • onResume和onRestart的作用有些相似,很多人对此感到困惑或者难以区分。不过由上面的Activity的运作流程可以看出每一个流程中几乎都存在onResume,而且是在onStart之后,所以有时候将一些必要的操作放在onResume中比放在onRestart中要好。

 

<think>嗯,用户想了解安卓系统中开启画中画模式后activity的状态。这个问题涉及到Android多窗口模式的具体实现机制,特别是生命周期管理这个核心知识点。 从用户提供的四个引用来看,关键信息集中在引用[2]和引用[3]。引用[2]明确指出Activity默认不支持画中画模式,需要在manifest文件中添加android:supportsPictureInPicture="true"属性。而引用[3]则揭示了最重要的技术细节:当Activity切换到画中画模式时,默认会销毁并重建Activity实例,这解释了为什么需要处理配置变更。 用户可能正在开发需要支持画中画功能的应用,作为开发者更关心的是如何避免不必要的Activity重建导致的数据丢失问题。ta提到的“状态”应该包含两层含义:一是生命周期的具体变化过程,二是如何保持界面状态。 根据Android开发经验,需要重点说明以下几点: 1. 标准生命周期流程:onPause()->onStop()->onDestroy()然后重建 2. 避免重建的配置变更处理方案 3. 画中画模式下Activity的特殊状态(半透明悬浮、焦点变化等) 4. 与普通全屏状态的差异点 特别要注意引用[3]提到的android:configChanges配置技巧,这是实际开发中必须掌握的优化点。另外引用[4]虽然的是启动模式,但侧面印证了不同场景下Activity生命周期管理的重要性。 用户没有提及具体Android版本,但根据引用[2]的内容判断,应该主要针对Android 8.0及以上系统。回答时需要强调API 26+的特性,避免兼容性误导。 最后考虑补充一个实用建议:虽然可以通过配置避免重建,但仍建议开发者重写onPictureInPictureModeChanged()回调来处理UI适配问题,因为画中画窗口尺寸变化可能需要调整界面布局。 </think>在 Android 画中画模式下,Activity 的状态管理是其核心机制,主要涉及生命周期变化和配置处理: ### 核心状态变化 1. **生命周期触发重建** 当 Activity 进入画中画模式时,默认会触发销毁重建流程: `onPause()` → `onStop()` → `onDestroy()` → 重建 → `onCreate()` → `onStart()` → `onResume()` 这是因为画中画被视为屏幕配置的重大变更(类似横竖屏切换)[^3]。 2. **避免重建的配置声明** 在 `AndroidManifest.xml` 中声明配置豁免可阻止重建: ```xml <activity android:name=".YourActivity" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" /> ``` 声明后,仅触发 `onConfigurationChanged()` 而非完整生命周期[^3]。 3. **焦点状态变化** 进入画中画时: - 触发 `onPause()`(但 Activity 仍部分可见) - **不会触发** `onStop()`(除非声明了配置豁免) - 失去输入焦点用户交互需通过点击画中画窗口激活) ### 关键回调方法 ```java @Override public void onPictureInPictureModeChanged(boolean isInPipMode, Configuration newConfig) { // 进入/退出画中画的实时回调 if (isInPipMode) { // 隐藏全屏控件(如播放按钮) } else { // 恢复全屏UI } } ``` ### 状态管理要点 | **场景** | **生命周期变化** | **用户可见性** | |------------------------|--------------------------------------|----------------------| | 全屏 → 画中画 | 默认重建 或 `onPause()` + 配置变更 | 变为小窗,部分遮挡 | | 画中画 → 全屏 | 反向重建 或 `onResume()` | 恢复完整界面 | | 画中画中点击 | 无变化 | 获取焦点,可交互 | | 后台关闭画中画 | `onStop()` → `onDestroy()` | 完全不可见 | > **最佳实践**:若需保持视频播放等状态,必须声明 `android:configChanges` 并配合 `onConfigurationChanged()` 调整 UI 布局[^3]。未声明时,应在 `onSaveInstanceState()` 保存临时数据以避免重建丢失[^2]。 --- ### 相关问题 1. 如何实现在画中画模式下保持视频播放不中断? 2. 画中画窗口的尺寸限制有哪些?如何自适应调整 UI 布局? 3. 当多个应用同时使用画中画时,系统如何管理其生命周期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值