2012-01-17 43 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設置爲「從不睡眠」。