2016-10-10 78 views
0

我正在开发一个必须始终处于活动状态的应用程序,它将用于专用于应用程序的设备。当应用程序从最近的应用程序窗口中被删除时取消通知

我读过,不让应用程序被操作系统杀死我需要设置一个持续的通知,我也应用了部分唤醒锁。

的问题是该通知不会消失,如果应用程序被杀死了,我把这个在我的活动

notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
Intent intent = new Intent(getApplicationContext(), PlayerActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 8000, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
Notification.Builder builder = new Notification.Builder(getApplicationContext()) 
     .setContentTitle("Title") 
     .setContentText("Description") 
     .setContentIntent(pendingIntent) 
     .setSmallIcon(R.mipmap.ic_playlist_play_white_36dp) 
     .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.app_icon)) 
     .setOngoing(true); 

notificationManager.notify(8000, builder.build()); 

onCreate方法上onDestroy方法我称之为

notificationManager.cancelAll(); 
super.onDestroy(); 

通知永远不会被删除,我不得不卸载应用程序被杀死,有没有办法删除它时,应用程序没有加载?

编辑:我针对API 19

+0

不幸的onDestroy方法不这样做一个安全的地方和Android可能不会调用一些这种方法的情况。 可能你必须创建一个服务来处理这种情况,如果有必要的话! –

回答

1

你应该使用Foreground Service,这将防止操作系统杀害您的应用程序(设置的通知正在进行本身不会阻止)。服务还提供了一种手段来检测应用程序通过onTaskRemoved()被刷掉。

首先,你需要在你的清单申报服务:

<service android:name="com.your.app.NotificationService"/> 

然后从活动启动服务:

Intent intent = new Intent(this, NotificationService.class); 
intent.putExtra("key", "value"); // if you have extras 
this.startService(intent); 

将服务设置为前台服务的onStartCommand()

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    Intent pending = new Intent(getApplicationContext(), PlayerActivity.class); 
    pending.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 8000, pending, PendingIntent.FLAG_CANCEL_CURRENT); 
    Notification.Builder builder = new Notification.Builder(getApplicationContext()) 
      .setContentTitle("Title") 
      .setContentText("Description") 
      .setContentIntent(pendingIntent) 
      .setSmallIcon(R.mipmap.ic_playlist_play_white_36dp) 
      .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.app_icon)) 
      .setOngoing(true); 

    startForeground(8000, builder.build()); 

    return (START_NOT_STICKY); 
} 

最后处理onTaskRemoved()onDestroy()

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    stopSelf(); 
} 

@Override 
public void onDestroy() { 
    stopForeground(true); // 'true' removes notification too 
} 

N.B.拨打stopSelf()将销毁该服务,然后stopForeground()将自动删除该通知。

最后,如果你想从一个活动手动停止服务,你可以简单地这样做:

Intent intent = new Intent(this, NotificationService.class); 
this.stopService(intent); 
+0

这是我需要的;部分唤醒锁不足以保持活动活动?,该应用程序的主要目标是播放来自远程http服务器的音频文件,只需在屏幕关闭时永久保持活动状态 –

+1

请参阅:http:// stackoverflow。 com/questions/9104622/android-foreground-service-vs-wakelock ...部分唤醒锁确保CPU唤醒来执行你的任务,并且前台服务确保你的应用的优先级不会在低内存中死掉 –

相关问题