2016-07-22 12 views
0

Stellen Sie sich vor, wir haben den SIP-Stack Voip Android-Anwendung, und wir möchten Nachrichten empfangen und Anrufe im Schlafmodus.Voip-Anwendung im Schlaf-Status

Mit ADB setzen wir Geräte in IDLE-Status und haben keine Quelle für den Empfang eingehender Nachrichten von Signalisierung. Weder AlarmClock noch Service sind für diese Aufgabe geeignet! Es gibt also keine Möglichkeiten, neben GCM Aktionen im IDLE-Zustand zu handhaben! Oder ich liege falsch?

Ich erforschte die gesamte Dokumentation über Batterieoptimierung und Schlafzustände. Google sagte, nur über Voip Anwendung interessante Sache:

Nein, nicht GCM wegen technischer Abhängigkeit von einem anderen -Messaging-Dienst oder Doze und App Standby brechen die Kernfunktion der die App nutzen können.

Also, was ist das? Wir müssen GCM nicht verwenden, aber das Gerät immer aktivieren, für dieses Problem - es ist in Ordnung? Ich möchte nur wissen, was richtig ist, um in Schlafzuständen in Voip-Anwendungen zu hören!

Vielen Dank!

Antwort

1

Die Lösung immer in der Lage sein, eingehende Nachrichten zu empfangen, ist die folgende:

ein service erstellen, die immer im Hintergrund laufen und Ihre sipstack von dort.

Sperren Sie die WiFi da Geräte die WiFi auszuschalten konfiguriert werden kann, wenn in den Ruhezustand geht:

offline für das Gehen
private WifiLock wifiLock = null; 
ContentResolver ctntResolver = appcontext.getContentResolver(); 
int set = android.provider.Settings.Global.WIFI_SLEEP_POLICY_NEVER; 
android.provider.Settings.System.putInt(ctntResolver, android.provider.Settings.Global.WIFI_SLEEP_POLICY, set); 

verhindern, dass die CPU:

private WakeLock screenandcpuLockalways = null; 
private PowerManager powermanager = null; 
public void SetScreenAndCPULockAlways(boolean on) 
{    
    if (on) 
    { 
     if (screenandcpuLockalways != null && screenandcpuLockalways.isHeld()) 
     { 

     } 
     else 
     { 
      if (powermanager == null) 
      { 
       powermanager = (PowerManager) appcontext.getSystemService(Context.POWER_SERVICE); 
      } 

      screenandcpuLockalways = powermanager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE,"MyApp"); 
      screenandcpuLockalways.acquire(); 
     } 
    } 
    else 
    { 
     if (screenandcpuLockalways != null && screenandcpuLockalways.isHeld()) 
     {    
      screenandcpuLockalways.release(); 
     } 
    }    
}