我正在开发一个必须始终处于活动状态的应用程序,它将用于专门用于该应用程序的设备。
我已经读过,为了不让应用程序被我需要设置持续通知的操作系统杀死,我还应用了部分唤醒锁。
问题是,如果应用程序被杀,通知不会消失,我在我的活动的onCreate
方法中调用此方法
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());
我调用的onDestroy
方法
notificationManager.cancelAll();
super.onDestroy();
通知永远不会被删除,我必须卸载应用程序才能将其杀死,有没有办法在未加载应用程序时将其删除?
编辑:我的目标是API 19
答案 0 :(得分: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);