安卓应用程序更新广播

10

我正在处理一个需要知道设备上另一个应用程序何时更新的项目。所以我的问题很简单,比如说YouTube或Spotify在应用程序更新时是否会发送广播,如果是的话,我需要使用broadcastReceiver捕获什么。

3个回答

12

你的意图过滤器应该如下所示:

<intent-filter>
   <action android:name="android.intent.action.PACKAGE_REPLACED" />
   <data android:scheme="package" />
</intent-filter>

你的广播接收器(BroadcastReceiver)中的onReceive方法应该是:

@Override
public void onReceive(Context context, Intent intent) {
    Uri data = intent.getData();
    if (data.toString().equals("package:" + "com.target.package") {
        // action to do
    }
}

2
请检查另一个答案,该答案也使用了MY_PACKAGE_REPLACED - kingston

7
根据Android文档: 广播动作:新版本的应用程序已安装在现有的应用程序上。此广播仅发送给被替换的应用程序。它不包含任何额外的数据;要接收它,只需为此操作使用意图过滤器即可。
<intent-filter>
   <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
   <data android:scheme="package" />
</intent-filter>

你的BroadcastReceiver中的onReceive方法应该是:

@Override
public void onReceive(Context context, Intent intent) {
    // action to do

}

4
我认为正确的答案是删除 <data android:scheme="package" /> 并保持其余部分不变 - 在另一个帖子中发现,似乎有效。 - Ben
@Ben,你是对的,<data android:scheme="package" /> 应该被移除。 - Rafael

4

ACTION_PACKAGE_REPLACED 是一个与应用程序更新相关的操作。

根据文档:

一个应用程序包的新版本已安装,替换了以前安装的现有版本。数据包含软件包的名称。

intent.getPackage() 返回此意图特定寻址的软件包/应用程序,但它被发送给任何感兴趣的接收器,因此不存在这样的软件包。

请使用 intent.getData() 方法返回更新的软件包作为 Uri。

在 Manifest.xml 中注册广播接收器时添加以下意图过滤器:

<intent-filter>
   <action android:name="android.intent.action.PACKAGE_REPLACED" />
   <data android:scheme="package" />
</intent-filter>

1
这能用于您自己的应用程序吗?如果您的应用程序已更新,广播接收器会被执行吗? - Robert Estivill
@RobertEstivill 刚刚测试过了,可以。 - Vlad
很遗憾,当我更新自己的应用程序时它没有起作用。 - pa1.Shetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接