如何检测我的任何活动是否是最前面的并且对用户可见?

时间:2010-06-28 21:16:28

标签: android android-activity

我希望在我的任何活动可见时启动意图,否则我会将其作为通知提出,并由用户触发。

要做出决定,我需要知道我的任何活动是否最重要,我该怎么做?

5 个答案:

答案 0 :(得分:10)

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

对于标志,如果你已经扩展了Application类,那么它可能是一个存储它的好地方。为了扩展应用程序类,top answer to this question有信息。 (d)。

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

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

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


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

答案 1 :(得分:4)

您可以从ActivityManager请求正在运行的任务:

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

来自API文档:

  

返回最多当前正在运行的任务列表   最近是按顺序排列的第一个和更早的一个。

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

答案 2 :(得分:3)

onResume()名为&amp;&amp; onPause()未被称为=可见 在您的public static Activity currentlyVisible;子类中有一个Application,您的活动将对其进行更新(设置为onResume()中的实例和null中的onPause())。或者发明一个不太丑陋的注册表变种。

答案 3 :(得分:2)

您可以使用onWindowFocusChanged(boolean hasFocus)将其置于活动的超类中,以便在焦点具有焦点时启动它。

答案 4 :(得分:0)

您可以通过代码执行一项简单的技巧,而不是使用活动管理器。如果密切观察活动周期,两个活动之间的流程和前景到背景的流程如下。假设A和B是两个活动。

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

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

您只需在活动中放置一个标记即可检测您的背景事件。

制作抽象活动并将其从其他活动中扩展出来,这样就无需在任何需要背景事件的地方复制粘贴所有其他活动的代码。

在抽象活动中,创建标志isAppInBackground。

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

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

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

如果isAppInBackground为true,您只需要检入onResume()。 n检查完你的标志后再设置isAppInBackground = false

对于两个活动之间的转换,因为onstop()的第一个将在第二个actvity恢复后始终被调用,flag将永远不会为true,当app在后台时,onStop()活动将在onPause之后立即被调用,因此该标志将当你稍后打开应用程序时,这是真的。