Android手机锁屏后网络连接暂停

4
我正在开发一个应用程序,它可以在后台定期使用NETWORK_PROVIDER获取位置,而无需使用GPS_PROVIDER。我正在使用ALARM_SERVICEWakeLock (PARTIAL_WAKE_LOCK)。但我遇到的问题是,当屏幕关闭时,互联网连接会断开。当我解锁手机时,我开始收到位置信息,但是当屏幕关闭时,我无法获取位置。
这是因为:
  1. 屏幕关闭后,互联网连接被暂停了,当我解锁屏幕时,我会收到数据使用的USSD代码消息,这是否意味着我的互联网连接在屏幕关闭时也断开了?
  2. 即使互联网连接正常,由于屏幕处于关闭状态,位置信息也无法在后台更新。
我正在使用GpsTracker类从这里获取位置,并使用AlarmManager定期获取位置。在LatLongBroadcastReceiver类中,我正在获取位置。
Intent intent = new Intent(GPSlatlongActivity.this,
                    LatLongBroadcastReceiver.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

pendingIntent = PendingIntent.getBroadcast(
        GPSlatlongActivity.this.getApplicationContext(), 0, intent,
        PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime(),
        (AlarmManager.INTERVAL_FIFTEEN_MINUTES / 15),
        pendingIntent);

你是在真实设备上测试吗?一些用于节省电池的应用程序,如JuiceDefender,在屏幕锁定时会关闭移动互联网。请检查设备中是否安装了此类应用程序。 - Prem
是的,我正在真实设备上测试。尝试了4-5个设备。没有这样的应用程序可以在屏幕关闭时暂停互联网连接。 - Amol Sawant
如果我理解正确,你的问题是:“当屏幕锁定时,我的设备是否可能断开与互联网的连接?”假设你的位置逻辑是正确的,那么这个表述准确吗? - Paul Lammertsma
你尝试在代码中增加一些额外的日志输出,然后连接设备进行USB调试了吗?这样可以很容易地发现连接是否正常,或者是否有其他问题。 - bgse
@Paul,是的,你说得对。有没有解决方案?我已经为这个问题苦恼了半个月了。如果有任何解决方案,请告诉我。 - Amol Sawant
2个回答

6
根据文档WifiManager.WifiLock
允许应用程序保持Wi-Fi电台保持唤醒状态。通常情况下,当用户一段时间没有使用设备时,Wi-Fi电台可能会关闭。取得WifiLock将保持电台开启,直到释放锁定。多个应用程序可以持有WifiLocks,并且只有在任何应用程序中没有持有WifiLocks时,电台才允许关闭。
我猜你需要这个锁。如果设备连接到WiFi,请获取此锁。但是请注意,WifiLocks无法覆盖用户级别的“Wi-Fi已启用”设置或飞行模式。它们仅在WiFi已开启但设备处于空闲状态时防止电台关闭。

你好 M-WaJeEh,谢谢你的回答。这会让安卓 CPU 保持运行吗? - Amol Sawant
如果我使用 PowerManager.FULL_WAKE_LOCK,则会更新我的位置,但如果我使用 PowerManager.PARTIAL_WAKE_LOCK,则不会更新。使用 FULL_WAKE_LOCK 会点亮屏幕并提供更新的位置信息,但我不想让屏幕亮起。所以我使用了 PARTIAL_WAKE_LOCK,在屏幕关闭时获得了更新的位置信息。请帮帮我。谢谢。 - Amol Sawant
4
使用PowerManager.PARTIAL_WAKE_LOCK和WifiManager.WifiLock一起使用。 - M-Wajeeh

5
除非您的应用有非常好的理由保持Wi-Fi连接,否则您应该尊重用户在屏幕锁定时禁用WiFi的偏好。使用任何类型的锁定都会使设备迅速消耗更多电力。正如其他人所提到的那样,在您的情况下,您需要 PowerManager.PARTIAL_WAKE_LOCK 以保持CPU运行(而不会防止屏幕锁定),以及 WifiManager.WakeLock 以保持Wi-Fi连接。
您可能会发现导致此行为的设置位于Wi-Fi系统设置下的高级Wi-Fi设置中:

Keep Wi-Fi on during sleep

如果在使用移动数据的设备上禁用此设置,则您的网络位置监听器应该仍然可以工作,因为Android将继续在后台使用Google的位置API来基于蜂窝塔解析设备的位置。

如果您的设备也关闭了移动数据,可能是某些省电应用程序禁用了它。BlueEFFICIENCYJuice Defender是一些具有此优化选项的应用程序,但HTC和Sony在其设备上包含了一些节能选项,这些选项也可能会表现出此行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接