Разъем Android убивается сразу после того, как экран погас - PullRequest
1 голос
/ 17 января 2012

Итак, я создаю сокет в моей службе, который запускается из действия.Сокет подключается к моему серверу и ждет сообщений, которые не являются периодическими, они отправляются, когда я их записываю. Сначала сообщения принимаются нормально, когда запускается служба, но после того, как я оставляю телефон один и не отправляю никаких сообщений,когда экран становится пустым, исключение ввода-вывода отключается для InputStream.readLine (), что означает, что сокет мертв, я полагаю.Процесс все еще работает и продолжает работать, когда это происходит.Это нормальное поведение?Я думал, что получу как минимум 20, 30 минут до смерти Гнезда, а не несколько секунд.

   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 ]

3 голосов
/ 17 января 2012

Вы можете использовать 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 голос
/ 20 сентября 2013

Приобретите 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. Может также потребоваться, чтобы пользователь установил для своего Wi-Fi значение «Никогда не спит» в диспетчере Android Wifi.

1 голос
/ 08 августа 2012

Попробуйте это:

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 может помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...