10

私は人々に彼らの仕事をするように思い出させるアプリを持っています。したがって、PendingIntentが1つあり、ユーザーは必要なときにアラームを削除できます。このコードでは、複数のユーザーアラームに対してPendingIntentが1つしかないため、インテントエクストラがある特定のアラームをキャンセルすることに混乱してい"pill"ます。残りのアラームはキャンセルしないでください。私にはこの問題についての手がかりがありません。私がはっきりしていることを願っています。ありがとう

Intent intent = new Intent(this, AlarmNotifyReceiver.class);
intent.putExtra("Name_pill", "pill");
sender = PendingIntent.getBroadcast(this,
DatabaseConstants.NOTIFICATION_ID + 1, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), sender);
updateTheFlag(pillName[(pillName.length-1)]);
4

5 に答える 5

13

Android のドキュメントによると、アラームを停止するにはIntent、同じデータで を作成する必要がありますが、必ずしも同じエクストラを作成する必要はありません。

public void cancel (PendingIntent 操作)

インテントが一致するアラームをすべて削除します。Intent が this > one ( filterEquals(Intent)で定義) と一致する、任意のタイプのアラームはキャンセルされます。

filterEquals(Intent)

public boolean filterEquals (Intent other)

インテントの解決 (フィルタリング) のために、2 つのインテントが同じかどうかを判断します。> つまり、それらのアクション、データ、タイプ、クラス、およびカテゴリが同じである場合。これは、インテントに含まれる余分なデータを比較しません。

于 2011-08-28T08:36:14.097 に答える
5

コメントで述べたように、まったく同じ PendingIntent オブジェクトを再作成し、同じ Extras を入れるだけでよいようです。次に、あなたは電話します

am.cancel(sender);

そして、特定のアラームをキャンセルする必要があります。個人的には、それを行うより良い方法を見つけることができません。この情報を見つけて、他の場所での私の期待を確認しました。

それは読みます:

アラームの繰り返しを停止するには、アラームをキャンセルする必要があります。AlarmManager は、インテントが作成されるのと同じインテント クラスを必要とする cancel() メソッドを提供します。これでアラームを解除できます。

alarmManager.cancel(pendingIntent);

pendingIntent オブジェクトは同じオブジェクトである必要はないことに注意してください。アラームの作成中は、アクション、クラス、カテゴリなどのインテント フィールドが同じである必要があります。インテントは、アラームを識別してキャンセルするために使用されます。

これは繰り返しアラームのコンテキストにありますが、間違っていなければ、1 回限りのアラームも同じようにキャンセルする必要があります。私は仕事中なので、自分でこれ以上徹底的にテストすることはできませんが、これでうまくいくはずです。

于 2010-12-03T14:35:58.123 に答える
1

requestCodeパラメータgetBroadcast()について言及する必要があると思います。指定されたインテントに一致するすべてのアラームがキャンセルされることに同意します。ただし、キャンセル用のPendingIntentを定義するときに一意のrequestCodeを使用することで、アラームを一意にすることができます。したがって、同じインテントrequestCodeを持つアラームのみがキャンセルされます。

int TIMER_1 = 1;
int TIMER_2 = 2;
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, AppReciever.class);
i.putExtra("timer", "one");
PendingIntent pending = PendingIntent.getBroadcast(this, TIMER_1, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pending);

次に、これに従って PendingIntent が存在することを確認します。

PendingIntent pending1 = PendingIntent.getBroadcast(this, TIMER_2, i, 
                PendingIntent.FLAG_NO_CREATE);
boolean alarmUp = (pending1 != null);

alarmUpfalseになります(FLAG_NO_CREATE が存在しない場合、新しいものを作成しないように使用されることに注意してください)。同じrequestCodeで試してください:

PendingIntent pending2 = PendingIntent.getBroadcast(this, TIMER_1, i, 
                PendingIntent.FLAG_NO_CREATE);
alarmUp = (pending2 != null);

alarmUptrueになりますが、新しいインテントで試してみると、別のエクストラが含まれています。

Intent i2 = new Intent(this, AppReciever.class);
i2.putExtra("timer", "two");
pending2 = PendingIntent.getBroadcast(this, TIMER_1, i2, 
                PendingIntent.FLAG_NO_CREATE);
alarmUp = (pending2 != null);

alarmUpとは同じですが、余分なものは同じii2あるため、このアラームを削除できます。

am.cancel(pending2);
于 2013-02-26T15:25:27.947 に答える
0

したがって、保留中のインテントが 1 つあり、ユーザーは必要に応じてアラームを削除できます。このコードでは、複数のユーザー アラームに対して保留中のインテントが 1 つしかないため、エクストラがピルである特定のアラームをキャンセルすることに混乱しています。

intent.putExtra("Name_pill", "pill");

保留中のインテントをキャンセルするために余分なものは機能しません。

pendingIntent.cancel()同じでトリガーされた保留中のインテントのみを削除しfilterEquals(Intent) 、そのメソッドはインテントに与えられた余分なデータを比較しません。

これは、Android の開発者サイトからのコンテンツです。filterEquals(Intent)

インテントの解決 (フィルタリング) のために、2 つのインテントが同じかどうかを判断します。つまり、アクション、データ、タイプ、クラス、およびカテゴリが同じである場合です。これは、インテントに含まれる余分なデータを比較しません。

あなたのシナリオを考えると、その時点でそれをインテントに渡すとき 、パラメーターで指定されExtraたものに一意の ID を保存するだけで済みます。ID は一意でなければならないことに注意してください。sharedpreference

そして、そのアラームをキャンセルする場合は、その保存された ID で同じインテントを渡し、それをキャンセルしpendingintentます。

作成

preference_saved_value =  DatabaseConstants.NOTIFICATION_ID + 1
sender = PendingIntent.getBroadcast(this,
preference_saved_value, intent,
PendingIntent.FLAG_UPDATE_CURRENT)

キャンセル

sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent,PendingIntent.FLAG_UPDATE_CURRENT);  
sender.cancel()
于 2013-04-06T06:48:20.753 に答える
0

Android のドキュメントに記載されているように、Intent.filterEquals に従って同等であるが異なるリクエスト コードを持つ意図を持つ保留中の意図は、異なるものと見なされます。

複数の個別の PendingIntent オブジェクトを同時にアクティブにする必要がある場合 (両方が同時に表示される 2 つの通知として使用する場合など)、それらに異なるものを関連付けるために、それらに異なるものがあることを確認する必要があります。保留中のインテント。これは、Intent.filterEquals によって考慮される Intent 属性のいずれか、または getActivity(Context, int, Intent, int)、getActivities(Context, int, Intent[], int)、getBroadcast(Context, int) に提供されるさまざまなリクエスト コード整数である可能性があります。 、Intent、int)、または getService(Context, int, Intent, int)。

したがって、別のリクエスト コードを割り当てて、それらに基づいて保留中のインテントをキャンセルし、余分なものを忘れることができます。

この動作を理解した興味深いシナリオがありました。

コードでアラームをスケジュールし、デバイスで実行しましたが、キャンセルしませんでした。次に、リクエスト コードを変更して、もう一度実行しました。そのため、新しいアラームが作成されました。新しいアラームをキャンセルしましたが、アラームは以前のコードからまだ実行されていました。アラームがキャンセルされない理由がわかりません。リクエストコードが異なる前のコードからのものであることがわかった後、アプリをアンインストールして再度インストールすると、問題は解決しました。

于 2013-07-07T19:27:57.013 に答える