Открытие намерения действия из класса широковещательного приемника после закрытия приложения

#android #android-studio

Вопрос:

Я работаю над приложением для Android, которое использует Socket IO, где подключены два пользователя. Один пользователь может отправить сообщение/событие другому пользователю, и действие должно всплывать, отображая соответствующую информацию, точно так же, как при получении вызова. Проблема здесь в том, что приложение может быть или не быть открытым или находиться в фоновом режиме.

Что я пробовал до сих пор:

  1. Запустил службу переднего плана, которая работает вечно, пока ее принудительно не остановят. Здесь в этой службе открывается соединение с сокетом.
  2. В службе переднего плана сокет прослушивает события и устанавливает диспетчер аварийных сигналов, если происходит событие вызова
 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);
    }
});
 
  1. Затем класс приемника предупреждений:
 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);
    }
}
 
  1. В манифесте:
 <receiver android:name=".AlertReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
 
  1. Разрешение:
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 

Здесь все отлично работает, когда приложение открыто или в фоновом режиме. Но когда приложение закрыто, AlarmManager работает и открывает получатель предупреждений, но намерение не запускается. Пожалуйста, обратите внимание, что служба переднего плана все еще работает и доступна для получения будущих событий.

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

Я понимаю, что контекст недоступен, когда приложение закрыто. Но мне интересно, как работает будильник или приложение для видеозвонков. Потому что эти приложения не обязательно должны быть открыты, когда происходит событие.

Я что-то здесь упускаю? Или у вас есть другой подход для достижения этой цели? Хотел бы знать ваше мнение.

Комментарии:

1. «Но мне интересно, как работает будильник или приложение для видеозвонков. Потому что эти приложения не обязательно должны быть открыты, когда происходит событие»-по крайней мере, в современных версиях Android они показывают высокий приоритет Notification в полноэкранном Intent режиме . Они запускают действие только в том случае, если устройство простаивает; в противном случае они отображают уведомление «хедз-ап». Это предотвращает прерывание фоновых приложений пользователем, когда пользователь делает что-то важное (например, пытается следовать указаниям навигации во время вождения).