Фоновая активность заблокирована при использовании AlarmManager. (изменение конфиденциальности Android Q)

В моем проекте я использую AlarmManager для ежедневного запуска AlarmClock, но когда приходит время запуска будильника, появляется следующее всплывающее сообщение:

Background activity start from com.example.nameOfApp blocked. See g.co/dev/bgblock

Обновленный код:

------- метод setAlarmClock-------

private void setAlarmClock(Calendar calendar, int alarmId, String time, String timeOfTheDay, boolean action) {
        AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(getActivity(), AlarmClockReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), alarmId, intent, 0);

        if (action) {
            manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
            }
        } else {
            manager.cancel(pendingIntent);
        }
    }

------- Класс AlarmClockReceiver -------

public class AlarmClockReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String alarmAction = AlarmClock.ACTION_SET_ALARM;
        Intent i = new Intent(alarmAction);
        i.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        i.putExtra(AlarmClock.EXTRA_MESSAGE, "Time for taking medicine!");
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

Кроме того, в AndroidManifest я включил следующую строку:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

Я знаю, что это связано с новым изменением конфиденциальности Android Q. Из вышеупомянутой ссылки сказано:

Приложения, работающие на Android Q, могут запускать действия только при соблюдении одного или нескольких из следующих условий:

...

Приложение получает уведомление PendingIntent от системы. В случае ожидающих намерений для служб и широковещательных приемников приложение может начать действия в течение нескольких секунд после отправки ожидающих намерений.

Если я правильно понял, то это как раз мой случай. Тем не менее вышеупомянутое всплывающее сообщение появляется.


person Paweł Bęza    schedule 02.08.2019    source источник
comment
Это не уведомление PendingIntent. Это сигнал тревоги PendingIntent.   -  person Mike M.    schedule 03.08.2019


Ответы (1)


PendingIntent действителен (для запуска действия) только в том случае, если вы установили намерение в уведомлении с помощью метода setContentIntent. Итак, что вы можете сделать, так это опубликовать уведомление вместо непосредственного запуска действия. Когда пользователь нажимает на уведомление, ожидающее намерение будет использоваться для запуска действия. Изменить: в качестве альтернативы вам нужно запросить SYSTEM_ALERT_WINDOW, но вы не сможете запустить приложение на Android Go, потому что это разрешение невозможно использовать в этой версии.

person greywolf82    schedule 03.08.2019
comment
Не уверен, что вы читали документацию, это то, что PendingIntent.getActivity() делает Retrieve a PendingIntent that will start a new activity, like calling Context#startActivity(Intent), так что это точно то же самое, что вы сказали, не создавая моего собственного приемника. - person Paweł Bęza; 03.08.2019
comment
да, я знаю, но с Android Q единственное, что вы можете сделать, это вызвать startActivity - person greywolf82; 03.08.2019
comment
Можете ли вы взглянуть на мой обновленный код, я застрял, почему эта ошибка появляется при запуске метода onReceive. - person Paweł Bęza; 03.08.2019
comment
вам нужно создать намерение, как в предыдущем коде, не используйте параметр приемника - person greywolf82; 03.08.2019
comment
Итак, что вы подразумеваете под than call startActivity from your receiver в исходном ответе, я подумал, что должен построить свой собственный приемник - person Paweł Bęza; 03.08.2019
comment
вам нужно создать свой собственный объект намерения в приемнике, не более того. - person greywolf82; 03.08.2019
comment
Извините, возможно, я снова вас неправильно понял, но когда я создаю свое намерение, которое запускает AlarmClock внутри AlarmClockReceiver, появляется то же всплывающее сообщение, что и в начале. Если вы можете еще раз взглянуть на мой код и указать на мою ошибку. - person Paweł Bęza; 03.08.2019
comment
это кажется правильным, я бы сказал, что в этом случае ошибка платформы. - person greywolf82; 03.08.2019
comment
@PawełBęza Обновил ответ после дополнительного тестирования. - person greywolf82; 03.08.2019
comment
Я имею в виду, что это может быть какое-то решение, но в моем случае, когда я использую AlarmClock, и взаимодействие с пользователем не должно быть необходимым для срабатывания тревоги. Это было бы так же, как мне нужно было бы нажать на уведомление от будильника, чтобы он звонил. - person Paweł Bęza; 03.08.2019
comment
обновил ответ альтернативой, я думаю, это все, что вы можете сделать:/ - person greywolf82; 03.08.2019
comment
У меня такая же проблема @PawełBęza, ​​ты решил ее? Комично, что мое приложение — это приложение для будильника, будильники — это его основная функция, и мне не разрешено запускать будильник. Сумасшедший - person qkx; 02.11.2019