我正在运行服务后台,使用AlaramManager(setExactAndAllowWhileIdle)以一定间隔执行某些任务。如果连接电源充电器正在运行。但是,如果它被拔掉的设备电源有一些我将网络丢失到我的应用程序。
Alaram正在唤醒服务,即使设备闲置。但我的应用程序没有网络。
根据https://developer.android.com/training/monitoring-device-state/doze-standby.html#,当电话闲置时,它会限制网络。我通过应用手机闲置测试相同($ adb shell dumpsys battery unplug)
但即使手机处于空闲模式,也有可能获得对我的应用程序的网络访问。
申请不是Play商店。它真的适合建议。
答案 0 :(得分:1)
我在您正在运行的服务中使用PowerManager.isDeviceIdleMode()
来检测您是否处于Doze状态,如果是这样,只需调用250毫升的setAlarmClock()
方法(例如)和随机广播唤醒设备,它会完全从打瞌睡中醒来,因此将像往常一样获得网络访问权限。不利的一面是你失去了打瞌睡所带来的电池节省。:D如果它在你的情况下实际上是有用的,请将其标记为有用。
一旦您的服务(使用setExactAndAllowWhileIdle()
进行设置),您就可以:
private boolean isDeviceInDozeMode() {
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
return pm.isDeviceIdleMode();
所以现在你知道你是否在DOZE。
然后您可以设置AlarmClock并使用setAlarmClock(AlarmClockInfo a, PendingIntent p)
通过正常的网络访问,您已退出Doze。
注意:请记住,使用setExactAndAllowWhileIdle
并不意味着您的闹钟会在指定时间响起,它会比正常的set()
方法更早出现,但不是很准确(因为方法名称会建议)。一般来说,我的方式在调度方面并不完美,但一旦在设备上检测到它,它就会以编程方式退出DOZE。
如果您需要更多更新,请告诉我。
答案 1 :(得分:1)
我尝试了很多选项,但没有一个可行,但最后这对我有用。它可能对其他人有所帮助。 我们总是可以要求用户使用
让您的应用忽略电池优化功能PowerManager powerManager = (PowerManager)
getSystemService(Context.POWER_SERVICE);
Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
if (powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
}
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
并在清单中
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"></uses-permission>
但请记住,这可能会使您的应用未经Google Play批准
https://developer.android.com/training/monitoring-device-state/doze-standby.html#whitelisting-cases