VoIP 应用程序的打瞌睡和待机模式

Doze and Standby mode for VoIP app

我有一个旧版 VoIP 应用程序,我想为其提供 Android 的新休眠和待机模式支持。我有自己的 messaging/signaling 机制,但我无法使用 Android 的 GCM 功能。文档指出,将应用程序列入白名单将允许使用自己的信号机制并使应用程序在打瞌睡模式下保持活动状态。

此外,我目前正在使用 setExtract()setRepeating() 生成 keepAlive 警报,以保持 XMPP 的持久连接。如果我为较新版本添加 setExactAndAllowWhileIdle,它表示 - 警报最多每 15 分钟触发一次。但是我需要每 12 秒间隔生成 1 个。我浏览了 Android 文档,SO 中的许多线程并在其上找到了 an article。通过将应用程序列入白名单并使用 AlarmManager 的新 API,似乎我想要实现的目标并不完全可行。

我怎样做才能像以前一样保持我的功能?在休眠和待机模式下保持应用程序活动,以 12 秒间隔生成警报警报以保持连接活动并保持网络连接打开?

通过禁用电池优化将应用程序列入白名单可使应用程序始终处于活动状态。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        Intent intent = new Intent();
        intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
}

Android 清单:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

尽管新的 AlarmManager API setExactAndAllowWhileIdle 未按要求在十二秒间隔内被调用。解决方案是——我们使用之前的 JNI 代码,我们通过使用定时器线程以十二秒的间隔发送保持活动警报来发送保持活动状态。由于应用程序处于活动状态,因此无论警报是否工作,计时器线程都将处于活动状态。

我的应用有一个非常复杂的要求,我无法使用 GCM 高优先级消息。但是大多数 VoIP 应用程序(如 Skype)不会禁用电池优化,而是使用 GCM 在休眠模式下发送 notification/messages。