Android 如果应用程序在后台运行,则失去网络安卓6及以上版本

Android 如果应用程序在后台运行,则失去网络安卓6及以上版本,android,service,android-service,android-doze,Android,Service,Android Service,Android Doze,我正在运行service background,以使用AlamManager(setExactAndAllowHileId)以一定的间隔执行一些任务。如果连接了电源充电器,则表明其正在运行。但如果它的设备电源拔掉一些后,我就失去了我的网络应用程序 Alaram正在唤醒服务,即使设备处于空闲状态。但我的应用程序没有网络 由于它限制了手机空闲时的网络。我在应用手机空闲时也做了同样的测试($adb shell dumpsys battery Unlock) 但是,即使手机处于空闲模式,也有可能访问我的

我正在运行service background,以使用AlamManager(setExactAndAllowHileId)以一定的间隔执行一些任务。如果连接了电源充电器,则表明其正在运行。但如果它的设备电源拔掉一些后,我就失去了我的网络应用程序

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

由于它限制了手机空闲时的网络。我在应用手机空闲时也做了同样的测试($adb shell dumpsys battery Unlock)

但是,即使手机处于空闲模式,也有可能访问我的应用程序


应用程序不属于play store。这真的很适合作为建议。

我在您运行的服务中使用了
PowerManager.isDeviceIdleMode()
来检测您是否在打瞌睡,如果是这样,只需调用
setAlarmClock()
方法(例如250毫秒)和随机广播来唤醒设备,它将完全从睡梦中醒来,从而可以像往常一样访问网络。不利的一面是,您失去了打瞌睡时节省的电池电量D请将此标记为有用,如果它在您的案例中实际有用。 一旦您的服务(使用
setExactAndAllowHileIDLE()
进行设置),您就可以:

private boolean isDeviceInDozeMode() {
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
return pm.isDeviceIdleMode();
所以现在你知道你是不是在打瞌睡

然后,您只需设置AlarmClock并使用
setAlarmClock(AlarmClockInfo a,PendingEvent p)

你可以正常上网,不再打瞌睡了

注意:请记住,使用
setExactAndAllowHileIDLE
并不意味着您的警报将在指定时间发出,它将比正常的
set()
方法发出得更快,但并不精确(如方法名称所示)。一般来说,我的方法在调度方面并不完美,但一旦在设备上检测到它,它确实会以编程方式退出DOZE


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

我尝试了许多选项,但都不起作用,但最终对我有效。这可能对其他人有所帮助。 我们可以随时要求用户让你的应用忽略电池优化功能

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批准


我们如何使用PowerManager.isDeviceIdleMode()服务来检测电话打盹模式以及在何处设置alaram。如果不可以,请发送spinet代码如果我的服务在此之后执行,我会安排下一次运行,比如说,在设备处于休眠状态时60分钟(设置ExactAndAllowHileId)即可访问网络。如何处理这个场景。在我的回答中添加了更多信息,请查看并让我知道您是否需要更多信息。我有一些场景1。我的AlarmManager将启动Intentserverice,然后以同样的方式完成下一次的服务任务和报警计划。2.在第一种情况下,在运行服务时,我可能会丢失网络;在第二种情况下,在完成服务后,可能会出现间隔1小时,我也可能会丢失间隔中的网络。3.如果是在服务期间,调用isDeviceInDozeMode()随时检查,因为我们断开网络时从不拒绝。如果下次启动警报唤醒服务器如果没有网络如何检查。5.setAlarmClock用于设置闹钟或服务器以及使用位置。抱歉英语不好。请验证您的答案。这是避免打瞌睡的方法。当然有谷歌游戏的限制,但如果后台任务需要互联网,我想没有其他选择。