如何确保Android中给定的activity只有一个?

How to make sure that there is only one of a given activity in Android?

我不确定应用程序的最佳实现是什么,它应该定期检查某些条件并在满足条件时发出警报。

假设我的主 activity MainActivity 有一个“start”按钮,它启动前台服务 CheckConditionService 检查条件每秒一次。如果满足条件,一个新的 activity AlarmActivity,它有一个“停止警报”-按钮,应该开始,并且应该开始周期性的蜂鸣声,也。如果用户按下“停止警报”,AlarmActivity应该被销毁并且CheckConditionService应该停止周期性蜂鸣并继续周期性条件检查。

现在可能有几个我想注意的不寻常的用例:

  1. 用户可以(无意或有意)关闭 AlarmActivity 而不是按下“停止警报”按钮,或者它可能被系统关闭,因为它在后台停留了太长时间。在这种情况下,用户应该能够通过单击 CheckConditionService 的应用程序图标或前台通知重新打开 AlarmActivity
  2. 另一方面,单击其中一个不应创建同时打开多个 AlarmActivity 的状态。
  3. 也许我忘记了其他一些需要注意的异常行为?欢迎提出建议!

问题:最好最干净的方法是什么?如果满足条件并且应该启动警报,CheckConditionService 应该调用什么? MainActivityonCreate() 中可以做什么 1. 查明当前是否发出警报,因此应该启动 AlarmActivity 和 2. AlarmActivity 是否已经打开并且如果是,不是打开 AlarmActivity 的第二个实例,而是打开现有的实例?

  1. 创建 ForegroundService
  2. 创建一个静态变量,可能是 Boolean 类型,如果您想检查条件状态,例如:CheckConditionService.isConditionMet.
    确保 Update 在任何任务中 运行 在该服务中。
  3. 根据 CheckConditionService.isConditionMet 返回的结果,使用 SplashScreen 确定应打开哪个 Activity。
    这是一篇不错的文章:https://medium.com/@shishirthedev/the-right-way-to-implement-a-splash-screen-in-android-acae0e52949a
  4. 为防止意外关闭 AlarmActivity,您可以禁用 onBackPressed()
    但是,用户始终可以通过 Home Button 或滑动离开(较新版本中的手势)。
    3 在那里可以派上用场。
  5. 只使用AlarmActivity,
    的一个实例或单一状态 在 activity.
  6. 清单中使用 singleTask 标志