我正在编写我的第一个应用程序,我试图在每天的特定时间触发一条通知,该通知会报告一些信息。 首先,我创建了以下类,该类用于在重新启动后重新启动警报并从主应用程序启动警报(只需重用一段代码即可)。
public class SetAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
startReminderService(context);
}
public void checkServiceRunning(Context context) {
Intent reminderIntent = new Intent(context, AlarmReceiver.class);
reminderIntent.setAction("MyReminder");
// I check if a reminder is already active
boolean reminderActive = (PendingIntent.getBroadcast(context, REMINDER_SERVICE,
reminderIntent,
PendingIntent.FLAG_NO_CREATE) != null);
Log.d("test", "The reminder is active?" + reminderActive);
if (!reminderActive) {
startReminderService(context);
}
}
public void startReminderService(Context context) {
Calendar serviceNotificationTime = Calendar.getInstance();
serviceNotificationTime.set(Calendar.HOUR_OF_DAY, 9);
serviceNotificationTime.set(Calendar.MINUTE, 0);
serviceNotificationTime.set(Calendar.SECOND, 0);
Intent reminderIntent = new Intent(context, AlarmReceiver.class);
reminderIntent.setAction("MyReminder");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
REMINDER_SERVICE,
reminderIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager serviceAlarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
serviceAlarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
serviceNotificationTime.getTimeInMillis(),
AlarmManager.INTERVAL_DAY,
pendingIntent);
if (pendingIntent != null) {
Log.d("test", "Background service set up and running.");
} else {
Log.d("test", "Failed to set up background service!");
}
}
}
之后,我用以下几行更新了清单:
<receiver
android:name="com.mycompany.myapp.services.SetAlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name="com.mycompany.myapp.services.AlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="MyReminder" />
</intent-filter>
</receiver>
到目前为止,一切正常。手机重新启动后,提醒会正确重新启动,并且(如果提醒时间已过去)会立即触发。
AlarmReceiver类如下:
public class AlarmReceiver extends BroadcastReceiver {
private Context ctx;
@Override
public void onReceive(Context context, Intent intent) {
this.ctx = context;
remindStuff();
}
private void remindStuff() {
....
some code
....
// I check if the alarm is still on (probably awful, since it just fired)
SetAlarmReceiver setAlarmReceiver = new SetAlarmReceiver();
setAlarmReceiver.checkServiceRunning(ctx);
}
}
我使用相同的方法从主要活动中检查警报是否打开:
private void checkServicesRunning() {
SetAlarmReceiver setAlarmReceiver = new SetAlarmReceiver();
setAlarmReceiver.checkServiceRunning(getApplicationContext());
}
一切对我来说似乎都是正确的,我已经尝试过找到的所有解决方案,在StackOverflow上阅读了诸如此类的大量问题,但我仍然不明白我在做什么错。 警报在系统触发BOOT_COMPLETED之后立即正确触发,并且在我刚刚启用警报时正确触发(仅当通知时间是过去的时间-例如,当它是晚上10点并且警报必须在上午9点触发)。 当checkServiceRunning方法运行时,它告诉我该警报已启用(在Logcat中返回true),但是当我关闭该应用程序并过一会儿重新运行它时,该警报看起来像已被取消,并由重新创建。该应用程序。
有任何提示吗?
谢谢。
编辑:我尝试了'adb shell dumpsys alarm'命令,它实际上显示了我的警报正在正确运行,因此,在这一点上,我认为问题出在其他方面,但我不明白。