如何发现 Activity 在 Android 应用程序的前台?

How to discover what Activity is on the foreground in Android app?

我需要实现逻辑 - 如果用户在聊天 activity 那么我不需要显示新消息的推送通知。所以我需要知道屏幕上的 activity 是什么。为此,我找到了这个答案 How to get current foreground activity context in android? 但我不明白如何使用

public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)

谁能给我一个完整的例子,说明如何发现屏幕上的 activity 是什么?

这是您需要执行的操作的基本结构:

public class AmpApplication extends Application implements
    Application.ActivityLifecycleCallbacks {

    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(this);
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
        // do nothing
    }

    @Override
    public void onActivityStarted(Activity activity) {
        // do nothing
    }

    @Override
    public void onActivityResumed(Activity activity) {
        if(activity instanceof ChatActivity) {
            // chat activity is in foreground
        }
    }

    @Override
    public void onActivityPaused(Activity activity) {
        // do nothing
    }

    @Override
    public void onActivityStopped(Activity activity) {
        // do nothing
    }

}

您的推送通知由您应用中的服务 class 接收(我猜您对应用中的前景 activity 感兴趣,即相同的代码库)。

也许有更优雅、更智能的解决方案,但您也可以像这样做一个有点粗糙的解决方案:

MyApplication extends Application添加标志(static boolean doNotCreateNotification = false;足以用于聊天activity禁止通知的简单场景)到MyApplication extends Applicationclass(添加新的,如果你不在你的项目中还有一个,确保你正确地重新配置项目以使用自定义 Application class).

现在,对于您应用中 运行 的所有代码,包括所有活动 and/or 后台服务处理通知,此静态标志几乎 "global"。

Activity生命周期保证onResume在activity成为前台+活动时被调用,onPause当activity离开这样的状态。因此,您可以在 onResume/onPause 方法中将这些中的全局标志更新为 true/false。

然后在服务处理接收到的通知中,您可以检查标志是否设置为 true 并丢弃通知数据而不在 OS.

中创建徽章

您必须实施 onActivityPausedonActivityResumed()

    public class YourApplication extends Application implements
    Application.ActivityLifecycleCallbacks {

    public static boolean isChatVisible=false;   

    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(this);
    }

    @Override
    public void onActivityCreated(Activity p0, Bundle p1) {

    }

    @Override
    public void onActivityStarted(Activity p0) {

    }

    @Override
    public void onActivityResumed(Activity p0) {

         isChatVisible=p0 instanceof ChatActivity;
    }

    @Override
    public void onActivityPaused(Activity p0) {

    }

    @Override
    public void onActivityStopped(Activity p0) {

    }

}

在构建通知之前,只需检查 YourApplication.isChatVisible()