1

我想设置一个 BroadcastReceiver 来处理 PACKAGE_REPLACED,但我只想在我的包被替换时收到通知。如果我使用 scheme="package" 指定数据标签,它工作正常,但是当重新安装或升级任何应用程序时我会收到通知。我无法弄清楚我应该如何指定方案特定部分中的包名称 - 也就是说,当我的 BroadcastReceiver 在 onRecieve() 中获取意图时,如果我执行 intent.getData().getSchemeSpecificPart( ),这是包名,但有什么方法可以在我的意图过滤器中过滤吗?

4

2 回答 2

1

在 Google 搜索应用中使用:

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

但是根据我的粗略测试,这仍然可以捕获任何更新的包,这使得“android:path”部分实际上无用。

对于 Android 3.1+,您可以使用此新操作仅在您的包更新时做出响应:

<intent-filter>
  <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
</intent-filter>

如果您必须支持回 Android 2.x,更好的做法是为 和 声明 2 个单独的接收PACKAGE_REPLACEDMY_PACKAGE_REPLACED。然后在第一次运行时,检查运行时 Android 版本,如果版本是 3.1+,则禁用旧版本。

于 2013-01-24T17:09:45.457 回答
0

package如您所说,最简单的方法是使用该方案接受任何广播意图,但要根据Intent随操作发送的附加内容进行过滤PACKAGE_*

如果中的包名称Intent与您的不匹配,请忽略它。

于 2010-02-03T23:53:46.550 回答