将来のイベントのリマインダーを設定するために使用できる小さなアプリケーションがあります。アプリは 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>
私はしばらくこれで立ち往生しているので、助けていただければ幸いです!