Запустите действие в фоновом режиме с помощью ACTION_MANAGE_OVERLAY_PERMISSION

#android #android-intent #broadcastreceiver

#Android #android-намерение #broadcastreceiver

Вопрос:

Я хочу запустить действие в фоновом режиме (даже если приложение убито) с помощью ACTION_MANAGE_OVERLAY_PERMISSION . Это работает только тогда, когда приложение находится на переднем плане. Мой код приведен ниже;

1. Файл манифеста

  <uses-permission android:name="android.permission.WAKE_LOCK" />

 <receiver
        android:name=".digitalclock.DigitalClockReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_ON" />
            <action android:name="android.intent.action.SCREEN_OFF" />
        </intent-filter>
    </receiver>
  

2-BroadcastReceiver

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

    if (intent?.action.equals(Intent.ACTION_SCREEN_OFF)) {

     
        if (Build.VERSION.SDK_INT >= 29) {
            val intent2 = Intent(context, DigitalClockActivity::class.java)
            intent2.putExtra("unlock_screen", true)
            intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            context?.startActivity(intent2)
        } 

        }
    }
  

Я также запустил службу в широковещательном режиме, и она всегда получает фильтр намерений, даже если приложение отключено. Класс обслуживания также запускается, но activity нет.

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

1. что вы используете ACTION_MANAGE_OVERLAY_PERMISSION в коде, как написано в вашем вопросе?

2. У меня есть переключатель (по умолчанию false), если пользователь хочет переключиться на true, он должен предоставить разрешение, тогда свойство будет включено, поэтому я выполняю эту работу в связанной деятельности. Если свойство не включено, трансляция никогда не будет работать в моем коде.

3. итак, ваш широковещательный приемник запускается, но действие не запускается?

4. да, точно, действие не запускается

Ответ №1:

Попробуйте заменить

 val intent2 = Intent(context, DigitalClockActivity::class.java)
  

с жестко запрограммированным пакетом и именем класса

 val i = Intent();
i.setClassName("com.test", "com.test.DigitalClockActivity")
  

Измените имя класса пакета и действия на свое собственное!

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

1. Это работает, когда приложение находится в фоновом режиме, но работает только на эмуляторе, когда приложение отключено, а не на реальном устройстве.

2. @Ahmet вы протестировали на реальном устройстве после замены, как написано в моем ответе? какая версия Android у вашего устройства?

3. да, я тестировал на реальном устройстве Xiaomi (API 29), оно отлично работает на эмуляторе Android (API 29)

4. @Ahmet сначала удалите приложение со своего реального устройства. затем внесите изменения, написанные в моем ответе, а затем переустановите на своем реальном устройстве

5. Я удалил «adb uninstall com.xxx.xxx», но, к сожалению, это не сработало. Что еще я могу изменить?