返回

Activity 的 36 大难题,你能一一破解吗?

Android

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() 方法中通过 resultCodedata 参数获取 Result Activity 的数据。

12. 检查 Activity 是否已启动

使用 isFinishing()isDestroyed() 方法检查 Activity 是否已启动。

三、Activity 间通信

13. 使用 Intent 实现 Activity 间数据传递

使用 Intent 对象在 Activity 之间传递数据。

14. 使用 Bundle 传递复杂数据

使用 Bundle 对象在 Activity 之间传递复杂数据。

15. 使用 Result Code 响应 Activity 结果

通过将 setResult() 设置为 RESULT_OKRESULT_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() 方法或 FragmentActivitystartActivityForResult() 方法在 Fragment 中启动 Activity。

32. 从 Fragment 中获取 Activity

使用 getActivity() 方法从 Fragment 中获取 Activity。

33. 在 Service 中启动 Activity

使用 startActivity() 方法或 ServicestartActivityForResult() 方法在 Service 中启动 Activity。

34. 从 Service 中获取 Activity

使用 getApplicationContext() 方法或 ServicegetBaseContext() 方法从 Service 中获取 Activity。

35. 在 BroadcastReceiver 中启动 Activity

使用 startActivity() 方法或 BroadcastReceiverstartActivityForResult() 方法在 BroadcastReceiver 中启动 Activity。

36. 在 BroadcastReceiver 中获取 Activity

使用 getApplicationContext() 方法或 BroadcastReceivergetBaseContext() 方法从 BroadcastReceiver 中获取 Activity。

常见问题解答

  1. 如何检查 Activity 是否位于堆栈的顶部?
    使用 isTaskRoot() 方法检查 Activity 是否位于堆栈的顶部。

  2. 如何将数据从 Activity 传递到 Fragment?
    使用 setArguments() 方法将数据从 Activity 传递到 Fragment。

  3. 如何从 Activity 中关闭所有已打开的 Activity?
    使用 finishAffinity() 方法从 Activity 中关闭所有已打开的 Activity。

  4. 如何检测 Activity 是否已暂停?
    onPause() 方法中,使用 isFinishing() 方法检查 Activity 是否已暂停。

  5. 如何防止 Activity 重新创建?
    在清单文件中将 Activity 的 android:noHistory 标志设置为 true