AlarmManager不起作用

时间:2016-03-27 18:51:17

标签: java android alarmmanager reboot

我有一个警报管理员。它必须每天工作一次。如果我从任务中删除应用程序或重启设备,则必须存在警报。但是当我重新启动设备时,警报不存在。如果我从任务中删除应用程序,则也不存在警报。

MainActivity:

@Override
    protected void onResume() {
             if (isAlarmEnableded) {
            if (!isAlarmSheduled) {
                setAlarm();
                isAlarmSheduled = true;
              putInSharedPreferences(Boolean.toString(isAlarmSheduled));
            }
        } else {
            cancelAlarm(MainActivity.this);
            isAlarmSheduled = false;
            putInSharedPreferences(isAlarmSheduled);
        }

        super.onResume();
    }

isAlarmEnableded - SwitchPreference = true。如果isAlarmEnableded - 我关闭闹钟。 isAlarmSheduled - 我在偏好设置中保存的值。它显示警报状态

 private void setAlarm() {

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.setAction(Constants.ALARM_INTENT);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                Constants.PENDINGINTENT_REQUEST_CODE, intent, 0);

        if (android.os.Build.VERSION.SDK_INT >= 19) {
            alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, setAlarmTime(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
        } else {
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setAlarmTime(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
        }

private long setAlarmTime() {

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());

        calendar.set(Calendar.HOUR_OF_DAY, 20);
        calendar.set(Calendar.MINUTE, 48);
        calendar.set(Calendar.SECOND, 0);

        if (System.currentTimeMillis() > calendar.getTimeInMillis()) {
            calendar.add(Calendar.DAY_OF_YEAR, 1);
        }
        return calendar.getTimeInMillis();
    }

如果当前时间>那个节目的时间,我为明天设置了警报。

Constants.ALARM_INTENT - “com.blabla.AlarmReceiver”。

AlarmReceiver

@Override
    public void onReceive(Context context, Intent intent) {
        intent.setClass(context, NotificationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

NotificationActivity在闹钟时显示一个对话框。 我还有一个DeviceBootReceiver,它调用setAlarm()方法并将isAlarmScheduled放入首选项中。 的清单

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name="com.mypackage..AlarmReceiver">
            <intent-filter>
                <action android:name="com.blabla.AlarmReceiver" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.mypackage.DeviceBootReceiver">

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

我正在adb shell dumpsys alarm > dump.txt检查闹钟。我需要一个稳定的警报,在所有情况下每天工作一次。如果我关闭应用程序并重新启动它,警报应该是相同的 警报适用于所有情况,但不是在我重启设备时以及从任务中删除应用程序时。 Maby我的代码包含一些错误。帮助我解决我的问题,因为我不知道我做错了什么/谢谢

2 个答案:

答案 0 :(得分:0)

启动设备后,您必须处理启动接收器以初始化警报,例如:

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         List<Note> notes = dbHelper.getAllNotesAlarms();
    for (Note note : notes) {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(note.getAlarm());
        Intent intent = new Intent(App.getAppContext(), AlarmService.class);
        intent.putExtra("NOTE_ID", note.getId());
        PendingIntent pendingIntent = PendingIntent.getService(App.getAppContext(),
                (int) note.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am =
                (AlarmManager) App.getAppContext().getSystemService(Activity.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                pendingIntent);
    } 
    }

}

答案 1 :(得分:0)

你应该添加启动完成接收器,而不是再次设置你的警报 指南http://www.learn-android-easily.com/2013/07/bootcompleted-broadcastreceiver-in.html