Режим сна и ожидания для приложения VoIP

У меня есть устаревшее приложение VoIP, для которого я хочу предоставить новую поддержку режима сна и ожидания Android. У меня есть собственный механизм обмена сообщениями/сигналами, для которого я не могу использовать функцию Android GCM. В документации указано, что добавление приложения в белый список позволит использовать собственный сигнальный механизм и поддерживать работу приложения в режиме Doze.

Также я генерирую сигнал тревоги keepAlive, используя setExtract() и setRepeating() в настоящее время, чтобы поддерживать постоянное соединение XMPP. Если я добавлю setExactAndAllowWhileIdle для более новой версии, в нем будет указано, что - Тревога будет срабатывать не чаще одного раза в каждые 15 минут. Но мне нужно генерировать его 1 каждые 12 секунд. Я просмотрел документацию по Android, множество тем в SO и нашел статья об этом. Кажется, что то, чего я хочу достичь, не совсем возможно, если добавить приложение в белый список и использовать новые API-интерфейсы AlarmManager.

Что я могу сделать, чтобы моя функциональность оставалась прежней? Поддерживать приложение в активном режиме в режиме ожидания и ожидания, генерировать тревожное оповещение с интервалом в 12 секунд, чтобы поддерживать соединение и поддерживать сетевое соединение открытым?


person Kaidul    schedule 14.12.2015    source источник
comment
Проверьте это: stackoverflow.com/ вопросы/31604093/   -  person piotrek1543    schedule 14.12.2015
comment
Я уже проверил. Какие моменты оттуда вы хотите, чтобы я заметил?   -  person Kaidul    schedule 14.12.2015


Ответы (1)


Внесение приложения в белый список путем отключения оптимизации батареи позволяет постоянно поддерживать приложение в рабочем состоянии.

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 для отправки уведомлений/сообщений в спящем режиме.

person Kaidul    schedule 16.12.2015
comment
отправка поддержания активности с помощью потока таймера, который вы имеете в виду C-таймеры time_t? - person NitZRobotKoder; 10.05.2016