Android 6.0新特性之 Doze 和 App Standby模式

来源:互联网 发布:linux etc init.d 编辑:程序博客网 时间:2024/05/16 10:17

Android在6.0推出了 Doze 和 App standby模式,这个其实是大家早就关注的问题,Google推出只是早晚的问题,

原因如下:

1.手机电池越来越大,电量越来越多,但是手机电池越来越不经用,

2.Android的手机应用过多过杂,根本没有办法管理,应用的功能乱用,严重消耗了不必要的电量

3.IOS其实一直是这个机制的,虽然实现略有区别,但是IOS的效果还是很好的。

基于以上原因,Google重要在  6.0版本根据自己的情况推出了两种模式来省电了,可见Android 6.0在电量方面肯定会有较大提升的,尤其是在待机的时候。


再来介绍一下这两个是什么,

首先Doze 和 App standby虽然Google是放在一起提出来的,但是这是两个不同的东西

Doze:是针对系统而言的,可以理解为一种模式。当手机在某种条件下会进入该模式,并且会触发一些特性,并且在某种条件下退出该模式。

首先介绍一下何种条件会触发(&&)基本上所有都程序员都是到&&的意思吧,就是说下面的条件必须豆瓣出,才会触发进入该模式

•用户不操作设备一段时间
•屏幕关闭
•设备未连接电源充电


再来看一下触发哪些特性:

•系统试图通过限制应用程序访问网络和CPU密集型服务节省电池
•防止应用程序访问网络,推延应用程序的工作,同步,和标准的警报
•系统定期提供一个短暂的时间让应用程序完成延迟的工作活动,在这个时间片里,系统将提供维持性窗口应用程序访问网络,运行在等待的同步,工作,和报警等活动。

这里字比较多,解释一下关键的字,所谓 CPU密集型服务,就是指播放音乐啊,录音啊这些服务,但是比较奇怪的是,我测试音乐播放器的时候,并没有受到影响。稍后会给大家介绍如何测试我们的应用。
再就是第三条的什么意思,这就上个图来瞅瞅


看到了吧,这个橙色的部分就是系统提供的让各个应用执行特定任务的时间,随着手机进入Doze模式的时间加上,间隔时间会越来越长。

到这里你可能觉得我讲的也太笼统了,这你三个到底是什么啊,那好,下面我就来具体一下,看看应用的哪些行为会收到限制

•网络连接会被禁止
•Wake Lock会被屏蔽
•AlarmManager定时任务延迟到下一个maintenancewindow进行处理,除非使用AlarmManager提供的方法:setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()
•系统将不扫描热点WIFI
•同步工作将被禁止
•不允许JobScheduler进行任务调度
这回清晰啦吧,

下面介绍何种条件会退出(||)||的含义不需要我多说啦吧,不懂的我也就建议你不要在程序界混了

•用户唤醒移动装置,打开屏幕
•设备连接电源

到这里Doze模式就介绍完了,下面介绍一下App standby模式

App Standby:这个概念则是针对于应用的,当App进入AppStandby状态后,也会受到网络等状态的限制

老套路,继续介绍进入条件和退出条件吧,至于其他的和Doze 模式的某些条件是相同的,

进入条件

  • 当用户不触摸使用应用程序一段时间时,该应用程序处于AppStandby状态,系统将把该App标志为空闲状态

退出条件

  • 用户主动启动该App
  • 该App当前有一个前台进程(或包含一个活动的前台服务,或被另一个activity或前台service使用)
  • App生成一个用户所能在锁屏或通知托盘看到的Notification
  • 而当用户设备插入电源时,系统将会释放App的待机状态,允许他们自由的连接网络及其执行未完成的工作和同步。如果设备空闲很长一段时间,系统将允许空闲App一天一次访问网络。

总结

最后在总结一下Doze模式与App Standby模式的区别

  • Doze模式需要屏幕关闭(通常晚上睡觉或长时间屏幕关闭才会进入)
  • App Standby不需要屏幕关闭,App进入后台一段时间也会受到连接网络等限制。

说了这么多,最终还是为了使用,因为这个实现是系统来做的,我们在开发应用时,了解如何让我们 的应用正常工作就好啦,

那么我们应用可以i 做什么呢?

1.实时通信可以采用GCM,

2.除了GCM,Android6.0及更高版本还提供了Doze模式白名单列表,通过设置应用程序进入白名单列表可逃脱Doze模式的network和partial wake locks。

至于第一个这个肯定会收到影响的,但是这个解决方案,对于大陆来说,还是没有什么鸟用的,那么我们重点看一下第二种吧,

第二种有两种方法:

第一个是App程序可发送action为ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS的intent引导用户进入设置界面将应用程序设置进白名单列表里。

第二个就是使用AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限来触发一个系统对话来让用户添加到白名单里,而无需进入设置界面去设置。

首先来介绍第一种(终于可以上代码了,文字真心不是我的强项啊):

 Intent ignore = new Intent();  ignore.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); this.startActivity(ignore);
就这么简单,看看启动的页面吧


在这个页面中目前显示的是为优化的应用,就是在白名单中的应用,我们可以选择所有应用,然后点进去,将我们应用设置成不优化就加入白名单了

第二种方法就简单的多啦

首先在AndroidManifest中加入以下权限

<android:uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
然后在需要加入白名单的地方加入如下代码:

 Intent ignore = new Intent(); ignore.setData(Uri.parse("package:"+this.getPackageName())); ignore.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); this.startActivity(ignore);
然后就会弹出

然后点击是就会把我嗯自己的应用加入白名单了。这种方式很简单吧,

最后介绍一下如何测试我们的应用在Doze模式和App Standby模式时能否正常工作吧。

  • Android 6.0的设备
  • 安装应用
  • 运行应用,保持活跃
  • 关闭屏幕
  • adb shell dumpsys battery unplug
  • $ adb shell dumpsys deviceidle step
  • 输入第二条命令直到设备状态返回Idle,此时设备进入Doze模式

  • $ adb shell dumpsys battery unplug
  • $ adb shell am set-inactive <packageName>true
  • 此时应用进入App Standby模式
到这里就介绍结束了,快来看看你的应用在Doze模式下是否能正常工作吧



0 0
原创粉丝点击