Android应用中无法设置闹钟的启动时间如何解决

  介绍

这期内容当中小编将会给大家带来有关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应用中无法设置闹钟的启动时间如何解决