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

Android应用被杀死后重新发送常驻通知的解决方案咨询

解决Android应用被杀后常驻通知消失的问题

看起来你尝试用PACKAGE_RESTARTED广播来解决问题,但这个方案其实不对路——这个广播只会在应用被系统主动重启(比如应用更新完成后、系统重启后恢复应用)时触发,完全覆盖不了用户用任务管理器杀进程的场景。而且当应用进程被任务管理器强制终止时,你的广播接收器根本没机会运行,因为进程已经没了。

要实现杀后台后通知还能常驻,正确的姿势是用前台服务。前台服务的优先级远高于普通服务,系统不会轻易杀死它,而且前台服务必须绑定一个通知,只要服务活着,这个通知就会一直显示;就算服务被系统临时杀死(比如内存极端不足),只要返回START_STICKY,系统也会尽量重启服务并恢复通知。

下面是具体的实现步骤和代码:

1. 创建前台服务类

这个服务负责创建并维护常驻通知,代码如下:

package com.appstiq.flutter_app;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import androidx.core.app.NotificationCompat;

public class PersistentNotificationService extends Service {
    private static final int NOTIFICATION_ID = 1001;
    private static final String CHANNEL_ID = "Persistent_Notification_Channel";

    @Override
    public void onCreate() {
        super.onCreate();
        // Android 8.0+ 需要创建通知通道
        createNotificationChannel();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 构建常驻通知
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("我的常驻通知")
                .setContentText("应用后台持续运行中")
                .setSmallIcon(R.drawable.ic_notification) // 替换成你自己的通知图标
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .build();

        // 将服务设置为前台服务,绑定通知
        startForeground(NOTIFICATION_ID, notification);

        // 返回START_STICKY:系统在服务被杀死后会尝试重启它
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // 不需要绑定服务,返回null即可
        return null;
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID,
                    "常驻通知通道",
                    NotificationManager.IMPORTANCE_LOW
            );
            NotificationManager manager = getSystemService(NotificationManager.class);
            if (manager != null) {
                manager.createNotificationChannel(channel);
            }
        }
    }
}

2. 在AndroidManifest中配置服务和权限

需要声明前台服务的权限,以及配置服务的属性:

<!-- 声明必要权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- Android 12(API 31)及以上需要POST_NOTIFICATIONS权限 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<!-- 注册前台服务 -->
<service
    android:name=".PersistentNotificationService"
    android:foregroundServiceType="dataSync" <!-- 根据你的业务场景选择类型,比如mediaPlayback、location等 -->
    android:stopWithTask="false"> <!-- 关键:应用被任务管理器移除时,服务不停止 -->
</service>

这里的stopWithTask="false"非常重要,默认是true,也就是应用被任务管理器杀死时服务也会停止;设置为false后,服务会继续运行,通知也就不会消失。

3. 启动前台服务

在应用启动时(比如MainActivity的onCreate方法)启动这个服务:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 启动前台服务
    Intent serviceIntent = new Intent(this, PersistentNotificationService.class);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // Android 8.0+ 必须用startForegroundService
        startForegroundService(serviceIntent);
    } else {
        startService(serviceIntent);
    }
}

额外注意事项

  • 国产ROM后台限制:很多国产手机(小米、华为、OPPO等)有严格的后台管控,就算用了前台服务,也可能被系统杀死。这种情况下需要引导用户给应用开启「自启动权限」和「后台运行权限」,具体步骤可以参考各厂商的说明。
  • 通知权限申请:Android 12+需要动态申请POST_NOTIFICATIONS权限,否则通知无法显示。你需要在代码中添加权限申请逻辑。
  • 前台服务类型:foregroundServiceType要根据你的实际业务场景选择,比如如果是做数据同步就选dataSync,播放媒体就选mediaPlayback,选对类型可以降低被系统限制的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:52:45