14

ユーザーが通知をクリアしたときにサービスの変数をリセットしたい:それだけです!

周りを見回すと、誰もが私の通知に削除インテントを追加することを提案していることがわかりますが、インテントは、次のようなものが必要なときに、アクティビティやサービスを開始するために使用されます。

void onClearPressed(){
   aVariable = 0;
}

この結果を得る方法は?

4

2 に答える 2

45

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

あなたの場合の唯一の可能性は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);
    }
}
于 2012-10-23T12:00:14.340 に答える
1

アンドレイは正しいです。
次のような複数のメッセージを返したい場合:

  • メッセージがクリックされたかどうかを知りたい
  • キャッチしたいアイコンが付いたアクションを添付しました
  • そして、メッセージがキャンセルされたかどうかを知りたい

これらの各応答フィルターを登録する必要があります。

public void showNotification(Context ctx, String text) ()
{
    /… create intents and pending intents same format as Andrie did../
    /… you could also set up the style of your message box etc. …/

    //need to register each response filter
    registerReceiver(receiver, new IntentFilter(CLICK_ACTION));
    registerReceiver(receiver, new IntentFilter(USER_RESPONSE_ACTION));
    registerReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION));

    Notification n = new Notification.Builder(mContext)
      .setContentText(text)
      .setContentIntent(pendingIntent)                          //Click action
      .setDeleteIntent(pendingCancelIntent)                     //Cancel/Deleted action
      .addAction(R.drawable.icon, "Title", pendingActionIntent) //Response action
      .build();

    NotificationManager.notify(0, n);

}

次に、if、elseステートメント(Andreiが行ったように)、またはswitchステートメントを使用してさまざまな応答をキャッチできます。

注:私は主にこれをどこにも見つけられなかったためにこの応答を行い、自分でそれを理解する必要がありました。(おそらく私はそれをよりよく覚えているでしょう:-)楽しんでください!

于 2019-07-22T17:29:13.753 に答える