2016-10-04 9 views
0

Я экспериментирую с P2P-связью на Android с использованием WiFi-Direct. У меня есть служба, которая ищет другие телефоны и автоматически соединяется с ними, если они были спарены раньше. Мне нравится работать, независимо от того, включен или выключен экран.Android: WiFi-прямая связь, когда экран выключен

Android предлагает возможность сохранить Wi-Fi живым, когда экран устройства выключен. Но похоже, что это не влияет на WiFi-Direct. После выключения экрана устройства и ожидания минуты WifiP2pManager, похоже, перестает открывать новые сверстники.

Есть ли у кого-нибудь идеи, как исправить это поведение?

ответ

0

Так что здесь происходит то, что вы вызываете startDiscoveryProcess() через 50 секунд после выключения экрана, и startDiscoveryProcess() вызывает себя каждые 50 секунд. Как остановить этот процесс? Вы слушаете Intent.ACTION_SCREEN_ON, и если экран включен, мы не отправляем трансляцию, чтобы снова начать обнаружение.

boolean screenOn = true; 

BroadcastReceiver screenReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF) || intent.getAction().equals("MY_ACTION_WHEN_SCREEN_IS_OFF")) { 
      screenOn = false; 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        // start discovery process again 
        startDiscoveryProcess(); 
       } 
      }, 50000); 
     } else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenOn = true; 
     } 
    } 
}; 

В onCreate() вашей службы, зарегистрировать приемник:

IntentFilter filters = new IntentFilter(); 
filters.addAction(Intent.ACTION_SCREEN_OFF); 
filters.addAction(Intent.ACTION_SCREEN_ON); 
filters.addAction("MY_ACTION_WHEN_SCREEN_IS_OFF"); 
registerReceiver(screenReceiver, filters); 

Тогда просто убедитесь, что есть метод мы назвали выше:

void startDiscoveryProcess() { 
    //start discovery process 
    // do something... 

    // then send the broadcast yourself to do this every 50 seconds because discovery stops at 60 seconds 
    if(!screenOn) { 
     Intent intent = new Intent("MY_ACTION_WHEN_SCREEN_IS_OFF"); 
     sendBroadcast(intent); 
    } 
}