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

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

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我的应用程序时,通知消失并从通知栏中删除。 另一件事是我不会使用从未从通知栏中删除的粘贴通知。

我怎样才能避免这一点?

  • 互联网监听器的Android例子
  • 用于小部件更新的RemoteViews超出最大位图内存使用错误
  • Asynctask与线程vs服务与加载器
  • 如何处理Android应用程序中进程间通信的必要性?
  • Robospice - 在改变活动时保持spice服务继续运行
  • 如何从服务中调用活动中的方法
  • 如何在同一设备上运行的Android应用程序之间传输文件?
  • 什么时候调用ServiceConnection.onServiceDisconnected()?
  •   .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(); }