#android #android-studio
Вопрос:
Я работаю над приложением для Android, которое использует Socket IO, где подключены два пользователя. Один пользователь может отправить сообщение/событие другому пользователю, и действие должно всплывать, отображая соответствующую информацию, точно так же, как при получении вызова. Проблема здесь в том, что приложение может быть или не быть открытым или находиться в фоновом режиме.
Что я пробовал до сих пор:
- Запустил службу переднего плана, которая работает вечно, пока ее принудительно не остановят. Здесь в этой службе открывается соединение с сокетом.
- В службе переднего плана сокет прослушивает события и устанавливает диспетчер аварийных сигналов, если происходит событие вызова
socket.on("call", new Emitter.Listener() {
@Override
public void call(Object... args) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainBgService.this, AlertReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainBgService.this, 1, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MILLISECOND, 100);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
});
- Затем класс приемника предупреждений:
public class AlertReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
// This callback is fully executed even if the app is closed or open
Intent aIntent = new Intent(context, OpenCallActivity.class);
aIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(aIntent);
}
}
- В манифесте:
<receiver android:name=".AlertReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
- Разрешение:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Здесь все отлично работает, когда приложение открыто или в фоновом режиме. Но когда приложение закрыто, AlarmManager работает и открывает получатель предупреждений, но намерение не запускается. Пожалуйста, обратите внимание, что служба переднего плана все еще работает и доступна для получения будущих событий.
Кроме того, обратный вызов onReceive полностью выполняется, даже если приложение закрыто или открыто, но не начинает работу при закрытии приложения.
Я понимаю, что контекст недоступен, когда приложение закрыто. Но мне интересно, как работает будильник или приложение для видеозвонков. Потому что эти приложения не обязательно должны быть открыты, когда происходит событие.
Я что-то здесь упускаю? Или у вас есть другой подход для достижения этой цели? Хотел бы знать ваше мнение.
Комментарии:
1. «Но мне интересно, как работает будильник или приложение для видеозвонков. Потому что эти приложения не обязательно должны быть открыты, когда происходит событие»-по крайней мере, в современных версиях Android они показывают высокий приоритет
Notification
в полноэкранномIntent
режиме . Они запускают действие только в том случае, если устройство простаивает; в противном случае они отображают уведомление «хедз-ап». Это предотвращает прерывание фоновых приложений пользователем, когда пользователь делает что-то важное (например, пытается следовать указаниям навигации во время вождения).