Android. BroadcastReceiver завершает работу при выходе из приложения

Использую BroadcastReceiver для отклонения входящих звонков. BroadcastReceiver прекращает работу, когда пользователь выходит из приложения или очищает ОЗУ. Как сделать так, чтобы BroadcastReceiver работал постоянно? Я хотел использовать Service, но тогда возникает проблема в реализации сброса звонков.

class PhoneCallStateReceiver : BroadcastReceiver() {
private lateinit var mTelephonyManager: TelephonyManager

override fun onReceive(context: Context?, intent: Intent?) {

    //сброс звонка

    mTelephonyManager = context!!.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    val c = Class.forName(mTelephonyManager.javaClass.name)
    val m = c.getDeclaredMethod("getITelephony")
    m.isAccessible = true
    val telephonyService = m.invoke(mTelephonyManager) as ITelephony
    val bundle = intent!!.extras
    val phoneNumber = bundle!!.getString("incoming_number")
    phoneNumber.toString().replace("[^0-9]", "")
    Log.e("INCOMING", phoneNumber.toString())
    if ((phoneNumber != null)) {
        telephonyService.endCall()
        Log.d("HANG UP", phoneNumber)
    }

}

}


Ответы (1 шт):

Автор решения: Sergei Buvaka

Android не разрешает выполнять какие-либо операции в фоне без ведома пользователя. Соответственно, если вы хотите, чтобы ваше приложение что-то делало даже после того, как пользователь выгрузит приложение из памяти, вам необходимо создать Foreground Service.

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

Другого способа у вас скорее всего нет, потому как любые другие действия будет убивать система. В теории вы конечно можете запустить какой-нибудь WorkManager, который будет стартовать ваше приложение раз в какое-то время. Но я не уверен, что это будет работать стабильно.

Например, я знаю ребят которые так запускают некое невидимое активити для того, чтобы их приложение работало в фоне. Но ребята пишут много нативного SDK и работают с IoT (Internet of Things). Так что, я не знаю насколько стоит такое делать и насколько это сложно.

→ Ссылка