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
相关产品推荐
相关产品推荐

