2

ユーザーに薬の服用を思い出させる通知があります。たとえば、午後 9 時と午後 9 時 1 分に薬を服用する新しい時刻を追加すると、最後の通知のみがアクティブになります。これが私のコードです:

AddTime.java: (一部)

Cursor cursor2 = sqdb.rawQuery("SELECT Name FROM Medicine WHERE _id = " + mId, null);
        while(cursor2.moveToNext()) {
            med = cursor2.getString(cursor2.getColumnIndex("Name"));
        }  //med - Name of medicine

        String sql = "SELECT _id FROM Time WHERE mId = "+mId+" AND Year = "+year+" AND Month = '"+_month+"' AND Day = "+_numDay+" AND Week = '"+_week+"' AND Hour = "+_hour+" AND Minute = "+_min+" AND AMORPM = '"+_ampm+"' AND CalendarDate = '"+calDate+"'";
        Cursor cursor = sqdb.rawQuery(sql, null);
        int tId = 0;
        while(cursor.moveToNext()) {
            tId = cursor.getInt(cursor.getColumnIndex("_id"));
        } //Unique id for notification

        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        Intent _intent = new Intent(this, TimeAlarm.class);
        _intent.putExtra("TIMEID", tId);
        _intent.putExtra("MEDNAME", med);
        Calendar c = Calendar.getInstance();
        int Years = c.get(Calendar.YEAR);
        int Months = c.get(Calendar.MONTH);
        int Days = c.get(Calendar.DAY_OF_MONTH);
        int Hours = c.get(Calendar.HOUR_OF_DAY);
        int Minutes = c.get(Calendar.MINUTE);

        GregorianCalendar curDate = new GregorianCalendar(Years, Months, Days, Hours, Minutes, 0);
        GregorianCalendar nextDate = new GregorianCalendar(year, Month, _numDay, _hour, _min, 0);

        long millisecDiff = nextDate.getTimeInMillis() - curDate.getTimeInMillis();

        PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, _intent, PendingIntent.FLAG_ONE_SHOT);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisecDiff, pIntent);

TimeAlarm.java

public class TimeAlarm extends BroadcastReceiver {

 NotificationManager nm;


 @SuppressWarnings("deprecation")
@Override
 public void onReceive(Context context, Intent intent) {
  nm = (NotificationManager) context
    .getSystemService(Context.NOTIFICATION_SERVICE);
  int timeid = intent.getExtras().getInt("TIMEID");
  String medname = intent.getExtras().getString("MEDNAME");
      CharSequence from = "Title";
  CharSequence message = "Message";
  PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
    new Intent(), 0);
  Notification notif = new Notification(R.drawable.icon,
    "Text", System.currentTimeMillis());
  notif.setLatestEventInfo(context, from, message, contentIntent);
  nm.notify(timeid, notif);
 }
}
4

1 に答える 1

3

リクエスト コードとして知られる PendingIntent.getBroadcast の 2 番目のパラメータは、新しいアラームごとに一意である必要があります。そうしないと上書きされます。ドキュメントには、この requestCode は現在使用されていないと記載されています。ドキュメントが間違っています。

あなたが持っている

PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, _intent, PendingIntent.FLAG_ONE_SHOT); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisecDiff, pIntent);

あなたが欲しいのは

PendingIntent pIntent = PendingIntent.getBroadcast(this, SomeUniqueIndex, _intent, PendingIntent.FLAG_ONE_SHOT); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisecDiff, pIntent);

于 2013-09-11T20:46:54.337 に答える