我遇到了这个问题,当设备处于睡眠模式(记录良好的问题)时发出警报的不一致,这让我发疯。
在我经常提醒的应用程序中,我使用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特定的并且可以作为例外处理?
答案 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"/>