AlarmManager.setRepeatingへの複数の呼び出しは同じテント/ PendingIntent余分な値を提供しますが、私は別のものを供給しました

StackOverflow https://stackoverflow.com/questions/2844274

質問

この質問を書きながら解決が、投稿の場合には、それは誰に役立ちます:

私はidの異なる値で、このような複数のアラームを設定しています:

AlarmManager alarms = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
Intent i = new Intent(MyReceiver.ACTION_ALARM);  // "com.example.ALARM"
i.putExtra(MyReceiver.EXTRA_ID, id);  // "com.example.ID", 2
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p);  // 5 mins

...と、このようにそれらを受けます:

public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_ALARM)) {
        // It's time to sound/show an alarm
        final long id = intent.getLongExtra(EXTRA_ID, -1);

アラームが適切なタイミングで私の受信機に配信されますが、多くの場合、間違った値にEXTRA_IDセットで:それは私が、いくつかの点で私はその特定の時間に配信たかっただけではないものを使用していることを値です<。 / P>

役に立ちましたか?

解決

PendingIntent.getBroadcast()のドキュメントは言う:

  

を返します。

     

が与えられたパラメータに一致する既存または新規のPendingIntentを返します。

問題はエキストラが異なる2つのインテントは、この目的のために一致するように見えるということです。 (異なるgetBroadcast()で)いくつかのランダムな古いPendingIntentの代わりに、作成したばかりの意向私の周りに新しいものを返しますEXTRA_IDはそう。修正がウリのデータを供給することであり、それはこのように、IDとは異なります。

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));

あなたはその後、使用したID番号を取得することができます:

Long.parseLong(intent.getData().getSchemeSpecificPart());

...または、もちろんうまくとして余分を供給し、それを使用ます。

他のヒント

また、フラグを使用することができPendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

このべき作業あまりに

あなたの問題の解決策が使用されIntent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top