android闹钟程序后台运行,Android闹钟启动时间设置无效问题的解决方法

在Android开发中,遇到AlarmManager在5.0及以上系统启动时间设置无效的问题,主要原因是系统对重复闹钟的最小间隔做了限制。解决办法包括使用setExact方法替代setRepeating,以及针对5.0以上系统使用JobScheduler,并处理6.0以上设备的Doze模式。此外,当应用被Kill但服务未被Kill时,需要通过AIDL重新设置闹钟。
摘要由CSDN通过智能技术生成

Android开发中,alarmManager在5.0以上系统,启动时间设置无效的问题

做一个app,需要后台保持发送心跳包。由于锁屏后cpu休眠,导致心跳包线程被挂起,所以尝试使用alarmManager定时唤醒Service发送心跳包。

以下是开启alarmManager的代码

//开启轮询服务

public static void startPollingService(Context context,int seconds,Class> cls,String action) {

//获取AlarmManager系统服务

AlarmManager manager = (AlarmManager) context

.getSystemService(Context.ALARM_SERVICE);

//包装需要执行Service的Intent

Intent intent = new Intent(context,cls);

intent.setAction(action);

PendingIntent pendingIntent = PendingIntent.getService(context,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//触发服务的起始时间

long triggerAtTime = SystemClock.elapsedRealtime();

//使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service

manager.setRepeating(AlarmManager.ELAPSED_REALTIME,triggerAtTime,seconds * 1000,pendingIntent);

}

结果遇到了很奇怪的问题

传入的时间是2500,也就是每2.5秒一次

在红米1s (系统是CM12.1 android5.1.1)上,亮屏(非休眠)状态下它要好几十秒才会唤醒一次,锁屏(休眠)就不会唤醒了

在小米4(系统是MIUI7 android4.4.4)上,亮屏状态下正常,锁屏状态下就不会唤醒了

我尝试了BroadcastReceiver重写onReceive,也试过Service重写onStartCommand,都是一样的情况

原因是因为Android AlarmManagerService里面对于repeating alarm 做了限制。

注意:在19以上版本,setRepeating中设置的频繁只是建议值, 5.0 以上的源码中最小值是60s

class AlarmManagerService extends SystemService {

// Minimum alarm recurrence interval

private static final long MIN_INTERVAL = 60 * 1000; // one minute,in millis

void setImpl(int type,long triggerAtTime,long windowLength,long interval,PendingIntent operation,boolean isStandalone,WorkSource workSource,AlarmManager.AlarmClockInfo a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值