1

アラームを実装しようとしているため、アプリには 2 つのアクティビティがあります。メインのアクティビティ (ユーザーがアラームを設定する場所) と、アラームが実際にトリガーされたときに表示される「呼び出し中」のアクティビティです。AlarmManager が「呼び出し中」ウィンドウを呼び出すようにインテントを送信する方法は次のとおりです。

public void scheduleAlarm(View view) {
    Intent intent = new Intent(this, WakeUp.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent wakeUp = PendingIntent.getActivity(this, 123, intent, 0);
    AlarmManager alarmManager = (AlarmManager) this.getSystemService(this.ALARM_SERVICE);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calculateMillis(), wakeUp); // setExact is pretty much made for setting alarms anyway
}

private long calculateMillis() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, hour);
    cal.set(Calendar.MINUTE, minute);
    cal.set(Calendar.SECOND, 0);
    return cal.getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
}

私のマニフェストには、次のものがあります。

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".WakeUpWithMath"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".WakeUp"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/title_activity_wake_up"
        android:theme="@style/FullscreenTheme" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>

    </activity>
</application>

私はそれを複数回テストし、calculateMillis の異なる値 (30000 を返すように嘲笑されても) を使用してテストしましたが、結果は常に同じです。呼び出した直後にalarmManager.setExact「呼び出し中」のアクティビティが表示され、最初は時間が経過するのを待ちません。

私は何を逃したのですか?マニフェストの構成が間違っていませんか? <receiver>タグを使用する必要がありますか? もしそうなら、どのように設定すればよいですか?

4

1 に答える 1

3

setExact相対時間ではなく、絶対時間を使用します。cal.getTimeInMillis()現在の時刻を減算せずに、によって返された時刻を使用します。

于 2015-04-22T23:36:46.377 に答える