【问题标题】:Is there any way to receive implicit broadcasts in android API 26 and above有没有办法在 android API 26 及更高版本中接收隐式广播
【发布时间】:2021-11-25 08:45:16
【问题描述】:

如果目标设备上的应用程序更新或卸载,我想接收广播。根据文档,我可以使用ACTION_PACKAGE_REPLACEDACTION_PACKAGE_REMOVED

替换操作:已安装新版本的应用程序包,替换之前安装的现有版本。

删除操作:现有应用程序包已从设备中删除。数据包含包的名称。被移除的包没有收到这个 Intent。

所以我在前台服务中实现了这个:

        val mIntentFilter = IntentFilter()
        mIntentFilter.addAction("android.intent.action.PACKAGE_REMOVED")
        mIntentFilter.addAction("android.intent.action.PACKAGE_REPLACED")
        mIntentFilter.addDataScheme("package")
        this.registerReceiver(applicationReceiver, mIntentFilter)

它非常适合删除动作,但不幸的是,我没有收到任何更新动作的广播。

我发现这是因为 Google 对 API 26 及更高版本施加的限制:

作为 Android 8.0(API 级别 26)后台执行限制的一部分,以 API 级别 26 或更高级别为目标的应用不能再在其清单中为隐式广播注册广播接收器。

由于这是我的应用程序的主要功能之一,任何人都可以帮我解决这个问题吗?

【问题讨论】:

    标签: android kotlin broadcastreceiver


    【解决方案1】:

    你可以试试这个

    class Test(var context: Context) {
      var version: Long = -1
      var pm: PackageManager = context.packageManager
      var e: PackageManager.NameNotFoundException? = null
    
      init {
          val info = pm.getPackageInfo("com.google.maps", 0)
          version = if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P) {
                        info.longVersionCode
                    } else info.versionCode.toLong()
       }
    
      init {
          e!!.printStackTrace()
       }
    

    }

    然后将检索到的值与存储的值进行比较

    【讨论】:

    • 谢谢,它可能很有用,但我正在寻找一种即时的方法
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多