java– 为什么android(6.0)系统在深度睡眠约1小时后会绕过网络连接

java– 为什么android(6.0)系统在深度睡眠约1小时后会绕过网络连接,第1张

概述深度睡眠一小时后,我在安卓的深度睡眠模式下遇到麻烦.问题只发生在Android6上.在Android<5上,问题不会发生.未经Android5测试,因为没有设备可用.设备配置:我有两个Android6设备,谷歌Nexus5和HTCOneM9.两个设备都配置为仅Wifi(没有SIM卡),并且wifi策略配置为alywayson(即

深度睡眠一小时后,我在安卓的深度睡眠模式下遇到麻烦.
问题只发生在Android 6上.在Android< 5上,问题不会发生.未经AndroID 5测试,因为没有设备可用.设备配置:
我有两个AndroID 6设备,谷歌Nexus 5和HTC One M9.
两个设备都配置为仅Wifi(没有SIM卡),并且wifi策略配置为alyways on(即使在睡眠模式下).

情况:
我有一个唤醒的广播接收器,当应用程序进入后台时,它会在AlarmManager.ELAPSED_REALTIME_WAKEUP上注册,每2分钟触发一次.如果应用程序到达前台,当应用程序暂停并释放时,wifi锁定也是准确的.

由于AndroID KitKat AlarmManager.setRepeating(…)是不可取的,在AndroID 6上我使用AlarmManager.setwindow(…)只有1秒的窗口.
每次接收器触发时,接收器(PendingIntent)将再次重新注册.

接收器工作简单.他应该只调用weburl(获取请求).在请求成功,超时或抛出异常后释放唤醒锁.

在清单中,WAKE_LOCK权限也存在.

问题:
当我将应用程序置于后台(接收器变为启用状态)然后关闭屏幕时,接收器每2分钟正确调用一次,但在约1小时后网络请求失败.

日志显示接收器也在1小时后被调用,只有网络请求失败.

源代码示例:

public class TestTools {    private static final String LOG_TAG = TestTools.class.getSimplename();    public static String excuteGet(String targetURL) {        try {            URL obj = new URL(targetURL);            httpURLConnection con = (httpURLConnection) obj.openConnection();            con.setRequestMethod("GET");            con.setConnectTimeout(10*1000);            con.setReadTimeout(5*1000);            int responseCode = con.getResponseCode();            Log.d(LOG_TAG, "GET Response Code :: " + responseCode);            if (responseCode == httpURLConnection.http_OK) { // success                BufferedReader in = new BufferedReader(new inputStreamReader(con.getinputStream()));                String inputline;                StringBuilder response = new StringBuilder();                while ((inputline = in.readline()) != null) {                    response.append(inputline);                }                in.close();                // print result                Log.d(LOG_TAG, response.toString());                return response.toString();            } else {                Log.d(LOG_TAG, String.format("GET request not worked (response code :: %s)", responseCode));            }        }        catch (ProtocolException e) {            Log.d(LOG_TAG, "ProtocolException: " + e.getMessage());        }        catch (MalformedURLException e) {            Log.d(LOG_TAG, "MalformedURLException: " + e.getMessage());        }        catch (IOException e) {            Log.d(LOG_TAG, "IOException: " + e.getMessage());        }        return null;    }}public class Receiver extends WakefulbroadcastReceiver {    @OverrIDe    public voID onReceive(final Context context, final Intent intent) {        Log.d(LOG_TAG, "onReceive");        final Thread test = new Thread(new Runnable() {            @OverrIDe            public voID run() {                TestTools.excuteGet("http://www.Google.de/");            }        });        test.start();        try {            test.join();        } catch (InterruptedException e) {            Log.d(LOG_TAG, e.getMessage());        }        // here the receiver is reregistered        WakefulbroadcastReceiver.completeWakefulintent(intent);    }}

你知道出了什么问题以及如何解决它吗?

更新:要使应用程序使用AndroID打盹模式,您需要采用此https://developer.android.com/training/monitoring-device-state/doze-standby.html#assessing_your_app

解决方法:

but after ~1 hour the network request fails

据推测,该设备进入Doze mode.

Do you have an IDea what is going wrong

从用户的角度来看,从AndroID的角度来看,没有任何问题.一切都按预期工作.

请理解,专门添加了打盹模式,以防止开发人员执行您正在尝试的 *** 作.每两分钟进行一次网络I / O对电池寿命来说太糟糕了.太多开发人员不关心用户和那些用户的电池,因此AndroID正在控制那些开发人员,以帮助用户.

how to fix it?

在很大程度上,没有什么可以解决的.同样,一切都按照规范工作.您可能需要调整您的期望.

现在,如果用户认为用户希望允许您的应用消耗更多电量,则用户可以将您的应用添加到电池优化白名单.这是在设置>应用> (动作栏中的齿轮图标)> “忽略电池优化”.任何“忽略电池优化”设置的应用程序都会更像旧设备.

我们也欢迎用户将设备放在充电器上;充电时,设备不会进入打盹模式.

总结

以上是内存溢出为你收集整理的java – 为什么android(6.0)系统在深度睡眠约1小时后会绕过网络连接全部内容,希望文章能够帮你解决java – 为什么android(6.0)系统在深度睡眠约1小时后会绕过网络连接所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1111089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存