Activity 的 36 大难题,你能一一破解吗?
2023-09-23 12:32:19
Android Activity 生命周期深入解析
一、Activity 生命周期
Android Activity 是应用程序中的基本构建块。它们负责处理用户交互并管理应用程序界面。了解 Activity 生命周期至关重要,因为它决定了 Activity 何时可见、正在运行或已销毁。
1. 获取生命周期回调
您可以通过重写 Activity 类中以下方法来获取生命周期回调:
onCreate()
:在 Activity 第一次创建时调用。onStart()
:在 Activity 变为可见时调用。onResume()
:在 Activity 获得焦点并准备好与用户交互时调用。onPause()
:在 Activity 失去焦点但尚未停止时调用。onStop()
:在 Activity 不再可见时调用。onDestroy()
:在 Activity 被销毁之前调用。
2. 判断 Activity 是否在前台或后台
使用 isFinishing()
方法检查 Activity 是否正在完成,或使用 isDestroyed()
方法检查 Activity 是否已销毁。
3. 正确使用 onSaveInstanceState()
onSaveInstanceState()
方法用于在 Activity 被销毁时保存数据。它接收一个 Bundle
作为参数,您可以在其中存储数据。
4. 优雅地恢复 onSaveInstanceState() 保存的数据
在 onCreate()
方法中,通过 savedInstanceState
参数恢复 onSaveInstanceState()
中保存的数据。
5. 正确使用 onPause() 和 onResume() 生命周期方法
在 onPause()
方法中释放资源,并在 onResume()
方法中重新获取它们。
6. 防止 Activity 被意外销毁
在清单文件中使用 android:noHistory
标志阻止 Activity 被意外销毁。
二、Activity 启动
7. 显式启动 Activity
通过调用 startActivity()
方法并传入目标 Activity 的类名显式启动 Activity。
8. 使用 Intent 显式启动 Activity
通过创建 Intent
对象并指定目标 Activity 的类名显式启动 Activity。
9. 使用隐式意图启动 Activity
通过创建 Intent
对象并指定动作和数据类型使用隐式意图启动 Activity。
10. 启动带 Result 的 Activity
使用 startActivityForResult()
方法启动 Activity 并提供一个请求代码。
11. 获取 Result Activity 的数据
在 onActivityResult()
方法中通过 resultCode
和 data
参数获取 Result Activity 的数据。
12. 检查 Activity 是否已启动
使用 isFinishing()
或 isDestroyed()
方法检查 Activity 是否已启动。
三、Activity 间通信
13. 使用 Intent 实现 Activity 间数据传递
使用 Intent
对象在 Activity 之间传递数据。
14. 使用 Bundle 传递复杂数据
使用 Bundle
对象在 Activity 之间传递复杂数据。
15. 使用 Result Code 响应 Activity 结果
通过将 setResult()
设置为 RESULT_OK
或 RESULT_CANCELED
并返回数据 Intent
来响应 Activity 结果。
16. 使用 StartActivityForResult() 启动 Activity 并获取 Result
使用 startActivityForResult()
方法启动 Activity 并通过 onActivityResult()
方法获取 Result。
17. 使用 BroadcastReceiver 实现 Activity 间通信
使用 BroadcastReceiver
实现 Activity 间通信,无需直接引用彼此。
18. 使用 Messenger 实现 Activity 间通信
使用 Messenger
实现 Activity 间通信,可用于跨进程通信。
四、Activity 销毁
19. 正确销毁 Activity
在 onDestroy()
方法中释放资源并清除对 Activity 的引用。
20. 防止 Activity 意外销毁
使用 android:noHistory
标志或 finishAffinity()
方法防止 Activity 被意外销毁。
21. 恢复销毁 Activity 的数据
使用 onSaveInstanceState()
和 onRestoreInstanceState()
方法恢复销毁 Activity 的数据。
22. 检测 Activity 是否已被销毁
使用 isDestroyed()
方法检测 Activity 是否已被销毁。
23. 阻止 Activity 被销毁
使用 finishAffinity()
方法或将 Activity 设置为 singleTop
任务启动模式来阻止 Activity 被销毁。
24. 从销毁的 Activity 中恢复数据
使用 onRestoreInstanceState()
方法或其他持久性存储机制从销毁的 Activity 中恢复数据。
五、Activity 异常
25. 捕获 Activity Exception
使用 try-catch
块或 Thread.setDefaultUncaughtExceptionHandler()
捕获 Activity Exception。
26. 调试 Activity Exception
使用日志记录、调试器和代码审查来调试 Activity Exception。
27. 防止 Activity Exception
使用良好的编程实践、输入验证和错误处理来防止 Activity Exception。
28. 修复 Activity Exception
通过分析日志、调试器输出和源代码来修复 Activity Exception。
29. 从 Exception 中恢复 Activity
通过重新创建 Activity 或使用其他机制从 Exception 中恢复 Activity。
30. 避免 Activity Exception
通过遵循最佳实践、编写稳健的代码和进行彻底的测试来避免 Activity Exception。
六、Activity 场景
31. 在 Fragment 中启动 Activity
使用 startActivity()
方法或 FragmentActivity
的 startActivityForResult()
方法在 Fragment 中启动 Activity。
32. 从 Fragment 中获取 Activity
使用 getActivity()
方法从 Fragment 中获取 Activity。
33. 在 Service 中启动 Activity
使用 startActivity()
方法或 Service
的 startActivityForResult()
方法在 Service 中启动 Activity。
34. 从 Service 中获取 Activity
使用 getApplicationContext()
方法或 Service
的 getBaseContext()
方法从 Service 中获取 Activity。
35. 在 BroadcastReceiver 中启动 Activity
使用 startActivity()
方法或 BroadcastReceiver
的 startActivityForResult()
方法在 BroadcastReceiver 中启动 Activity。
36. 在 BroadcastReceiver 中获取 Activity
使用 getApplicationContext()
方法或 BroadcastReceiver
的 getBaseContext()
方法从 BroadcastReceiver 中获取 Activity。
常见问题解答
-
如何检查 Activity 是否位于堆栈的顶部?
使用isTaskRoot()
方法检查 Activity 是否位于堆栈的顶部。 -
如何将数据从 Activity 传递到 Fragment?
使用setArguments()
方法将数据从 Activity 传递到 Fragment。 -
如何从 Activity 中关闭所有已打开的 Activity?
使用finishAffinity()
方法从 Activity 中关闭所有已打开的 Activity。 -
如何检测 Activity 是否已暂停?
在onPause()
方法中,使用isFinishing()
方法检查 Activity 是否已暂停。 -
如何防止 Activity 重新创建?
在清单文件中将 Activity 的android:noHistory
标志设置为true
。