我有一个警报管理员。它必须每天工作一次。如果我从任务中删除应用程序或重启设备,则必须存在警报。但是当我重新启动设备时,警报不存在。如果我从任务中删除应用程序,则也不存在警报。
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我的代码包含一些错误。帮助我解决我的问题,因为我不知道我做错了什么/谢谢
答案 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