如何从上下文值中知道哪个 activity 当前是 运行 前景?

How to know from context values which activity is currently running foreground?

我有一个棘手的情况。我将尝试以最好的方式对其进行全面解释。

我的应用程序几乎没有活动,比如 A、B、C。A 是主要 Activity,B 和 C 从 A 调用。所以基本上当 B 或 C 是​​ 运行,A将被停止(onStop())。

我在我的应用程序中使用 android 库(由我创建)。我的图书馆保存活动的背景。例如,当我们使用 activity A 打开应用程序时,我的库将保存 A 的上下文并将使用该上下文创建一个处理程序并将它们保存在 Map(Map<Context, Handler>) 中。现在,如果我们导航到 activity B,我的图书馆将获取 B 的上下文,然后在地图中为此创建一个新条目。

在某个时间点,我将使用 Map 中存在的处理程序来 post 一些可运行对象。显然,A 和 B 都会收到,因为两者都是 运行(一个在背景和前景中)。

  1. 但是如何检查并只发送到前台的运行?是否可以从上下文值检查 activity 当前是 运行 还是已停止?

  2. 当从 A 和 B 调用时 this.getMainLooper return 是一回事吗?

更新:对不起,我错过了这一点。该应用程序是关于如何使用我的图书馆的演示应用程序。所以我将来会发布我的库,开发人员会使用它。因此,我不希望开发人员这样做,如果我能在我的库本身中做到这一点,那将是最好的。

  1. But how can I check and send only to the one running in the foreground? Is it possible to check from a context value, whether the activity is currently running or stopped?
  • 最简单和推荐的方法是将对 Application 对象的引用传递给您的库,您可以使用它注册到 Activity 使用 Application.registerActivityLifecycleCallbacks 的生命周期回调,并监控活动的状态并确定 activity 何时处于前台(使用 onActivityResumed() 回调)。
  • 另一个不太可取的选择是,每个 activity 都会通知您的库代码有关它的事件,但这当然更乏味且容易出错。
  • 第三种 'do not do it' 方法是使用具有 getRunningTasks()ActivityManager,从他们那里你可以得到 top activity,但它再次被记录为 [=29] =] 并且比以上所有更容易出错。
  1. Does this.getMainLooper when called from A and B return the same thing?

是的,A 和 B 坐在同一个进程上,Main Looper 是主 UI 线程的循环程序,每个 Process.

是单一的