12

将来のイベントのリマインダーを設定するために使用できる小さなアプリケーションがあります。アプリは AlarmManager を使用して、ユーザーに通知する時間を設定します。アラームが鳴ると、BroadcastReceiver がこれを登録し、トーストとステータス バーの通知を介してユーザーに通知するサービスを開始します。

通知とトーストに正しい情報を表示するために、いくつかの追加情報がインテントと共に渡されます。リマインダーが初めて登録されるときに、BroadcastReceiver によって受信され、サービスに渡される情報は正しいものです。ただし、後続の各リマインダー (つまり、BroadcastReceiver によって受信された新しいインテントごと) では、送信される情報が異なっていても、この情報は同じままです。

例として、文字列「foo」が最初のインテントでエクストラとして配置された場合、「foo」は BroadcastReceiver によって正しく抽出されます。2 番目のインテントに「bar」が追加された場合でも、「foo」は BroadcastReceiver によって抽出されます。

これは、アラームを登録してインテントを渡すコードです (メインの ui クラス):

Intent intent = new Intent(ACTION_SET_ALARM);
intent.putExtra("desc", desc);
intent.putExtra("time", time);
intent.putExtra("dbId", dbId);
intent.putExtra("millis", millis);
PendingIntent pIntent = PendingIntent.getBroadcast(quickAlert.this, 0, intent, 0);

// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, millis, pIntent);

BroadcastReceiver クラスの onReceive() メソッド:

@Override
public void onReceive(Context context, Intent intent) {

    Intent i = new Intent(context, AlertService.class);

    String desc = intent.getStringExtra("desc").equals("") ? "": ": " + intent.getStringExtra("desc");
    String time = intent.getStringExtra("time");
    long dbId = intent.getLongExtra("dbId", -1);
    long millis = intent.getLongExtra("millis", -1);

    i.putExtra("desc", desc);
    i.putExtra("time", time);
    i.putExtra("dbId", dbId);
    i.putExtra("millis", millis);
    Log.d(TAG, "AlertReceiver: " + desc + ", " + time + ", " + dbId + ", " + millis);

    Toast.makeText(context, "Reminder: " + desc, Toast.LENGTH_LONG).show();
    context.startService(i);
}

マニフェストのインテント フィルター:

<receiver android:name=".AlertReceiver">
        <intent-filter>
            <action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" />
        </intent-filter>
    </receiver>

私はしばらくこれで立ち往生しているので、助けていただければ幸いです!

4

3 に答える 3

28

経由で作成するときに に追加FLAG_UPDATE_CURRENTしてみてください。PendingIntentgetBroadcast()

于 2009-10-04T18:59:56.823 に答える
9

上記の答えは正しいですが、説明が不足しています。保留中のインテントドキュメントのこの部分に注意する価値があります:

保留中のインテント自体は、システムが保持するトークンへの参照であり、トークンの取得に使用された元のデータを記述しています。...作成中のアプリケーションが後で同じ種類のPendingIntent(同じ操作、同じIntentアクション、データ、カテゴリ、コンポーネント、および同じフラグ)を再取得した場合、同じトークンを表すPendingIntentを受け取ります。

「余分な」データは、PendingIntent-identityの概念には特に含まれていないことに注意してください。

于 2011-08-10T01:03:37.650 に答える
5

このトピックで見つけた最高のリンク: http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example

これが手がかりです:

int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)
于 2015-05-18T12:06:35.443 に答える