2017-04-26 48 views
0

我正在运行服务后台以使用AlaramManager(setExactAndAllowWhileIdle)以某个间隔执行某些任务。如果其连接的充电器正在运行。但是,如果它在我的应用程序丢失网络之后拔掉了设备电源。如果应用程序在背景中运行,松动网络android 6及更高版本

Alaram唤醒服务甚至设备闲置。但我的应用程序没有网络。

https://developer.android.com/training/monitoring-device-state/doze-standby.html#其限制时,手机idle.I测试一样与申请电话空闲时($亚行外壳dumpsys电池拔下)

但是否有任何可能让我的应用程序,甚至电话网接入网络是空闲模式。

应用程序不是Play商店。它真的被拨给了建议。

回答

1

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

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

所以,现在你知道你在打盹与否。

然后,你可以设置的AlarmClock与setAlarmClock(AlarmClockInfo a, PendingIntent p)

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

让我知道你是否需要更多更新。

+0

我们如何使用PowerManager.isDeviceIdleMode()进行服务检测手机打盹模式以及设置位置alaram。如果你不能发送spinet代码 – Sri

+0

如果我的服务执行后,我安排下一次运行可以说60分钟(setExactAndAllowWhileIdle)的时间,如果设备打盹可以获得网络访问。如何处理这种情况。 – Sri

+0

在我的回答中增加了更多信息,请回顾并让我知道你是否需要更多信息。 –

0

我尝试了很多选择,但都没有工作,但最后这对我有用。它可能有助于其他人。 我们可以随时要求的用户,让你的应用程序中使用

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> 

忽略电池优化功能,但要记住,这可能使您的应用程序不是由谷歌批准的播放

https://developer.android.com/training/monitoring-device-state/doze-standby.html#whitelisting-cases

相关问题