【问题标题】:How to know from context values which activity is currently running foreground?如何从上下文值中知道哪个活动当前正在前台运行?
【发布时间】:2017-03-30 03:51:55
【问题描述】:

我遇到了一个棘手的情况。我会尽量以最好的方式充分解释它。

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

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

在某个时间点,我将使用 Map 中的处理程序来发布一些可运行文件。显然,A 和 B 都将收到,因为它们都在运行(一个在后台和前台)。

  1. 但是我怎样才能检查并只发送给在前台运行的那个?是否可以从上下文值中检查活动当前是正在运行还是已停止?

  2. this.getMainLooper 从 A 和 B 调用时返回相同的内容吗?

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

【问题讨论】:

  • 如果你在A和B内部使用receiver,在onResume()中注册receiver,在A和B的onPause()中注销。

标签: android android-handler android-looper


【解决方案1】:
  1. 但是我怎样才能检查并只发送给在前台运行的那个?是否可以从上下文值中检查是否 活动当前正在运行还是已停止?
  • 最简单和推荐的方法是将Application对象的引用传递给您的库,通过它您可以使用Application.registerActivityLifecycleCallbacks注册到活动生命周期回调,并监控活动的状态并确定活动的时间前台(使用onActivityResumed() 回调)。
  • 另一个不太可取的选项是,每个活动都会通知您的库代码有关它的事件,但它当然更乏味且容易出错。
  • 第三种“不要这样做”的方法是使用具有getRunningTasks()ActivityManager,您可以从它们那里获得最高活动,但它再次被记录为“仅用于调试目的”,并且更容易出错以上。
  1. 从 A 和 B 调用 this.getMainLooper 是否返回相同的内容?

是的,A 和 B 坐在同一个进程上,Main Looper 是主 UI 线程的 Looper,每个 Process 都是单数。

【讨论】:

  • 优秀。尝试了活动生命周期回调,它正在工作!非常感谢!
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2012-07-09
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多