API 17中的睡眠模式(批处理警报)中的Android Alarmmanager问题

时间:2016-10-26 19:15:27

标签: android alarmmanager sleep-mode

我遇到了这个问题,当设备处于睡眠模式(记录良好的问题)时发出警报的不一致,这让我发疯。

在我经常提醒的应用程序中,我使用alarmmanager设置下一个提醒的时间,当前一个提醒时。在大多数情况下,应用程序运行正常,但在我的ASUS TF300t(API 17)的睡眠模式下,警报会消失。

注册警报的代码:

            Intent i = new Intent(mContext, OnAlarmReceiver.class);
        i.putExtra(RReminder.PERIOD_TYPE, type);
        i.putExtra(RReminder.EXTEND_COUNT, extendCount);
        i.setAction(RReminder.CUSTOM_INTENT_ALARM_PERIOD_END);
        pi = PendingIntent.getBroadcast(mContext, (int)when, i, PendingIntent.FLAG_ONE_SHOT);

        if(buildNumber >= Build.VERSION_CODES.LOLLIPOP){
            AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(when, pi);
            mAlarmManager.setAlarmClock(alarmClockInfo,pi);
        } else if(buildNumber >= Build.VERSION_CODES.KITKAT){
            mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, when, pi);
        } else {
            mAlarmManager.set(AlarmManager.RTC_WAKEUP, when, pi);
        }

我的WakefulBroadcastReceiver类:

public class OnAlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
    int type = intent.getExtras().getInt(RReminder.PERIOD_TYPE);
    int extendCount = intent.getExtras().getInt(RReminder.EXTEND_COUNT);
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    Log.d("period type",""+type);
    Log.d("time",sdf.format(Calendar.getInstance().getTime()));
    Intent i = new Intent(context, PeriodService.class);
    i.putExtra(RReminder.PERIOD_TYPE, type);
    i.putExtra(RReminder.EXTEND_COUNT, extendCount);
    startWakefulService(context,i);

}

}

我正在观察的第一件事是警报批处理,当警报未按预期启动时,而是在下一个警报与第二个警报一起发生时启动。

另外一点是,当闹钟在睡眠模式下没有按时启动时,它会在我用电源按钮唤醒设备后立即熄灭。

我知道API 19和23(打盹模式)中警报行为的变化。我解决了使用setExact()在模拟虚拟设备中观察到的较新API的不精确问题。

我有两个物理安卓设备,这个TF300t平板电脑和Galaxy S3手机。而对于S3,这个问题很少发生,TF300t问题的一致性基本上使我的app无用。

所以我的问题是,我所描述的问题是否存在于所有API的许多设备上(这需要我寻找完全不同的解决方案),或者它们是设备或API特定的并且可以作为例外处理?

1 个答案:

答案 0 :(得分:0)

使用PowerManger解决此问题:

在服务中定义:

PowerManager powerManager;
PowerManager.WakeLock wakeLock;

现在在Service类中,在Oncreate Metod中添加:

powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NAME");

在startCommnd方法中,在开始工作之前添加:

wakeLock.acquire();

在您的服务类中添加:

@Override
    public void onDestroy() {
        wakeLock.release();
        this.isRun=false;
    }

最后,添加Manifest文件:

<uses-permission android:name="android.permission.WAKE_LOCK"/>