4

Android の新しい居眠りモードとスタンバイ モードのサポートを提供したい従来の VoIP アプリがあります。Android の GCM 機能を使用できない独自のメッセージング/シグナリング メカニズムがあります。ドキュメントには、アプリをホワイトリストに登録すると、独自のシグナリング メカニズムを使用し、アプリを Doze モードで動作させ続けることが許可されると記載されています。

setExtract()また、setRepeating()現在 XMPP の永続的な接続を維持するために、キープアライブアラームを生成しています。新しいバージョンを追加するsetExactAndAllowWhileIdleと、次のように述べられています-アラームは15分ごとに最大1回トリガーされます。しかし、12秒間隔ごとに1つ生成する必要があります。私はAndroidのドキュメント、SOの多くのスレッドに目を通し、それに関する記事を見つけました。私が達成したいことは、アプリをホワイトリストに登録し、AlarmManagerの新しい API を使用することによって完全に可能ではないようです。

以前と同じように機能を維持するにはどうすればよいですか? アプリを居眠りモードとスタンバイ モードで維持し、12 秒間隔でアラーム アラートを生成して、接続を維持し、ネットワーク接続を開いたままにしますか?

4

1 に答える 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" />

ただし、新しいAlarmManagerAPIsetExactAndAllowWhileIdleは必要に応じて 12 秒間隔で呼び出されません。解決策は、以前の JNI コードを使用し、タイマー スレッドを使用してキープ アライブを送信し、12 秒間隔でキープ アライブ アラートを送信することです。アプリが生きているので、アラームが機能しているかどうかに関係なく、タイマー スレッドは生きています。

私のアプリには非常に複雑な要件があり、GCM の優先度の高いメッセージを使用できませんでした。ただし、Skype などの VoIP アプリのほとんどは、バッテリーの最適化を無効にせず、GCM を使用して居眠りモードで通知/メッセージを送信します。

于 2015-12-16T10:10:54.723 に答える