如果应用程序在后台运行,则松开网络android 6及更高版本

时间:2017-04-26 20:53:25

标签: android service android-service android-doze

我正在运行服务后台,使用AlaramManager(setExactAndAllowWhileIdle)以一定间隔执行某些任务。如果连接电源充电器正在运行。但是,如果它被拔掉的设备电源有一些我将网络丢失到我的应用程序。

Alaram正在唤醒服务,即使设备闲置。但我的应用程序没有网络。

根据https://developer.android.com/training/monitoring-device-state/doze-standby.html#,当电话闲置时,它会限制网络。我通过应用手机闲置测试相同($ adb shell dumpsys battery unplug)

但即使手机处于空闲模式,也有可能获得对我的应用程序的网络访问。

申请不是Play商店。它真的适合建议。

2 个答案:

答案 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