我有一个服务,以一定的间隔轮询服务器.我使用AlarmManager和BroadcastReceiver来启动服务.我的问题是,经过一段时间后,即使Wifi仍然启用,但由于某种原因,我的应用程序无法联系服务器.我收到"无法访问的网络"错误.
请注意,我已经获得了部分唤醒锁和wifilock.
这是我的BroadcastReceiver代码.
public class ServiceAlarmBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
WakeLock wakeLock = null;
WifiLock wifiLock = null;
try {
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
// acquire a WakeLock to keep the CPU running
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"MyWakeLock");
if(!wakeLock.isHeld()){
wakeLock.acquire();
}
Log.i("ServiceAlarmBroadcastReceiver", "WakeLock acquired!");
WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL , "MyWifiLock");
if(!wifiLock.isHeld()){
wifiLock.acquire();
}
Log.i("ServiceAlarmBroadcastReceiver", "WifiLock acquired!");
context.startService(new Intent(context, ThePollerService.class));
} finally {
// release the WakeLock to allow CPU to sleep
if (wakeLock != null) {
if (wakeLock.isHeld()) {
wakeLock.release();
Log.i("ServiceAlarmBroadcastReceiver", "WakeLock released!");
}
}
// release the WifiLock
if (wifiLock != null) {
if (wifiLock.isHeld()) {
wifiLock.release();
Log.i("ServiceAlarmBroadcastReceiver", "WiFi Lock released!");
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此处发布的代码的问题是您从接收器内部获取并释放WakeLock和WifiLock.除非你在服务的onStart中完成整个任务(如果你是这样,为什么甚至打扰服务???),锁定将在你的轮询任务完成之前被释放.
我建议将您的实现更改为以下内容:
小智 0
在 WiFi 设置、菜单键、高级选项下,有 WIFI_SLEEP_POLICY 选项列表,当设置为从不时,将在手机睡眠时保持 WiFi 连接打开。
您可以在 Settings.System Package 下操作它。
http://developer.android.com/reference/android/provider/Settings.System.html#WIFI_SLEEP_POLICY
希望这可以帮助,
汤姆
| 归档时间: |
|
| 查看次数: |
20173 次 |
| 最近记录: |