2012-10-13 30 views
7

現在、サービス開始時に通知バーに表示される通知付きのフォアグラウンドサービスを作成しています。サービスが停止すると、通知は拒否されます。私の質問は、「すべての通知をクリア」または通知(スワイプ)の解除が発生したときにサービスを停止する方法はありますか?通知の実装を含むように更新フォアグラウンドサービスをキャンセルして通知を使用(スワイプ解除)する方法、またはすべての通知をクリアする方法はありますか?

:私はフォアグラウンドサービス通知をクリアすることができないと思ったのに

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;   
} 
+0

Googleのこのサンプルをご覧ください:https://github.com/googlesamples/android-ActiveNotifications。これは、却下された通知だけでなく、通知グループ全体をリッスンする方法を示しています。 –

+0

私が知る限り、通知を作成せずにフォアグラウンドサービスを「作成」することはできません。 Androidはこれを必要とします。なぜなら、ユーザーは知らないうちにシーンの背後でサービスを実行したくないからです。アクティビティが破棄され、フォアグラウンドで実行されているサービスが通知を受け取ったときに通知を削除するだけでは、単にキャンセルすることはできません。通知をキャンセルするには、 '.stopForeground(true)'コールを使用してフォアグラウンドサービス自体をキャンセルする必要があります。ブール値のパラメータは、通知とともにフォアグラウンドを停止するかどうかを示します。 –

答えて

0

あなたが作成した通知に設定することができdismissIntentは、ありますか?

+0

'dismissintent'がありますか?そのAPI仕様はどこですか? –

+0

@IgorGanapolsky NotificationCompat.Builder#setDeleteIntent(...) – Dogcat

+0

@Dogcat apiのどこにでも** dismissIntent **が表示されません。 –

4

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

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

3

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

あなたNotificationは、それがクリアされたときにthe deleteIntentが呼び出されるべきで、それをクリアすることができるように設定されると仮定すると。これをgetBroadcast()PendingIntentに設定し、stopService()を呼び出すマニフェスト登録BroadcastReceiverをポイントすることができます。

+0

これは私の初期のアプローチですが、サービスの通知が通知バーに表示されると、「すべての通知をクリア」ボタンがなく、スワイプを無効にするように見えます。 –

+0

@moncadad:質問を編集し、「通知」を作成しているコードを投稿し、ここにコメントして投稿したことを知らせてください。通知実装を含むように – CommonsWare

+0

が更新されました。 –

6

進行中のフォアグランドサービスのによって生成された通知をユーザーがスワイプすることはできません。

したがって、stopForeground(false)が最初に通知されます。通知は、その後(少なくともLollipop +では)ユーザーがスワイプすることができます。プレLollipopの場合は、stopForeground(true)にする必要があります。これにより、フォアグラウンドが停止して通知が削除され、notificationManager.notify(yourNotificationID、yourNotificationObject)で通知が再発行され、通知は表示されますがスワイプ可能になります。

重要な点として、通知オブジェクトをユーザーがスワイプしたときにトリガーされる削除インテントで設定します。

deletePendingIntent

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

のようなもので、ユーザーがそれを離れてスワイプすると、その余分なとの意図がサービスに配信されます。

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

intent != null,intent.getExtras() != nullを確認して、someKeyのエキストラバンドルから値を抽出し、someIntValueと一致する場合は、stopSelf()に電話して、onStartCommandの範囲内で処理してください。

+0

startForeground(false)を使用する必要がありましたが、私のNotificationBuilderコードから.setOngoing(true)への呼び出しを削除する必要もありました – caitoo0o

1

このコードは私の作品:

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

、あなたはonStartCommandのあなたの戻り値を設定する必要があり、STRAT_STICKYはあなたのサービスを再起動します。

関連する問題