Невозможно запустить действие с помощью метода onReceive broadCastReceiver - PullRequest
0 голосов
/ 13 января 2020

Я работаю над приложением тревоги. В этом я использую приемник вещания и менеджер тревог. Когда срабатывает сигнализация, вызывается метод onReceive, а затем из метода onReceive я вызываю startActivity для запуска намерения

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

В методе onReceive у меня есть три вещи:

  1. Toast
  2. RingtoneManager
  3. Intent
  @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "In broadcast receiver", Toast.LENGTH_LONG).show();

        Bundle args = intent.getBundleExtra(Constants.BROADCAST_RECEIVER_BUNDLE);
        Alarms alarms = (Alarms) args.getSerializable(Constants.ALARM_OBJECT);
        int alarmRequestCode = args.getInt(Constants.ALARM_REQUEST_CODE);


        Intent OpenAppIntent = new Intent();

//      I also tried with adding classes in intent object directly eg new Intent(context, MyActivity.class) but no luck

        OpenAppIntent.setClass(context,com.example.MyActivity.class);
        OpenAppIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        OpenAppIntent.putExtra(Constants.BROADCAST_RECEIVER_BUNDLE , args);
        context.startActivity(OpenAppIntent);

        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alarmUri == null) {
            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        }
        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
        ringtone.play();

    }


Теперь у нас есть два случая

  1. Когда у нас есть все три элемента в методе onReceive (тост, менеджер рингтонов и намерение) - тогда тост и рингтон воспроизводятся и отображаются соответственно и активность не начинается
  2. Когда мы удаляем менеджер рингтонов из метода onReceive (тост и намерение) - тогда Toast также не отображается (активность также не запускается)

Устройства, в которых замечена эта проблема: Gionee F9, Motorola g5s и Redmi k20 pro. Кроме того, иногда то же самое происходит с Nokia 7 Plus

Пожалуйста, скажите мне, что не так с кодом или как лучше всего начать работу при получении трансляции.

Тест 1

Вместо того, чтобы начинать деятельность, я попытался отобразить полноэкранное уведомление, как показано здесь и как предложено в комментарии, но не смог сделать это из-за ошибки Non-stati c метод startForeground (int, Notification) не может быть вызван из состояния c контекста

@Override
    public void onReceive(Context context, Intent intent) {


        Intent notificationIntent = new Intent(context, MyActivity.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable(Constants.ALARM_OBJECT , alarms);
        notificationIntent.putExtra(Constants.BROADCAST_RECEIVER_BUNDLE , bundle);
        PendingIntent pendingIntent = PendingIntent.getActivity(context,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setContentTitle(Constants.APP_NAME)
                .setContentText("Stop the alarm")
                .setSmallIcon(R.drawable.logo_inner)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setFullScreenIntent(pendingIntent, true)
                .build();

        Service.startForeground(1, notification); // Non-static method startForeground(int, notification) cannot be referenced from a static context 
    }

теста 2

Я также попытался запустить обслуживание переднего плана непосредственно из метода onReceive, но возникает та же проблема, что и при запуске операции. Я также попытался отладить, установив точки останова на методе обслуживания onCreate, но onCreate никогда не вызывал эти устройства (Gionee F9, Motorola g5s и Redmi k20 pro)

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent alarmServiceIntent = new Intent(context, AlarmSoundService.class);
        Bundle alarmServiceBundle = new Bundle();
        alarmServiceBundle.putSerializable(Constants.ALARM_OBJECT , alarms );
        alarmServiceIntent.putExtra(Constants.ALARM_BUNDLE , alarmServiceBundle);
//        startService(alarmServiceIntent);
        ContextCompat.startForegroundService(context, alarmServiceIntent);
    }

Будут благодарны за любые предложения.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...