VoIP应用的Doze和待机模式

4
我有一个传统的VoIP应用程序,我想提供Android的新的doze和standby模式支持。我有自己的消息/信令机制,无法使用Android的GCM功能。文档说明,将应用程序列入白名单将允许使用自己的信令机制,并在Doze模式下保持应用程序处于活动状态。
此外,我当前正在使用setExtract()setRepeating()生成keepAlive警报以保持XMPP的持久连接。如果我为较新版本添加setExactAndAllowWhileIdle,则说明-警报最多每15分钟触发一次。但我需要每12秒间隔生成1个。我查阅了Android文档、SO中的许多线程,并找到了一篇文章。看起来,通过将应用程序列入白名单并使用AlarmManager的新API完全无法实现我想要的目标。
我该怎么做才能像以前一样保持我的功能?在doze和待机模式下保持应用程序活动状态,生成12秒间隔的警报以保持连接活动并保持网络连接开启?

1
请查看此链接:https://dev59.com/vI3da4cB1Zd3GeqPylrY - piotrek1543
1
我已经检查了, 你想让我注意哪些点? - Kaidul
1个回答

5

通过禁用电池优化来将应用列入白名单,可以使得应用始终保持活跃状态。

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需要在12秒内调用,但实际上并没有得到执行。解决方案是:我们之前使用了JNI代码,现在使用Timer线程发送保持连接信息,每隔12秒发送一次。由于应用程序仍在运行,定时器线程将会一直存活,无论闹钟是否工作。
我的应用程序有很复杂的要求,使我无法使用GCM高优先级消息。但是像Skype这样的大多数VoIP应用程序不会禁用电池优化,而是使用GCM在深度睡眠模式下发送通知/消息。

通过使用定时器线程发送保持活动信号,您是指C语言中的计时器time_t吗? - NitZRobotKoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接