【问题标题】:Start an activity in backround by using ACTION_MANAGE_OVERLAY_PERMISSION使用 ACTION_MANAGE_OVERLAY_PERMISSION 在后台启动活动
【发布时间】:2023-12-14 08:13:01
【问题描述】:

我想通过使用 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-广播接收器

 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)
        } 

        }
    }

我还在广播中启动了一项服务,即使应用程序被终止,它也始终接收到意图过滤器。服务类也开始了,但活动没有。

【问题讨论】:

  • 你在哪里使用ACTION_MANAGE_OVERLAY_PERMISSION 在你的问题中写的代码?
  • 我有一个开关(默认为false),如果用户想切换为true,他必须授予权限,然后该属性将被启用,所以我在相关活动中进行这项工作。如果未启用该属性,则广播将永远不会在我的代码中工作。
  • 所以你的广播接收器被触发但活动没有开始?
  • 是的,确切地说,活动没有开始

标签: android android-intent broadcastreceiver


【解决方案1】:

尝试替换

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

带有硬编码的包和类名

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

将包和活动类名称更改为您自己的!

【讨论】:

  • 当应用程序在后台时它可以工作,但是当应用程序被杀死而不是在真实设备上时,它只能在模拟器上工作。
  • @Ahmet 在我的回答中替换后,您是否在真实设备上进行了测试?您的设备有什么 android 版本?
  • 是的,我在真正的小米设备(API 29)上测试过,它在安卓模拟器(API 29)上运行良好
  • @Ahmet 首先从您的真实设备上卸载应用程序。然后在我的答案中进行更改,然后在您的真实设备上重新安装
  • 我被“adb uninstall com.xxx.xxx”删除了,但不幸的是它没有用。我还能做什么?