6

AlarmManager を使用して、イベントの日時にイベントの通知を表示します。しかし、イベントが更新されたときに、AlarmManager が PendingIndent をアプリに送信する時間を更新するにはどうすればよいでしょうか?

イベントが作成されると、次のコードが呼び出されます。

public void setOneTimeAlarm() {
        Intent intent = new Intent(this, TimerReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
                intent, PendingIntent.FLAG_ONE_SHOT);

        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month);
        c.set(Calendar.DAY_OF_MONTH, day-1);
        c.set(Calendar.HOUR_OF_DAY, 18);
        c.set(Calendar.MINUTE, 00);

        long date = c.getTimeInMillis();

        mAlarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
    }

呼び出されるインデントは TimerReciver です。

@Override
     public void onReceive(Context context, Intent intent) {
         Log.v("TimerReceiver", "onReceive called!");
         Intent notificationIntent = new Intent(context, ListTests.class);
            PendingIntent contentIntent = PendingIntent.getActivity(context,
                    123, notificationIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

            NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

            Resources res = context.getResources();
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

            long[] pattern = {0,300};

            builder.setContentIntent(contentIntent)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
                        .setTicker(res.getString(R.string.app_name))
                        .setWhen(System.currentTimeMillis())
                        .setAutoCancel(true)
                        .setVibrate(pattern)
                        .setContentTitle(res.getString(R.string.notification_title))
                        .setContentText(res.getString(R.string.notification_text));
            Notification n = builder.build();

            nm.notify(789, n);
     }
4

1 に答える 1

8

私は解決策を見つけました..getBroadcast(Context context, int requestCode, Intent intent, int flags)ドキュメンテーションが言っている場合でも、への2番目の引数が違いを生むことがわかりました

requestCode送信者のプライベート リクエスト コード (現在は使用されていません)。

イベントごとにリクエスト ID が使用されると、アラームが更新され、イベントごとにアラームが作成されます。

これは、2 つの異なる要求コードを使用すると、filterEquals(Intent)が false になるためです。のドキュメントは次のようにAlarmManager set(...)述べています。

時間が過去に発生した場合、アラームはすぐにトリガーされます。このインテントのアラームがすでにスケジュールされている場合 (2 つのインテントが によって定義されている場合、そのアラームは filterEquals(Intent))削除され、このインテントに置き換えられます。

にも変更PendingIntent.FLAG_ONE_SHOTしましたPendingIndent.FLAG_CANCEL_CURRENT

于 2013-05-31T08:45:09.240 に答える