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 +では)。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

フォアラウンドサービスの通知はクリアできません。唯一の方法はサービスを停止することです。

だから私はあなたが解決したい問題を信じています、決して起こりません。

于 2012-10-13T10:47:53.003 に答える
5

私の質問は、「すべての通知をクリア」または通知の却下(スワイプ)が発生したときにサービスを停止する方法はありますか?

をクリアNotificationできるように設定されているとすると、クリアさdeleteIntentたときにを呼び出す必要があります。これをに設定して、を呼び出すgetBroadcast() PendingIntentマニフェスト登録済みを指すことができます。BroadcastReceiverstopService()

于 2012-10-13T11:57:13.993 に答える
0

作成した通知に設定できるdismissIntentがありますが、フォアグラウンドサービスの通知はクリアできないと思いましたか?

于 2012-10-13T10:43:45.100 に答える
0

私は次のことをしました、そしてそれは私のために働きました:

  1. フォアグラウンドサービスの通知で使用されるのと同じIDと通知チャネルでフォアグラウンドサービスを呼び出す前に通知を作成しました

  2. 通知IDで通知をキャンセルしました

  3. 必要な構造で別の通知を作成しました

  4. フォアグラウンドサービスを停止せずに、この最後の通知を閉じるかスワイプできます

于 2019-11-11T12:08:06.697 に答える