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

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

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

  • 当内存不足时,Android不会从堆栈中查看活动
  • 使用SurfaceView编程和线程策略进行游戏开发
  • windowBackground与活动风格的背景有什么区别?
  • 如何在卸载我的应用程序之前显示活动(Android)
  • 了解哪个活动首先在Android应用中启动
  • Android从另一个类调用方法
  • 什么是Activity.isFinishing()的片段等价物?
  • 为什么应用程序有时会重新启动killProcess?
  • 我不知道有一种方法来获取当前显示的活动,但是您可以将活动生命周期和标志结合起来。

    对于国旗,如果你扩展了应用程序类,这可能是一个体面的地方来存储它。 为了扩展应用程序类, 这个问题的最佳答案有信息。 (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之后立即被调用,因此当您稍后打开应用程序。