2016-07-22 126 views
0

想象一下,我们有SIP堆栈的Voip Android应用程序,并且我们希望接收消息,并在睡眠模式下进行呼叫。Voip在睡眠状态下的应用

通过使用ADB,我们将设备置于空闲状态,并且没有任何接收来自信号传入消息的源。 AlarmClock和Service都不适合执行此任务!所以除了GCM之外,没有办法在IDLE状态下处理动作!或者我错了?

我探索了关于电池优化和睡眠状态的所有文档。谷歌刚刚谈到VoIP应用有趣的事情:

不,不能在另一个 消息服务使用GCM因为技术依赖或打盹和应用待机打破 应用的核心功能。

那么,这是什么意思?我们不需要使用GCM,但始终使设备处于活动状态,因为这个问题 - 没关系?我只想知道,在VoiP应用程序中用于在睡眠状态下收听动作的正确方法是什么!

谢谢!

回答

1

的解决方案总是能够接收传入的消息如下:

创建service它总是在后台运行,并从那里运行sipstack。

锁定的WiFi,因为设备可以被配置为当转入怠速时关掉无线网络:

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); 

防止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(); 
     } 
    }    
} 
相关问题