即使使用Lock,Wifi也会睡觉

总结:即使获得wifi锁定,当手机使用电池运行时,WiFi会在一段时间后断开连接。

我已经使用启动线程的按钮将问题简化为单个活动。 它只发送100.000个字符串到PC上运行的echo服务器(每100ms一个字符串)。 见下面的代码。 我可以通过WireShark查看流量,并且echo服务器也会显示字符串。 注意在开始发送之前(当然是在发布之后)如何获取WiFi和电源锁。

但是,当手机使用电池运行并且用户关闭手机时,它会继续发送字符串一段时间,然后WiFi断开连接,手机甚至不响应ping。 从600s到6000s需要断开连接(数字是那么圆,所以我认为它们很重要)。

它在A / C连接时非常有效,所以我猜它与电源管理有某种关系。

为了测试它我只是启动活动,启动echo服务器,启动WireShark,按“开始”按钮( android:onClick="doStart" ),阻止手机并将其放在桌面上。 我去吃午餐或其他什么,经过600-6000s我可以看到WireShark上的tx错误,echo服务器已经停止接收流量而手机没有响应ping。

手机是2.2,WiFi政策设置为“15米后睡觉”。

 package Odroid.test; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Date; import android.app.Activity; import android.content.Context; import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.PowerManager; import android.view.View; import android.widget.Button; public class Test extends Activity { PowerManager _powerManagement = null; PowerManager.WakeLock _wakeLock = null; WifiManager.WifiLock _wifiLock = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void doStart(View v) { DoerThreadFake t = new DoerThreadFake(); t.start(); } private class DoerThreadFake extends Thread { public void run() { runOnUiThread(new Runnable() { public void run() { ((Button) findViewById(R.id.start)).setText("Doing..."); } }); _keepOnStart(); Socket s; byte[] buffer = new byte[1000]; try { s = new Socket("192.168.0.16", 2000); PrintStream ps = new PrintStream(s.getOutputStream()); InputStream is = s.getInputStream(); for (int i = 0; i  0) { int a = is.available(); if (a > 1000) a = 1000; is.read(buffer, 0, a); // Clean echo } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } _keepOnStop(); runOnUiThread(new Runnable() { public void run() { ((Button) findViewById(R.id.start)).setText("Done"); } }); } private void _keepOnStart() { if (_powerManagement == null) { _powerManagement = (PowerManager) getSystemService(Context.POWER_SERVICE); } if (_wakeLock == null) { _wakeLock = _powerManagement.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "0 Backup power lock"); } _wakeLock.acquire(); WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (wifiManager != null) { _wifiLock = wifiManager.createWifiLock("0 Backup wifi lock"); _wifiLock.acquire(); } } private void _keepOnStop() { if ((_wifiLock != null) && (_wifiLock.isHeld())) { _wifiLock.release(); } if ((_wakeLock != null) && (_wakeLock.isHeld())) { _wakeLock.release(); } } } } 

清单:

                 

任何想法?

Solutions Collecting From Web of "即使使用Lock,Wifi也会睡觉"