一段时间后,AlarmManager被取消

时间:2020-01-24 22:56:27

标签: java android broadcastreceiver alarmmanager android-pendingintent

我正在编写我的第一个应用程序,我试图在每天的特定时间触发一条通知,该通知会报告一些信息。 首先,我创建了以下类,该类用于在重新启动后重新启动警报并从主应用程序启动警报(只需重用一段代码即可)。

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'命令,它实际上显示了我的警报正在正确运行,因此,在这一点上,我认为问题出在其他方面,但我不明白。

0 个答案:

没有答案