You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现仅在应用处于后台时显示推送通知?

我来给你捋捋怎么解决这个问题——要让通知只在后台显示,关键是准确判断应用当前是否处于前台状态,单个Activity的onResume/onPause确实不太够(比如多Activity跳转时,前一个Activity的onPause会触发,但应用其实还在前台),给你推荐个靠谱的全局方案:

核心思路:用Application全局监听前后台状态

通过自定义Application类并注册ActivityLifecycleCallbacks,可以统一跟踪所有Activity的生命周期,精准判断应用是否处于前台。

步骤1:实现自定义Application类

创建一个继承自Application的类,实现生命周期回调接口,用计数器维护前台状态:

Kotlin版本

class MyApp : Application(), Application.ActivityLifecycleCallbacks {
    private var activeActivityCount = 0
    // 对外暴露是否处于前台的判断
    val isAppInForeground: Boolean
        get() = activeActivityCount > 0

    override fun onCreate() {
        super.onCreate()
        // 注册生命周期回调
        registerActivityLifecycleCallbacks(this)
    }

    override fun onActivityResumed(activity: Activity) {
        // 有Activity进入前台,计数器+1
        activeActivityCount++
    }

    override fun onActivityPaused(activity: Activity) {
        // 有Activity退到后台,计数器-1
        activeActivityCount--
    }

    // 其他生命周期方法留空实现即可
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
    override fun onActivityStarted(activity: Activity) {}
    override fun onActivityStopped(activity: Activity) {}
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
    override fun onActivityDestroyed(activity: Activity) {}
}

Java版本

public class MyApp extends Application implements Application.ActivityLifecycleCallbacks {
    private int activeActivityCount = 0;

    public boolean isAppInForeground() {
        return activeActivityCount > 0;
    }

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

    @Override
    public void onActivityResumed(@NonNull Activity activity) {
        activeActivityCount++;
    }

    @Override
    public void onActivityPaused(@NonNull Activity activity) {
        activeActivityCount--;
    }

    // 其他生命周期方法空实现
    @Override
    public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {}
    @Override
    public void onActivityStarted(@NonNull Activity activity) {}
    @Override
    public void onActivityStopped(@NonNull Activity activity) {}
    @Override
    public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}
    @Override
    public void onActivityDestroyed(@NonNull Activity activity) {}
}

步骤2:在Manifest中配置自定义Application

修改AndroidManifest.xml,指定你刚才创建的Application类:

<application
    android:name=".MyApp"
    <!-- 其他配置项 -->
    >
    <!-- Activity声明等 -->
</application>

步骤3:在通知触发处添加判断

在你创建并显示通知的代码里,先判断应用是否处于后台,只有后台时才显示通知:

Kotlin版本

// 获取Application实例
val myApp = context.applicationContext as MyApp
if (!myApp.isAppInForeground) {
    // 这里是你原本的通知构建代码(NotificationChannel、NotificationCompat.Builder)
    val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    // ... 创建channel、builder的逻辑 ...
    val notification = builder.build()
    notificationManager.notify(NOTIFICATION_ID, notification)
}

Java版本

MyApp myApp = (MyApp) context.getApplicationContext();
if (!myApp.isAppInForeground()) {
    // 原本的通知构建逻辑
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    // ... 创建channel、builder ...
    Notification notification = builder.build();
    notificationManager.notify(NOTIFICATION_ID, notification);
}

这个方案的优势在于:不管你有多少个Activity,都能精准判断应用的整体前后台状态,不会因为单个Activity的生命周期变化而误判。比如从Activity A跳转到Activity B时,A的onPause会触发,但计数器还是大于0,会正确识别应用处于前台,不会弹出通知。

内容的提问来源于stack exchange,提问作者Leschge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:53:36