屏幕空白后立即杀死Android套接字

时间:2012-01-17 15:47:57

标签: android sockets

所以我在我的服务中创建了一个Socket,它是从一个Activity开始的。套接字连接到我的服务器并等待非周期性的消息,当我写入它们时它们被发送。当服务启动时但是在我单独离开电话并且不发送任何消息之后,消息被正常收到,当屏幕变为空白时,InputStream.readLine()的IO异常将关闭,这意味着我认为套接字已经死了。该过程仍在运行,并在发生这种情况时继续运行。这是正常的行为吗?我以为我会在Socket死前至少20分钟,而不是几秒钟。

   Socket mSocket=new Socket(InetAddress.getByName("192.168.1.104"),4444);
BufferedReader in=new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
String message;
try {
    while((message=in.readLine())!=null){
        notify(message);
    }
    } catch (IOException e) {
        notify("socket dead");
    }

3 个答案:

答案 0 :(得分:3)

您可以使用WifiManager(http://developer.android.com/reference/android/net/wifi/WifiManager.html)获取WifiLock以保持网络可用屏幕熄灭。

WifiManager.WifiLock lock = ((WifiManager) someContext.getSystemService(Context.WIFI_SERVICE)).createWifiLock("MyWifiLock")

一旦不再需要它:

lock.release();

您需要在清单中添加android.permission.WAKE_LOCK权限。

请注意,这可能会对电池寿命造成很大影响。

答案 1 :(得分:1)

试试这个:

private void setNeverSleepPolicy(){
    ContentResolver cr = _context.getContentResolver();
    int set = android.provider.Settings.System.WIFI_SLEEP_POLICY_NEVER;
    Boolean didchangepolicy=android.provider.Settings.System.putInt(cr, android.provider.Settings.System.WIFI_SLEEP_POLICY, set);
    Log.v(TAG,didchangepolicy?"changed policy":"did not change policy");
}

和google wifi睡眠政策可能会有所帮助

答案 2 :(得分:1)

同时获取 Wifi Lock Power Wakelock 。在Android 4.0上,我可以通过套接字监听关闭屏幕,然后每隔10分钟从外部服务器发送数据到

WifiManager wMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiManager.WifiLock wifiLock = wMgr.createWifiLock(WifiManager.WIFI_MODE_FULL, "MyWifiLock");
wifiLock.acquire();

PowerManager pMgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pMgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();

不再需要时:

wifiLock.release();
wakeLock.release();

确保您拥有android.permission.WAKE_LOCK权限。可能还需要让用户在Android Wifi Manager中将其Wifi设置为“Never Sleep”。