如何取消前台服务使用通知(轻扫解除)或清除所有通知?

时间:2012-10-13 10:25:12

标签: android android-service android-notifications

我正在创建一个前台服务,其中包含服务启动时通知栏中显示的通知。如果服务停止,通知将解除。我的问题是,当“清除所有通知”或解除通知(滑动)时,有没有办法停止服务?

更新以包含通知的实施:

public int onStartCommand(Intent intent, int flags, int startId)
{   
    Log.d(CLASS, "onStartCommand service started.");

    if (getString(R.string.service_start_action) == intent.getAction())
    {
        Intent intentForeground = new Intent(this, ServiceMain.class)
            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);    
        PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intentForeground, 0);      
        Notification notification;
        Notification.Builder builder = new Notification.Builder(getApplicationContext())
            .setSmallIcon(android.R.drawable.btn_star)
            .setTicker("Service started...")
            .setContentIntent(pendIntent)
            .setDefaults(Notification.DEFAULT_ALL)
            .setOnlyAlertOnce(true)
            .setOngoing(false);
        notification = builder.build();
        notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;

        startForeground(SERV_NOTIFY, notification);
        player.start();
    }
    else
    {
        Log.d(CLASS, "onStartCommand unable to identify acition.");
    }

    return START_STICKY;        
}

6 个答案:

答案 0 :(得分:22)

不允许用户滑动正在进行的前台服务生成的通知。

因此,stopForeground(false)首先允许用户之后刷新通知(至少在Lollipop +上)。对于pre-Lollipop,您可能必须stopForeground(true)停止前景并删除通知,然后使用notificationManager.notify(yourNotificationID, yourNotificationObject)重新发出通知,以便您的通知可见但可以刷卡。

至关重要的是,设置通知对象,其中包含当用户将其滑动时触发的删除意图。

(new NotificationCompat.builder(this).setDeleteIntent(deletePendingIntent)).build()

其中deletePendingIntent类似于

Intent deleteIntent = new Intent(this, YourService.class);
deleteIntent.putExtra(someKey, someIntValue);
PendingIntent deletePendingIntent = PendingIntent.getService(this,
someIntValue, 
deleteIntent, 
PendingIntent.FLAG_CANCEL_CURRENT);

当用户将其滑动时,其额外的意图将传递给服务。在onStartCommand内处理已发送的额外内容,即检查intent != nullintent.getExtras() != null,然后从给定someKey的附加内容包中提取值,如果它与someIntValue匹配,然后拨打stopSelf()

答案 1 :(得分:5)

无法清除foregraound服务的通知。唯一的办法是停止服务。

所以我相信你想要解决的问题,永远不会发生。

答案 2 :(得分:5)

此代码适用于我:

this.stopForeground(false);
mNotificationManager.cancel(NOTIFY_ID);

并且您应该设置onStartCommand的返回值,STRAT_STICKY将重新启动您的服务。

答案 3 :(得分:4)

  

我的问题是,当“清除所有通知”或解除通知(滑动)时,有没有办法停止服务?

假设您的Notification已设置为允许清除the deleteIntent,则应在清除时调用{{3}}。您可以将其设置为getBroadcast() PendingIntent,指向调用BroadcastReceiver的清单注册stopService()

答案 4 :(得分:0)

我做了以下工作,对我有用:

  1. 我在调用前台服务之前创建了一个通知,该通知具有与前台服务的通知相同的ID和Notification Channel

  2. 我已通过通知ID取消了通知

  3. 我用您需要的结构创建了另一个通知

  4. 您可以在不停止前台服务的情况下关闭或滑动最后一条通知

答案 5 :(得分:-1)

您可以在创建的通知中设置dismissIntent,但我认为前台服务通知无法清除?