3

「アラームが作動しました」というBroadcastReceiver電話AlarmReceiverがあります。5:45 と 17:30にトリガーToastする繰り返しを設定しようとしていますが、アプリを起動して数秒後に「アラームが機能しました」と表示されます。取得がすぐに送信されるのはなぜですか?PendingIntentAlarmReceiverPendingIntent

 public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Calendar cal1 = Calendar.getInstance();
        cal1.set(Calendar.HOUR_OF_DAY, 05);
        cal1.set(Calendar.MINUTE, 45);
        cal1.set(Calendar.SECOND, 00);

        Calendar cal2 = Calendar.getInstance();
        cal2.set(Calendar.HOUR_OF_DAY, 17);
        cal2.set(Calendar.MINUTE, 30);
        cal2.set(Calendar.SECOND, 00);

        Intent intent = new Intent(this, AlarmReceiver.class);

        PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent,      PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(),cal2.getTimeInMillis(), pi);


        Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

    }


}

アラーム受信者:

public class AlarmReceiver extends BroadcastReceiver {


        public void onReceive(Context context, Intent intent) {

            Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

}
4

2 に答える 2

9

しかし、アプリの起動から数秒後に「アラームが機能しました」と表示されます。

最初のアラームは正常に受信されていると思います。

しかし、あなたはそれが繰り返されていないと信じています。これは間違っています、それは繰り返されます... 〜43年ごとに1回. の 3 番目のパラメーターをsetRepeating間違って使用しています。次を試してください。

Calendar cal1 = Calendar.getInstance(); // Now
cal1.add(Calendar.SECONDS, 5); // Change to five seconds from now

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
        cal1.getTimeInMillis(), 
        10000, /* Repeat every 10 seconds */ 
        pi);

3 番目のパラメーターはintervalです。このコードは、5 秒で鳴り、10 秒ごとに繰り返されるアラームを作成します。使用cal2することで、誤って間隔をほぼ 43 年に設定しています。


2 つの異なるアラームを設定するには、次を使用します。

Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, 05);
cal1.set(Calendar.MINUTE, 45);
cal1.set(Calendar.SECOND, 00);

Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, 17);
cal2.set(Calendar.MINUTE, 30);
cal2.set(Calendar.SECOND, 00);

// Test if the times are in the past, if they are add one day
Calendar now = Calendar.getInstance();
if(now.after(cal1))
    cal1.add(Calendar.HOUR_OF_DAY, 24);
if(now.after(cal2))
    cal2.add(Calendar.HOUR_OF_DAY, 24);

// Create two different PendingIntents, they MUST have different requestCodes
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent morningAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
PendingIntent eveningAlarm = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, 0);

// Start both alarms, set to repeat once every day
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, morningAlarm);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, eveningAlarm);
于 2012-12-18T19:47:13.130 に答える
3

Sam の投稿にあるように、あなたは正しいtriggerAtMillisandを使用していませんintervalMillis。当日の午前 5 時にトリガーするように指示していると思いますが、これは過去の可能性が高く、その場合、ドキュメントには

Calendar cal1 = Calendar.getInstance();
cal1.add(Calendar.HOUR, 5);
cal1.add(Calendar.MINUTE, 45);

long interval = 17 * 60 * 60 * 1000; // 17 hours converted to milliseconds
interval += 30 * 60 * 1000; // 30 minutes converted to milliseconds

Intent intent = new Intent(this, TestAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), interval, pi);

おそらく代わりにやりたいことです。

編集(詳細説明):

cal1.add(Calendar.HOUR, 5);現在の日付と時刻を取得して 5 時間増加させるため、PendingIntentこの日付の現在の時刻から 5 時間 45 分後に繰り返しが開始されます。は、それから 17 時間 30 分ごとに 2 番目以降の s を送信するとinterval述べていますPendingItent(その後は 5 時間 45 分後です)。

開始時刻を午前 5 時 45 分に設定したいが、すぐには送信したくない場合 (たまたま午前 5 時 45 分になっている場合を除く)。次に、do を設定します。

cal1.set(Calendar.HOUR, 5);
cal1.set(Calendar.MINUTE, 45);
cal1.set(Calendar.SECOND, 0);

// Current time is after 5:45 am, don't start until tomorrow at 5:45
if (Calendar.getInstance().after(cal1))
    cal1.add(Calendar.DAY_OF_YEAR, 1)

または、その時点からの間隔を計算して、5:45 に既に開始されていると仮定して、次にいつトリガーされるかを決定することもできますが、計算にはもう少し手間がかかります。

于 2012-12-18T19:57:31.093 に答える