Android AlarmManager无法正常运行

时间:2016-07-16 13:23:42

标签: android alarmmanager android-broadcastreceiver

我正在使用我的应用程序上的警报管理器,我需要在凌晨2:00重置一些DefaultSharedPreferences值(设置为0)。 我的主要活动有一个函数,只要应用程序打开就会调用它:

protected void setUpAlarmManager(){ //To delete the data of each day and pass it to Records database
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        Intent intent  = new Intent(this, AlarmReceiver.class);
        PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent,  PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 02);
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 00);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pIntent); //set repeating every 24 hours
        Log.i("Set", "Alarm set");
    }

然后我使用BroadcastReceiver重置值。

package com.javierd.iifym;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.util.Log;

import com.javierd.iifym.sqlite.RecordsDataSource;

//To delete the data of each day and pass it to Records database
public class AlarmReceiver extends android.content.BroadcastReceiver {

    private RecordsDataSource dataSource;
    private Utils utils;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("Time", "TIMEEEE!!!!");
        SharedPreferences macros = context.getSharedPreferences(context.getPackageName() + "_preferences", Context.MODE_PRIVATE); //As we store data using DefaultSharedPreferences, not SharedPreferences
        SharedPreferences.Editor editor = macros.edit();
        editor.putString("eaten_carbs", "0");
        editor.putString("eaten_proteins", "0");
        editor.putString("eaten_fats", "0");
        editor.apply();
    }
}

接收器工作,问题是AlarmManager随机工作。虽然它应该是凌晨2点,也许您在16:00输入应用程序,保存一些值,在下次您在17:30输入时,值被删除,或者可能不是,这是随机的我不明白。

1 个答案:

答案 0 :(得分:2)

这种影响是由我相信使用AlarmManager.setInexectRepeating(int, long, long, PendingIntent)引起的。 根据{{​​3}}

  

您的闹钟首次触发不会在请求的时间之前,但是   在此之后几乎整整一段时间内可能不会发生。

当您使用此方法时,Android会同步多个不准确的重复警报并同时触发它们。考虑到间隔是一天,警报可能会在17:30发射。

如果警报需要在凌晨2点准确触发,那么我建议使用documentation方法。

请注意,建议尽可能避免使用准确的警报以减少电池消耗。

更新

我建议检查过去的触发时间是否为。

请你试试

protected void setUpAlarmManager(){ //To delete the data of each day and pass it to Records database
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        Intent intent  = new Intent(this, AlarmReceiver.class);
        PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent,  PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 2);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        if (Calendar.getInstance().after(calendar)) {
             calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pIntent); //set repeating every 24 hours
        Log.i("Set", "Alarm set");
    }