避免取消关于从最近的应用程序列表中删除应用程序的通知

我正在使用下面的代码片段来显示我的应用程序中的服务通知

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle(currentNotificaion.getMessageTitle()) .setContentIntent(contentIntent) .setContentText(currentNotificaion.getMessageText()) .setAutoCancel(true); int mNotificationId = (int) currentNotificaion.getMessageServerID(); // Gets an instance of the NotificationManager service NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Builds the notification and issues it. mNotifyMgr.notify(mNotificationId, mBuilder.build()); 

我的服务在manifest中是这样声明的:

 <service android:name="com.myapp.services.NotificationService" android:stopWithTask="false"> </service> 

但是,当从最近的应用程序列表中closures我的应用程序时,通知消失并从通知栏中删除。 另一件事是我不会使用从未从通知栏中删除的粘贴通知。

我怎样才能避免这一点?

Solutions Collecting From Web of "避免取消关于从最近的应用程序列表中删除应用程序的通知"

  .setAutoCancel(true); 

我们将其设置为false,这样通知就不会被取消,也不会被删除。 你也可以放

 .setOngoing(true) 

更新:如果上述不起作用,当通知从服务发送时,您需要打电话

  startForeground(int, Notification) 

为了不杀人的应用程序被杀死的服务。

从Android文档:

已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统认为该服务是用户主动注意的内容,因此不适用于内存不足的情况下进行查杀。

更多可以在这里find: Android服务startForeground

在你的Manifest文件中,保持标志stopWithTask为真。 喜欢:

 <service android:name="com.myapp.MyService" android:stopWithTask="true" /> 

我刚刚解决了类似的问题。

如果应用程序通过从最近的应用程序列表中滑动来终止服务,则可以执行以下操作。

  1. 在你的Manifest文件中,保持标志stopWithTask为真。 喜欢:

但正如你所说的,你想取消注册听众,并停止通知等,我会build议这种做法:

 Inside your Manifest file, keep flag stopWithTask as false for Service. Like: <service android:name="com.myapp.MyService" android:stopWithTask="false" /> 
  1. 现在在你的MyService服务中,覆盖方法onTaskRemoved 。 (只有当stopWithTask设置为false时,才会触发这个function)。

     public void onTaskRemoved(Intent rootIntent) { //unregister listeners //do any other cleanup if required //stop service stopSelf(); } 

希望它会帮助你。

如果要使用前台通知运行后台服务,最好的方法是使用startForeground()函数。 你可以在这里查看Android文档, 在这里也有一些关于它的答案,就像@CommonsWare中的例子一样。

希望能帮助到你!

如果你想在你的应用程序被杀后显示你的通知,我会build议这个。

正如@JamilHasnineTamim所写的那样 ,当应用程序从设备中死亡时,您可以捕获事件。

 <service android:name="com.myapp.MyService" android:stopWithTask="false" /> 

内部服务

 public void onTaskRemoved(Intent rootIntent) { //your code //stop service stopSelf(); } 

但是,在这段代码中,你可以给AlarmManager充电几秒钟后重新启动自己的通知。 把这个里面onTaskRemoved

 AlarmManager am = (AlarmManager) ctx.getSystemService(Activity.ALARM_SERVICE); Intent intent = new Intent(BRNotificator.INTENT_FILTER); int somealarmnumber = 10000;//or any numbe your want long nexttime = System.currentTimeInMillis() + 5000L; PendingIntent pi =PendingIntent.getBroadcast(ctx, somealarmnumber, intent, PendingIntent.FLAG_CANCEL_CURRENT): am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi); 

广播接收者是:

 public class BRNotificator extends WakefulBroadcastReceiver { public static final String INTENT_FILTER = "com.example.BRNotificator"; @Override public void onReceive(Context ctx, Intent intent) { //restart your service this notification OWakeLocker.acquire(ctx, 0); ComponentName comp = new ComponentName(ctx.getPackageName(), YourServiceClass.class.getName()); startWakefulService(ctx, intent.setComponent(comp)); //or just show your notification again: NotificationCompat.Builder mBuilder = //... your code to show } } 

这是一个可以帮助唤醒设备的帮手:

 public class OWakeLocker { private static PowerManager.WakeLock[] wakeLocks = new PowerManager.WakeLock[1];//Services count @SuppressWarnings("deprecation") public static void acquire(Context ctx, int index) { WakeLock wakeLock = wakeLocks[index]; if (wakeLock != null) wakeLock.release(); PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, _.APPNAME + Integer.toString(index)); if (wakeLock != null && wakeLock.isHeld()){ wakeLock.acquire(); } } public static void release(int index) { WakeLock wakeLock = wakeLocks[index]; if (wakeLock != null) wakeLock.release(); wakeLock = null; } } 

你甚至可以

 public static void clearNotifications(Context context) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancelAll(); }