2

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

即使设备空闲,警报也会唤醒服务。但我的应用程序没有网络。

根据https://developer.android.com/training/monitoring-device-state/doze-standby.html# 它在手机空闲时限制网络。我在应用手机空闲时进行了同样的测试($ adb shell dumpsys battery unplug )

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

应用程序不是游戏商店。它真的适合建议。

4

2 回答 2

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

于 2017-05-01T17:55:28.267 回答
1

我已经PowerManager.isDeviceIdleMode()在您的运行服务中使用来检测您是否处于打瞌睡状态,如果是这样,只需调用setAlarmClock()250 毫秒(例如)和随机广播的方法来唤醒设备,它将完全从打瞌睡中唤醒,因此将像往常一样获得网络访问权限。不利的一面是你失去了打瞌睡带来的电池节省.. :D 如果它实际上对你有用,请将此标记为有用。一旦你的服务(设置setExactAndAllowWhileIdle())你可以去:

private boolean isDeviceInDozeMode() {
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
return pm.isDeviceIdleMode();

所以现在你知道你是否在打瞌睡。

然后你可以设置闹钟并设置它setAlarmClock(AlarmClockInfo a, PendingIntent p)

并且您没有打瞌睡,可以正常访问网络。

注意:请记住,使用setExactAndAllowWhileIdle并不意味着您的闹钟会在指定时间响起,它会比正常set()方法更早响起,但并不准确(正如方法名称所暗示的那样)。一般来说,我的方式在调度方面并不完美,但一旦在设备上检测到它,它就会以编程方式退出 DOZE。

如果您需要更多更新,请告诉我。

于 2017-04-27T13:02:10.637 回答