如何检测我的任何活动是否对用户最前方和可见?

我想发起一个意图,当我的任何活动是可见的,否则我会把它作为通知,并将被解雇的用户。

为了决定这一点,我需要知道我的任何活动是否是最前面的,我该怎么做?

Solutions Collecting From Web of "如何检测我的任何活动是否对用户最前方和可见?"

我不知道有一种方法来获取当前显示的活动,但是您可以将活动生命周期和标志结合起来。

对于国旗,如果你扩展了应用程序类,这可能是一个体面的地方来存储它。 为了扩展应用程序类, 这个问题的最佳答案有信息。 (d)。

因此,可能需要跟踪onResume / onPause或onStart / onStop中的当前活动活动(或活动可见的标志),具体取决于您想要的行为。

由于您有多个活动,因此您需要一个用于存储标志的质心位置,这就是应用程序有意义的原因。 您可以通过强制转换应用程序上下文(例如((MyApplication)getApplicationContext())。isMyActivityActive)来获取自定义应用程序对象。

您也可以扩展Activity以帮助保持代码的清洁和包含。


如果您使用的是服务,则可以在onStart / onStop(或onResume / onPause)中的每个活动中绑定到该服务。 如果绑定,你是可见的。

您可以从ActivityManager询问正在运行的任务:

ActivityManager activityManager = (ActivityManager)getContext() .getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> runningTasks = activityManager.getRunningTasks(Integer.MAX_VALUE)); 

从API文档:

返回当前正在运行的任务列表,其中最近的是第一个和更早的任务。

所以列表中的第一项是最前面的活动。

onResume()调用&& onPause() not called = visible。
有一个public static Activity currentlyVisible; 在您的Application子类中,将由您的活动更新(设置为onResume()的实例,并在onPause() null )。 或者发明一个不太难看的registry变体。

你可以使用onWindowFocusChanged(布尔hasFocus)把它放在你的活动的超类中,如果它有焦点就启动这个意图。

而不是使用活动pipe理器有一个简单的技巧,你可以通过代码来完成。 如果仔细观察活动周期,两个活动和前景到背景之间的stream程如下所示。 假设A和B是两个活动。

当从A转换到B时:1.调用A的onPause()2.调用B的onResume()3.调用A的onStop(),当B完全恢复时

当应用程序进入后台:1. A的onPause()被调用2. A的onStop()被调用

您只需在活动中添加标志即可检测您的后台事件。

进行抽象活动并将其从其他活动中扩展出来,以便在需要后台事件的情况下,不必复制粘贴所有其他活动的代码。

在抽象活动中创build标志isAppInBackground。

在onCreate()方法中:isAppInBackground = false;

在onPause()方法中:isAppInBackground = false;

在onStop()方法中:isAppInBackground = true;

你只需要检查你的onResume()如果isAppInBackground是真实的。 在你检查你的标志后,再次设置isAppInBackground = false

对于两个活动之间的转换,由于第一个的onSTop()总是在第二个活动重新开始后调用,所以flag永远不会是true,当app在后台时,activity的onStop()将在onPause之后立即被调用,因此当您稍后打开应用程序。