2012-01-17 46 views
1

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

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"); 
    } 

回答

2

可以使用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允许添加到您的清单。

请注意,这可能会在电池寿命上很难。

+0

谢谢你,但我希望避免唤醒锁。有没有办法android会保持一个插座,等待消息打开超过几秒钟,当屏幕变空白。我的意思是这个进程正在运行,为什么它会尽快杀死在这个进程中创建的Socket? – user1154267 2012-01-17 16:22:13

+1

为什么不记录堆栈跟踪? – Brigham 2012-01-17 19:25:26

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"); 
} 

和谷歌的WiFi休眠策略可能会有所帮助

1

同时采集一个无线上网的锁电源唤醒锁定。在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管理器中将他们的Wifi设置为“从不睡眠”。