2012-10-23 13 views
11

私の通知をクリアすると、私のサービスの変数をリセットしたいと思う:それだけだ!どのように削除通知を使用してクリア通知で何らかのアクションを実行する方法

void onClearPressed(){ 
    aVariable = 0; 
} 

:私はちょうどこのようなものを必要としながら、私は誰もが私の通知に対する削除の意図を追加することをお勧めしていることがわかりますが、意図が活動を開始するために使用され、どのようなOサービスの周り探し

この結果を得るには?

答えて

39

通知はあなたのアプリによって管理されておらず、通知を表示してクリアするようなことは、実際には別のプロセスで起こっています。セキュリティ上の理由から、別のアプリでコードを直接実行させることはできません。

あなたの場合の唯一の可能性は、通常のインテントの周りを包み込み、通知がクリアされたときにあなたのアプリのために開始されるPendingIntentを提供することです。 ブロードキャストを送信したり、サービスを開始してから、ブロードキャストレシーバまたはサービスで必要な操作を行うには、PendingIntentを使用する必要があります。正確に何を使用するかは、通知を表示するアプリケーションコンポーネントによって異なります。

ブロードキャストレシーバの場合、ブロードキャストレシーバ用の匿名の内部クラスを作成し、通知を表示する前に動的に登録することができます。それは次のようになります:

public class NotificationHelper { 
    private static final String NOTIFICATION_DELETED_ACTION = "NOTIFICATION_DELETED"; 

    private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      aVariable = 0; // Do what you want here 
      unregisterReceiver(this); 
     } 
    }; 

    public void showNotification(Context ctx, String text) { 
     Intent intent = new Intent(NOTIFICATION_DELETED_ACTION); 
     PendingIntent pendintIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0); 
     registerReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION)); 
     Notification n = new Notification.Builder(mContext). 
      setContentText(text). 
      setDeleteIntent(pendintIntent). 
      build(); 
     NotificationManager.notify(0, n); 
    } 
} 
+1

私はintentServiceでこれを試しています。例外の受信側の受信者がリークしました。 "unregisterReceiverへの電話がありませんか?"誰もそれに光を投げることができますか? – Yasir

+3

Receiverを登録および登録解除するには、参照されていないコンテキストからコールする必要があります。そのため、intentServiceのgetApplicationContext()を使用すると問題が解決されます。 – smora

+1

ユーザーが通知を却下したときにアプリケーションが強制終了される可能性があるため、静的受信者(AndroidManifestに登録されているなど)を登録することをおすすめします。スタティックレシーバは、アプリケーションがすでに停止していてもコードが実行されるようにします。 – pepyakin

関連する問題