現在、サービスの開始時に通知バーに表示される通知を使用してフォアグラウンドサービスを作成しています。サービスが停止すると、通知は閉じられます。私の質問は、「すべての通知をクリア」または通知の却下(スワイプ)が発生したときにサービスを停止する方法はありますか?
通知の実装を含むように更新されました:
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;
}
ユーザーは、進行中のフォアグラウンドサービスによって生成された通知をスワイプして削除することはできません。
したがって、最初に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()
を呼び出します。 。
このコードは私のために働きます:
this.stopForeground(false);
mNotificationManager.cancel(NOTIFY_ID);
onStartCommandの戻り値を設定する必要があります。STRAT_STICKYはサービスを再起動します。
フォアグラウンドサービスの通知はクリアできません。唯一の方法はサービスを停止することです。
だから私はあなたが解決したい問題が決して起こらないと信じています。
私の質問は、「すべての通知をクリア」または通知の却下(スワイプ)が発生したときにサービスを停止する方法はありますか?
Notification
がクリアできるように設定されているとすると、 deleteIntent
はクリアされたときに呼び出す必要があります。これをgetBroadcast()
PendingIntent
に設定して、stopService()
を呼び出すマニフェストに登録されたBroadcastReceiver
を指すことができます。
作成した通知に設定できるdismissIntentがありますが、フォアグラウンドサービスの通知はクリアできないと思いましたか?
私は次のことをしました、そしてそれは私のために働きました:
フォアグラウンドサービスの通知で使用されるのと同じIDと通知チャネルでフォアグラウンドサービスを呼び出す前に通知を作成しました
通知IDで通知をキャンセルしました
必要な構造で別の通知を作成しました
フォアグラウンドサービスを停止せずに、この最後の通知を閉じるかスワイプできます