我有一个传统的VoIP应用程序,我想为其提供Android的新打盹和待机模式支持。我有自己的消息/信令机制,我无法使用Android的GCM功能。该文档指出,应用程序的白名单将允许使用自己的信号机制并在打盹模式下保持应用程序处于活动状态。
此外,我正在使用setExtract()
和setRepeating()
生成keepAlive警报,以保持XMPP的持久连接。如果我为新版本添加setExactAndAllowWhileIdle
,则表示 - 每15分钟最多触发一次警报。但是我需要每隔12秒生成1个。我浏览了Android文档,SO中有很多线程,并在其上找到了an article。通过白名单列出应用并使用AlarmManager
的新API,似乎无法实现我想要实现的目标。
我可以做些什么来保持我以前的功能?在打瞌睡的同时让应用程序保持活力待机模式,以12秒的间隔生成警报警报以保持连接活动并保持网络连接打开?
答案 0 :(得分:3)
通过禁用电池优化来使应用程序白名单,这样可以让应用程序始终保持活动状态。
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 Manifest:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
虽然新的AlarmManager
API setExactAndAllowWhileIdle
未按要求在12秒间隔内调用。解决方案是 - 我们正在使用之前的JNI代码,我们通过使用Timer线程以12秒的间隔发送保持活动警报来发送保持活动状态。当应用程序处于活动状态时,无论警报是否正常,计时器线程都将处于活动状态。
我的应用程序有一个非常复杂的要求,我无法使用GCM高优先级消息。但是像Skype这样的大多数VoIP应用都没有禁用电池优化,而是使用GCM在打盹模式下发送通知/消息。