2012-01-17 1 views
1

그래서 Activity에서 시작된 서비스에서 소켓을 만듭니다. 소켓은 내 서버에 연결하여 정기 간행물이 아닌 메시지를 기다립니다. 메시지를 쓸 때 메시지가 전송됩니다. 서비스가 시작될 때 메시지가 먼저 수신되지만 혼자 전화를두고 메시지를 보내지 않으면 메시지가 제대로 전송됩니다. 화면이 공백이되면 InputStream.readLine()에 대해 IO 예외가 발생하여 소켓이 죽은 것입니다. 이 프로세스는 여전히 실행 중이며 이런 일이 발생하면 계속 실행됩니다. 이것은 정상적인 행동입니까? 소켓이 죽기 전에 최소한 20, 30 분이 걸릴 거라 생각했는데 몇 초가 아니야.화면이 공백이 된 후 안드로이드 소켓이 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 (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

고마워요.하지만 잠자기를 피하려고 했어요. 안드로이드가 화면이 공백이 될 때 메시지가 몇 초 이상 열리는 것을 기다리고있는 소켓을 유지할 방법은 없습니까? 프로세스가 실행 중일 때 프로세스에서 생성 된 소켓을 죽이는 이유는 무엇입니까? – 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"); 
} 

와 구글 와이파이 절전 정책은

1

획득 와이파이 잠금 모두전원 가동 잠금를 도움이 될 수 있습니다. 안드로이드 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 관리자에서 '잠자기 중지'로 Wi-Fi를 설정하도록해야 할 수도 있습니다.

관련 문제