1

私は次のものが欲しい:

  • AlarmManager は、真夜中に AppWidgetProvider に毎日のインテントを正確に送信します。
  • アラームはデバイスを起動する必要があります。

これが私がやった方法です:

私の AppWidgetProvider サブクラスでは:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    Log.d(LOG_TAG, "Widget Provider enabled.  Starting timer");

    //Setting the Calender object to midnight time.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 0);
    calendar.add(Calendar.MINUTE, 0);
    calendar.add(Calendar.HOUR, 0);

    //The fired Intent
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE); //custom intent name
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
        calendar.getTimeInMillis(), 1000*60*60*24, pendingIntent);
}

私は正しくやったと思いますが、このコードは動作しません!

テストするために、1000*60*60*24 を 10000 (10 秒) に変更し、ウィジェットの textView を乱数で更新しました。乱数は変更されませんでした。

どんな助けでも大歓迎です!

4

2 に答える 2

4

私はついに問題を見つけました!

AM_PM値も設定する必要があるようです。を使用してカレンダーを印刷するgetTime().toLocaleString()と、翌日に設定されましたが、12 時間後 (12:00:00 PM ) に設定されました。

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.AM_PM, Calendar.AM);
calendar.add(Calendar.DAY_OF_MONTH, 1);

これは、次の日の午前 0 時 (つまり、最も近い午前 0 時) にアラームを設定するCalenderインスタンスに最適なセットアップです。setRepeating()メソッドに渡すだけです。

ありがとう@CommonsWare

于 2012-07-25T00:58:42.543 に答える
2

まず、あなたが望むことは厳密には不可能です。Android は RTOS ではありません。「正確に真夜中に」制御できない場合があります

第 2 に、Calendarオブジェクトは過去の時間を表します (そのコードを実行している時刻が午前 0 時でない限り、現在を表します)。将来の開始時刻を試してください。

于 2012-06-01T22:43:58.940 に答える