如何跟踪胭脂警报?

时间:2018-02-05 07:12:32

标签: java android alarmmanager jodatime android-alarms

我在Android中有这个应用程序版本,它在特定时间(例如晚上10点)每天通知用户。我没有使用setRepeating,因为不推荐来自21岁以上的高级API。以下是我用来重置警报的伪代码。

AlarmController (set alarm)
Once time was met send to alarm receiver
Alarm receiver would call the Alarm Controller and Increase the day by 1 and set it again 
At the same time Alarm receiver will fire up the Intentservice for notification and set notified **true** in DataBase

从理论上说它应该有效。我在这里使用Joda Time轻松地将这一天增加了1.但问题是,通知随机时间点火,有时它会在最后一次启动后启动6,或者最常见的是每1小时或者30分钟我不明白。现在我提供的伪代码是基本代码。在我的真实代码中,我有两个警报,一个用于启动通知并将Notified设置为 true ,另一个用于将通知重置为false 一旦改变了一天。

我的应用已发布。我从未预料到这种情况会发生,因为我调试它的方式是在 genymotion ,我手动移动时间,一切似乎都正常。我不得不在Fabric IO上启动日志,但似乎只有在出现错误时才会显示日志。感谢任何人

以下是我使用的最低限度代码:

警报控制器

public static void setAdaptiveReminder(Context context, long ALARM_ID, DateTime dateTime, boolean shouldsetAlarm) {
        Intent myIntent = new Intent(context, AdaptiveReminderReceiver.class);
        myIntent.putExtra("reminder", shouldsetAlarm);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, (int) ALARM_ID, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        ALARMMANAGER = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Log.d(TAG, "setAdaptiveReminder: " + dateTime.toLocalTime().toString() + "  " + dateTime.toLocalDate().toString());

        CrashUtility.LogErrorReportToFabric(TAG + " setAdaptiveReminder", dateTime.toLocalTime().toString() + " " + dateTime.toLocalDate().toString());

        if (Utility.GetBuildVersion() >= 19 && Utility.GetBuildVersion() < 23) { // if lollipop
            //ALARMMANAGER.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + 5000,1000,pendingIntent);

            ALARMMANAGER.setExact(AlarmManager.RTC_WAKEUP, dateTime.toDate().getTime(), pendingIntent);
            //ALARMMANAGER.setRepeating(AlarmManager.RTC_WAKEUP,dateTime.toDate().getTime(), AlarmManager.INTERVAL_DAY,pendingIntent);

        } else if (Utility.GetBuildVersion() >= 23 || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //Log.d(TAG, "setTimeSinceLastUseReminder:  android M and UP");
            ALARMMANAGER.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, dateTime.toDate().getTime(), pendingIntent);
            //ALARMMANAGER.setrep(AlarmManager.RTC_WAKEUP,dateTime.toDate().getTime(), AlarmManager.INTERVAL_DAY,pendingIntent);
        }
}

AlarmPresenter

public void setAdaptiveReminder() {
        //AlarmController.setAdaptiveReminder(context,778,d);

        DateTime dateTime = TimeUtility.SetCorrectTimeInCorrectDate(settingsRepository.getAdaptiveReminderTime());
        boolean isNotified = settingsRepository.isNotifiedReminder();

        //Toast.makeText(context, "" + dateTime.toLocalTime().toString(), Toast.LENGTH_SHORT).show();

        Log.d(TAG, "setAdaptiveReminder: gggfss " + TimeUtility.DateIsToday(dateTime) + "  " + dateTime.toLocalTime().toString());
        Log.d(TAG, "setAdaptiveReminder: " + isNotified);
        if (TimeUtility.DateIsToday(dateTime) && !isNotified) {
            dateTime = dateTime.plusDays(1);
            CrashUtility.LogErrorReportToFabric(TAG + " setAdaptiveReminder", dateTime.toLocalTime().toString() + " " + dateTime.toLocalDate().toString());
            AlarmController.setAdaptiveReminder(context, 778, dateTime, true);
            Log.d(TAG, "setAdaptiveReminder:  " + dateTime.toLocalDate() + "   " + dateTime.toLocalTime().toString());
        }
}

接收机

public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        this.context = context;

        alarmControllerPresenter = new AlarmControllerPresenter(context,settingsRepository,habitRepository);
        alarmControllerPresenter.setAdaptiveReminder();

}

所以我提供的代码与我每天用来设置闹钟的代码完全相同。我只是做了一些清理工作,这就是它。

0 个答案:

没有答案