从最近的应用程序窗口刷掉应用程序时取消通知

时间:2016-10-10 16:56:52

标签: android

我正在开发一个必须始终处于活动状态的应用程序,它将用于专门用于该应用程序的设备。

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

问题是,如果应用程序被杀,通知不会消失,我在我的活动的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

1 个答案:

答案 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);