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

问题描述 投票:5回答:2

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

android android-8.0-oreo
2个回答
7
投票

来自the docs

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

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

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

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

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


-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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.