2

私のアプリでは、AlarmManagerクラスを使用してアラームを設定します。モバイルの再起動後にアラームをトリガーするには、 を使用しBroadcastReceiverました。すべて正常に動作し、定期的にアラームがトリガーされます。この場合、問題が発生します。

現在の時刻が午後 2 時 30 分で、アラームを午後 2 時 35 分に設定したとします。その後、携帯の電源を切ります。モバイルの電源を入れて 1 時間経っても、アラームが設定されている時刻としてアラームがポップアップしません。これは、現在の時刻がアラームを設定した時刻を超えているために発生しています。この問題を解決するには、どうすればよいですか。AlarmManagerクラスでアラームを設定するためのコードを投稿しました。これを解決するのを手伝ってください

public class AlarmReceiver extends BroadcastReceiver {
    @SuppressWarnings("static-access")
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            Intent myIntent = new Intent(context, MyAlarmService.class); 
            PendingIntent pendingIntent = PendingIntent.getService(context, i, myIntent, i);                            
            AlarmManager alarmManager = (AlarmManager)context.getSystemService(context.ALARM_SERVICE);
            Calendar calendar = Calendar.getInstance(); 
            calendar.setTimeInMillis(System.currentTimeMillis()); 
            calendar.add(Calendar.MILLISECOND, (int) Utilities.diff(NoteManager.getSingletonObject().getAlarmTime(i)));                 
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }
    }
}

public static long diff(Date date) {
    long difference = 0;
    try {
        // set current time
        Calendar c = Calendar.getInstance();
        difference = date.getTime() - c.getTimeInMillis();
        if (difference < 0) {
            // if difference is -1 - means alarm time is of previous time then current
            // then firstly change it to +positive and subtract form 86400000 to get exact new time to play alarm
            // 86400000-Total no of milliseconds of 24hr Day
            difference = difference * -1;
            difference = 86400000 - difference; 
        }
    } 
    catch (Exception e) {
        e.printStackTrace();
    }
    return difference;
}

マニフェスト ファイル内

<receiver android:name=".AlarmReciever">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
4

2 に答える 2

1

より良い方法は、そのアラームの詳細をデータベースに保存し、ブロードキャストレシーバーを介して起動時に取得することです。通知されたら、データベースから詳細を削除します。このようにして、すべてのアラームを追跡できます。起動時にサービスを開始してこの操作を行うこともできます

于 2012-07-06T09:15:13.430 に答える
1

Android のアラーム アプリも同じことを行います。携帯電話の電源がオフで、アラームを鳴らす必要がある場合、携帯電話のスイッチをオンにし、アラームを鳴らして、再びスリープ状態にします。

これは、アラーム アプリGit_Alarm アプリのソースのリンクです。ダウンロードして、これがどのように行われているかを確認できます。

アラームレシーバーで何か他のことをしている場合は、アラームを鳴らします。基本的に、電話の起動時にalarmrecieverを再度設定できます。電話の電源がオフになっている場合のアラームの問題に役立つ可能性がある1つの答えを次に示します

編集:- 1つのリンクが壊れていたので、それを置き換えました

于 2012-07-06T09:15:59.950 に答える