25

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

更新以包括通知的实施:

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;        
}
4

6 回答 6

37

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

因此,stopForeground(false)首先,它允许用户在此后(至少在 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 != null,,intent.getExtras() != null然后从给定的额外捆绑包中提取值someKey,如果匹配someIntValue,则调用stopSelf().

于 2016-03-01T11:24:15.960 回答
8

这段代码对我有用:

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

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

于 2016-07-09T09:53:01.560 回答
5

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

假设你Notification的设置允许它被清除,deleteIntent它被清除时应该被调用。您可以将其设置为getBroadcast() PendingIntent,指向一个清单注册BroadcastReceiver的调用stopService().

于 2012-10-13T11:57:13.993 回答
5

无法清除前台服务的通知。唯一的方法是停止服务。

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

于 2012-10-13T10:47:53.003 回答
0

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

于 2012-10-13T10:43:45.100 回答
0

我做了以下事情,它对我有用:

  1. 我在调用前台服务之前创建了一个通知,它使用了与前台服务的通知一起使用的相同 id 和通知通道

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

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

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

于 2019-11-11T12:08:06.697 回答