2012-01-17 6 views
1

アクティビティから開始されるサービスでソケットを作成します。ソケットは私のサーバーに接続し、定期的ではないメッセージを待っています。メッセージを書き込むと送信されます。最初にサービスを開始したときにメッセージは正常に受信されますが、画面が空白になると、IOExceptionはInputStream.readLine()のために消えてしまいます。プロセスはまだ実行されており、この状況が発生した場合でも実行を継続します。これは正常な動作ですか?私はソケットが死ぬ前に少なくとも20分30秒かかると思っていました。数秒ではありません。あなたは、画面が消えた後も利用可能なネットワークを維持するためにWifiLockを得ることがWifiManager(http://developer.android.com/reference/android/net/wifi/WifiManager.html)を使用することができます画面が空になった後、Androidソケットがimidiatellyで殺される

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.WifiLock lock = ((WifiManager) someContext.getSystemService(Context.WIFI_SERVICE)).createWifiLock("MyWifiLock") 

そして、それはもはや必要とされ、一度:

lock.release(); 

あなたがマニフェストにandroid.permission.WAKE_LOCK権限を追加する必要があります。

これはおそらくバッテリの寿命がかなり厳しいことに注意してください。

+0

ありがとうございますが、私は目覚めのロックを避けることを望んでいました。画面が空白になった場合、アンドロイドがメッセージを数秒以上開いているのを待っているソケットを保持する方法はありませんか?私はプロセスが実行されていることを意味するので、なぜそのプロセスで作成されたソケットがすぐに削除されますか? – user1154267

+1

スタックトレースを記録していないのはなぜですか? – Brigham

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睡眠ポリシーは

1

獲得Wifiのロックの両方パワー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マネージャで「スリープしない」ようにユーザーに設定する必要があります。

関連する問題