6

私はこのコードを持っています

Calendar c = new GregorianCalendar();
        c.add(Calendar.DAY_OF_YEAR, 1);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 22);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        // We want the alarm to go off 30 seconds from now.
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 30*1000;
        long a=c.getTimeInMillis();

        // Schedule the alarm!
        AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                c.getTimeInMillis(), 1*60*60*1000, sender);

23:22hには実行されません

私が間違っていることは何ですか?firstTime と c.getTimeInMillis() のサイズと長さが大きく異なることに気付きました。私は firstTime を使っているので、30 秒に設定するとアラームがうまく実行されます。

4

3 に答える 3

11

AlarmManager.ELAPSED_REALTIME_WAKEUPフラグを使用していますが、Calendar オブジェクトを使用しています。この 2 つのことは両立しません。

AlarmManager.RTCを使用するか、CalendarまたはAlarmManager.RTC_WAKEUPDate オブジェクト (1970 年からのミリ秒) を使用してアラーム時刻を指定する場合に使用する必要があります。

AlarmManager.ELAPSED_REALTIMEまたはを使用AlarmManager.ELAPSED_REALTIME_WAKEUPしてアラーム時刻を指定しますSystemClock.elapsedRealtime()(電話が起動してからのミリ秒)。

于 2010-06-07T21:09:25.190 に答える
8

次の hh:mm の発生に対してのみアラームを設定する場合は、次のコードで成功しました。

Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY, 22);
    cal.set(Calendar.MINUTE, 19);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    //check if we want to wake up tomorrow
    if (System.currentTimeMillis() > cal.getTimeInMillis()){
        cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ...
    }
于 2010-09-02T22:22:21.340 に答える
4

今から 30 秒後にアラームを鳴らすには、

Calendar cal = Calendar.getInstance();

現在の時刻を取得し、次に

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender); 

編集:

問題は ELAPSED_REALTIME_WAKEUP だと思います。これは、AlarmManager に、与えている時間がシステムの起動からの時間に基づいていることを伝えます。これは今から 30 秒間は問題ありませんが、リアルタイムに基づくようにしたい場合は、RTC または RTC_WAKEUP を使用する必要があります。これらのタイプの完全な説明については、javadocを参照してください。

于 2010-06-07T20:35:24.827 に答える