3

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

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

Что я могу сделать, чтобы сохранить свою функциональность как раньше? Сохранение активности в дозе & режим ожидания, генерирование аварийного сигнала с интервалом в 12 секунд, чтобы поддерживать соединение и поддерживать сетевое соединение открытым?

+1

Проверьте это: http://stackoverflow.com/questions/31604093/android-voip-applications-behavior-in-doze-mode – piotrek1543

+1

Я уже проверил. Какие точки оттуда вы хотите, чтобы я заметил? –

ответ

3

White-listing приложение, отключая оптимизацию батареи, постоянно поддерживает приложение.

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 не дозвонились в течение интервала двенадцать секунд, как требуется. Решение - мы используем коды JNI от ранее, и мы отправляем их в режиме реального времени, используя поток таймера, чтобы отправить сообщение keep alive alert через 12 секунд. Когда приложение будет живым, поток таймера будет активен, независимо от того, работает ли Тревога или нет.

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

+0

«Отправка в режиме« живой »с помощью таймерной нити», вы имеете в виду C таймеров time_t? – NitZRobotKoder