Как использовать метод activity или fragment'a в BroadcastReceiver?
Пишу приложение-задачник (для себя, для портфолио и, может быть, для получения прибыли).
В этом приложении есть функционал, позволяющий отметить некоторую задачу, как "текущую" и вывести её на экран уведомлений. В уведомлении есть кнопка, позволяющая завершить задачу. Для обработки этой кнопки я как раз и создал receiver и зарегистрировал его в AndroidManifest.
Но, вот незадача, в методе onReceive невозможно вызвать метод, который позволяет завершить задачу, обратившись к хранилищу. Я могу только вызвать Toast'ы да объекты, который передал через PendingIntent, когда создавал уведомление.
Кто знает, как быть? Бьюсь над этим уже очень долго.
Был почти рабочий вариант, когда я объявлял динамический broadcastrecevier в activity, но его недостаток в том, что после закрытия приложения полностью (удаление с экрана активных приложений), broadcastreceiver переставал работать.
Не поверю, что не существует никаких методов обращения к приложению с помощью статичного broadcastrecevier, ибо в приложениях может быть реализована функции типа "mark as read"
У ресивера и активити(и тем более фрагмента) абсолютно разные, непересекающиеся жизненные циклы.
Сделать то, что ты хочешь, можно разными способами. Если нужно показать UI, и что-то сделать в нём, нужно создавать PendingIntent для активити, и, соответственно, стартовать непосредственно её.
С помощью ресивера сделать тоже можно, непонятно только, почему "хранилище" у тебя привязано к активити. В ресивере непосредственно(или стартовав из него сервис, или запланировав джобу в WorkManager, зависит от) можно достучаться до "хранилища" и изменить в нем данные.
"Хранилище" == SQLite датабаза, обёрнутая Room'ом. Взаимодействие происходит через viewmodel. Для внесения ясности, так сказать)
Я, так понимаю, проапдейтить таску в базе всё равно можно в таком случае?
// Этот класс объявлен в классе MainActivity, в котором объявлен taskViewModel, для доступа
// к базе. Суть в том, что taskViewModel не может быть вызвано в OnReceive. Есть ли какой-то
// лёгкий, малострочный способ достучаться до хранилища из OnReceive?
class MyBroadcastReceiverV2 : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action!! == myAction) {
val task: TodayTask = intent.getParcelableExtra("somedata")
task.isComplete = !task.isComplete!!
if(task.subtasks.isNotEmpty()) {
for(sub in task.subtasks) {
sub.isComplete = task.isComplete!!
}
}
tasksViewModel.updateTodayTask(task)
Toast.makeText(context, task.taskName, Toast.LENGTH_SHORT).show()
}
}
}