0

我有这个问题,即设备处于睡眠模式时启动警报不一致(有据可查的问题),这让我发疯。

在我的频繁提醒应用程序中,当上一个提醒发生时,我使用警报管理器设置下一个提醒的时间。在大多数情况下,应用程序运行良好,但在我的 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 的不精确问题。

我有两个物理 android 设备,这个 TF300t 平板电脑和 Galaxy S3 手机。虽然在 S3 上这个问题很少发生,但 TF300t 上的一致性问题基本上让我的应用程序毫无用处。

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

4

1 回答 1

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"/>
于 2016-10-27T11:14:33.707 回答