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