如何在Android Oreo上注册ACTION_PACKAGE_ADDED和ACTION_PACKAGE_REMOVED?

时间:2017-09-01 08:43:20

标签: android android-8.0-oreo

查看最新的Android Oreo发行说明,似乎应用程序只能注册少数隐式广播。 ACTION_PACKAGE_ADDED和ACTION_PACKAGE_REMOVED不在其中。是否有接收这些广播的解决方法?

2 个答案:

答案 0 :(得分:7)

来自the docs

  

针对Android 8.0或更高版本的应用无法再在其清单中为隐式广播注册广播接收器。隐式广播是一种不专门针对该应用的广播。例如,ACTION_PACKAGE_REPLACED是隐式广播,因为它被发送给所有已注册的侦听器,让他们知道设备上的某些包已被替换。

这表示您无法在清单中注册这些意图。您仍然可以通过编程方式注册它们,以便在您的应用运行时接收它们。

您也可以尝试ACTION_PACKAGE_FULLY_REMOVED,这是您可以通过在清单中注册它仍然可以收听的exceptions之一。没有这样的替代品'当添加包时。

正如CW所说,您还可以定期检查已安装应用程序名单中的更改。

  

您还可以使用轮询,设置JobScheduler作业以便经常检查,通过getChangedPackages()向PackageManager询问已安装应用程序列表中的更改内容。

答案 1 :(得分:-1)

发布在https://stackoverflow.com/a/55819091/1848826

  

我可以使其与以下代码一起使用

     
class KotlinBroadcastReceiver(action: (context: Context, intent: Intent) -> Unit) : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) = action(context, intent)
}

class MainActivity : AppCompatActivity() {
    private val broadcastReceiver = KotlinBroadcastReceiver { context, _ ->
        Toast.makeText(context, "It works", Toast.LENGTH_LONG).show()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        registerReceiver(broadcastReceiver, IntentFilter().apply {
            addAction(Intent.ACTION_PACKAGE_ADDED)
            addAction(Intent.ACTION_PACKAGE_REMOVED)
            addDataScheme("package") // I could not find a constant for that :(
        })
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(broadcastReceiver)
    }
}