文章目录
- Application生命周期
- Application生命周期概述
- Application关键回调方法
- onCreate()
- onConfigurationChanged()
- onLowMemory()
- onTrimMemory()
- onTerminate()
- Application生命周期管理最佳实践
- Activity生命周期
- Activity生命周期概述
- Activity生命周期回调方法
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
- Activity生命周期状态转换
- 特殊情况处理
- 配置变更(如屏幕旋转)
- 多窗口模式
- 后台限制
- Activity生命周期最佳实践
- Application与Activity生命周期的交互
- 高级主题
- 进程生命周期
- 任务和返回栈
- 启动模式对生命周期的影响
- 调试与日志记录
- 常见问题与解决方案
- 总结

Application生命周期
Application类是Android应用的全局基类,代表整个应用程序的上下文环境。理解Application的生命周期对于管理全局资源和应用状态至关重要。
Application生命周期概述
Application的生命周期从应用启动开始,到应用终止结束,主要包括以下几个关键阶段:
- 创建阶段:应用进程启动时创建Application实例
- 配置阶段:应用组件初始化及配置
- 运行阶段:应用处于活动状态
- 终止阶段:应用进程被系统回收
Application关键回调方法
onCreate()
onCreate()
是Application生命周期中最重要的回调方法:
@Override
public void onCreate() {
super.onCreate();
// 在这里初始化全局资源
Log.d("Application", "onCreate called");
}
调用时机:
- 应用进程创建后立即调用
- 在任何Activity、Service或Receiver创建之前调用
典型用途:
- 初始化全局对象(如数据库、图片加载库)
- 设置应用级别的配置
- 初始化统计分析SDK
- 设置全局异常处理器
注意事项:
- 避免在此方法中执行耗时操作(超过5秒可能导致ANR)
- 不要在此方法中直接进行UI操作
onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 处理配置变更
}
调用时机:
- 设备配置发生改变时调用(如屏幕旋转、语言切换)
典型用途:
- 处理特定的配置变更
- 更新与配置相关的资源
onLowMemory()
@Override
public void onLowMemory() {
super.onLowMemory();
// 释放非关键资源
}
调用时机:
- 系统内存不足时调用
典型用途:
- 释放缓存资源
- 减少内存占用
onTrimMemory()
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
// 根据内存级别释放资源
}
调用时机:
- 系统需要应用释放内存时调用
内存级别参数:
TRIM_MEMORY_COMPLETE
:进程可能很快被终止TRIM_MEMORY_MODERATE
:进程位于LRU列表中间位置TRIM_MEMORY_BACKGROUND
:进程位于LRU列表底部
onTerminate()
@Override
public void onTerminate() {
super.onTerminate();
// 应用终止时清理
}
注意:
- 此方法仅在模拟器上调用,真机上不会调用
- 不要依赖此方法进行关键资源清理
Application生命周期管理最佳实践
- 轻量级初始化:保持onCreate()方法简洁,延迟加载非必要资源
- 内存管理:合理实现onTrimMemory()和onLowMemory()回调
- 全局状态管理:使用Application类管理应用全局状态时要谨慎
- 避免静态引用:防止内存泄漏
Activity生命周期
Activity是Android应用的UI组件,理解其生命周期对于创建流畅的用户体验至关重要。
Activity生命周期概述
Activity生命周期由一系列状态组成,系统通过回调方法与Activity交互。主要状态包括:
- 创建状态:Activity正在被创建
- 启动状态:Activity可见但未获取焦点
- 恢复状态:Activity可见且获取焦点(用户可交互)
- 暂停状态:Activity部分可见(如被对话框覆盖)
- 停止状态:Activity完全不可见
- 销毁状态:Activity被销毁
Activity生命周期回调方法
onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化Activity
}
调用时机:
- Activity首次创建时调用
典型用途:
- 设置布局(setContentView)
- 初始化视图
- 绑定数据
- 恢复保存的实例状态
参数说明:
savedInstanceState
:包含之前保存的状态(如果是重建)
onStart()
@Override
protected void onStart() {
super.onStart();
// Activity变为可见状态
}
调用时机:
- Activity变为可见时调用
- 在onCreate()之后或onRestart()之后调用
典型用途:
- 注册广播接收器
- 初始化需要在Activity可见时运行的组件
onResume()
@Override
protected void onResume() {
super.onResume();
// Activity获取用户焦点
}
调用时机:
- Activity进入前台并获取用户输入焦点时调用
- 在onStart()之后调用
典型用途:
- 启动动画
- 打开独占设备资源(如相机)
- 恢复暂停的操作
onPause()
@Override
protected void onPause() {
super.onPause();
// Activity失去焦点
}
调用时机:
- 当Activity开始失去焦点时调用
- 另一个Activity进入前台前调用
典型用途:
- 提交未保存的更改
- 释放系统资源
- 停止动画或其他消耗CPU的操作
重要说明:
- 此方法执行时间应尽可能短
- 不要执行耗时操作(会延迟下一个Activity的显示)
onStop()
@Override
protected void onStop() {
super.onStop();
// Activity完全不可见
}
调用时机:
- Activity完全不可见时调用
- 在onPause()之后调用
典型用途:
- 释放/注销不需要在后台运行的资源
- 保存数据到持久存储
onDestroy()
@Override
protected void onDestroy() {
super.onDestroy();
// Activity被销毁前调用
}
调用时机:
- Activity被销毁前调用
- 可能是用户主动关闭或系统为回收内存
典型用途:
- 清理所有资源
- 关闭数据库连接
- 注销所有广播接收器
onRestart()
@Override
protected void onRestart() {
super.onRestart();
// Activity从停止状态重新启动
}
调用时机:
- Activity从停止状态重新显示时调用
- 在onStop()之后,onStart()之前调用
典型用途:
- 重新初始化在onStop()中释放的资源
Activity生命周期状态转换
- 完整生命周期:onCreate() → … → onDestroy()
- 可见生命周期:onStart() → … → onStop()
- 前台生命周期:onResume() → … → onPause()
特殊情况处理
配置变更(如屏幕旋转)
当配置变更发生时:
- 当前Activity被销毁(onPause() → onStop() → onDestroy())
- 新Activity被创建(onCreate() → onStart() → onResume())
保存状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", "value");
}
恢复状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String value = savedInstanceState.getString("key");
}
}
多窗口模式
在多窗口模式下:
- 当Activity失去焦点但部分可见时,只调用onPause()不调用onStop()
- 调整窗口大小时会触发配置变更
后台限制
Android对后台Activity的限制:
- 后台Activity可能被系统回收
- 应妥善保存状态以便恢复
Activity生命周期最佳实践
-
合理分配资源:
- 在onCreate()中初始化长期资源
- 在onResume()中获取独占资源
- 在onPause()中释放独占资源
-
数据持久化:
- 重要数据应在onPause()中保存
- 临时状态使用onSaveInstanceState()
-
避免内存泄漏:
- 不要在Activity中长时间持有Context引用
- 及时注销广播接收器和服务绑定
-
性能优化:
- 减少onCreate()中的耗时操作
- 使用异步任务加载数据
-
状态管理:
- 清晰区分临时状态和持久状态
- 合理使用ViewModel保存UI相关数据
Application与Activity生命周期的交互
-
启动顺序:
- Application.onCreate()
- Activity.onCreate()
- Activity.onStart()
- Activity.onResume()
-
退出顺序:
- Activity.onPause()
- Activity.onStop()
- Activity.onDestroy()
- (可能)Application.onTerminate()(仅模拟器)
-
全局与局部:
- Application生命周期管理全局资源
- Activity生命周期管理UI相关资源
高级主题
进程生命周期
Android应用进程有自己的生命周期,与Application和Activity生命周期相关但不相同:
- 前台进程:拥有用户正在交互的Activity
- 可见进程:拥有可见但非前台的Activity
- 服务进程:运行已启动服务的进程
- 后台进程:不含任何活动组件的进程
- 空进程:缓存进程,为提升启动速度保留
任务和返回栈
Activity在任务(Task)和返回栈(Back Stack)中的行为影响生命周期:
- 新Activity入栈时,前一个Activity的onPause()被调用
- 当用户返回时,栈顶Activity被销毁,下一个Activity恢复
启动模式对生命周期的影响
Activity的启动模式(launchMode)会影响生命周期:
- standard:默认模式,总是创建新实例
- singleTop:如果已在栈顶则重用
- singleTask:在任务中保持唯一实例
- singleInstance:单独任务中的唯一实例
调试与日志记录
建议为每个生命周期方法添加日志:
private static final String TAG = "Lifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
// ...
}
使用Android Studio的Lifecycle观察工具可以直观查看生命周期变化。
常见问题与解决方案
-
Activity重建导致数据丢失:
- 使用onSaveInstanceState()保存临时状态
- 使用ViewModel保存UI相关数据
-
内存泄漏:
- 避免非静态内部类持有Activity引用
- 使用WeakReference或静态类
-
生命周期方法执行顺序混乱:
- 确保先调用super方法
- 避免在生命周期方法中执行耗时操作
-
配置变更处理不当:
- 使用android:configChanges属性控制处理方式
- 或妥善保存和恢复状态
总结
深入理解Application和Activity生命周期是成为优秀Android开发者的基础。合理管理生命周期可以:
- 提高应用性能
- 减少内存使用
- 提供更好的用户体验
- 避免常见问题如内存泄漏和数据丢失
建议在实际开发中结合日志和性能分析工具,不断优化生命周期管理策略。