这期内容当中小编将会给大家带来有关Android应用中无法设置闹钟的启动时间如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
Android开发中,alarmManager在5.0以上系统,启动时间设置无效的问题
做一个应用程序,需要后台保持发送心跳包。由于锁屏后CPU休眠,导致心跳包线程被挂起,所以尝试使用alarmManager定时唤醒服务发送心跳包。
以下是开启alarmManager的代码
//开启轮询服务 公共静态孔隙startPollingService(上下文语境,int秒,Class<及# 63;在cls,字符串操作){//获取AlarmManager系统服务 AlarmManager经理=(AlarmManager)上下文 .getSystemService (Context.ALARM_SERVICE);//包装需要执行服务的意图 目的意图=new意图(上下文,cls); intent.setAction(行动); PendingIntent PendingIntent=PendingIntent。getService(上下文,0, 意图,PendingIntent.FLAG_UPDATE_CURRENT);//触发服务的起始时间 长triggerAtTime=SystemClock.elapsedRealtime ();//使用AlarmManger的setRepeating方法设置定期执行的时间间隔(秒秒)和需要执行的服务 manager.setRepeating (AlarmManager。ELAPSED_REALTIME triggerAtTime, 秒* 1000,pendingIntent); }
结果遇到了很奇怪的问题
传入的时间是2500年,也就是每2.5秒一次
在红米1 s(系统是CM12.1 android5.1.1)上,亮屏(非休眠)状态下它要好几十秒才会唤醒一次,锁屏(休眠)就不会唤醒了
在小4米(系统是MIUI7 android4.4.4)上,亮屏状态下正常,锁屏状态下就不会唤醒了
我尝试了BroadcastReceiver重写onReceive,也试过服务重写onStartCommand,都是一样的情况
原因是因为Android AlarmManagerService里面对于重复报警做了限制。
在19日以上版本,setRepeating中设置的频繁只是建议值,5.0以上的源码中最小值是60年代
类AlarmManagerService延伸SystemService {//最小报警复发间隔 私有静态最终长MIN_INTERVAL=60 * 1000;//> AlarmManager我=(AlarmManager) getActivity () .getSystemService (Context.ALARM_SERVICE); 如果(Build.VERSION。SDK_INT祝辞=Build.VERSION_CODES.KITKAT) { am.setExact (AlarmManager。RTC_WAKEUP, TimeUtils .stringToLong (recordTime TimeUtils.NO_SECOND_FORMAT),发送者); 其他}{ am.set (AlarmManager。RTC_WAKEUP, TimeUtils .stringToLong (recordTime TimeUtils.NO_SECOND_FORMAT),发送者); }
<强> 5.0以上的JobScheduler 强>
关于5.0新增JobScheduler·API可以先阅读这篇文章给您
在这里利用5.0以上的JobScheduler创建一个定时的任务,定时检测闹钟服务是否存在,没在存在则重新启动闹钟服务。(这里我设置每一分钟检测一次闹钟服务)
在进入应用程序的时候检测当前系统是否是5.0以上,如果是则启动JobScheduler这个服务。代码如下:
。SDK_INT祝辞=Build.VERSION_CODES.LOLLIPOP) { mJobScheduler=(JobScheduler) getSystemService (Context.JOB_SCHEDULER_SERVICE); JobInfo。Builder构建器=new JobInfo.Builder (JOB_ID 新ComponentName (getPackageName (), JobSchedulerService.class.getName ())); 构建器。setPeriodic (60 * 1000);//每隔60秒运行一次 builder.setRequiresCharging(真正的); builder.setPersisted(真正的);//设置设备重启后,是否重新执行任务 builder.setRequiresDeviceIdle(真正的); 如果(mJobScheduler.schedule (builder.build ()) & lt;=0) {//如果出现错误 } }
其中的builder.setPersisted(真正的);方法是设备重启后,是否重新执行任务,在这测过是可以重新启动任务的。
上面的操作进一步保证了闹钟服务被扼杀掉后,重新启动服务。但是在6.0以上引入了瞌睡模式,当6.0以上的手机进入这个模式后,便会使JobScheduler停止工作。
<强> 6.0以上打瞌睡模式的处理强>
为了让JobScheduler可以在6.0以上进入打瞌睡模式工作,这里针对6.0以上的瞌睡模式做特殊的处理,忽略电池的优化。
1)。在Manifest.xml中加入权限
2)。在设置闹钟的时候,判断系统是否是6.0以上,如果是,则判断是否忽略电池的优化。判断是否忽略电池优化代码如下:,
@TargetApi (Build.VERSION_CODES.M) 公共静态布尔isIgnoringBatteryOptimizations(活动活动){ 字符串packageName=activity.getPackageName (); PowerManager点=(PowerManager)活动 .getSystemService (Context.POWER_SERVICE); 如果(pm.isIgnoringBatteryOptimizations (packageName)) { 返回true; 其他}{ 返回错误; } }Android应用中无法设置闹钟的启动时间如何解决