如何知道我的Android应用程序已升级以便重置警报?


72

我注意到,设置此警报的应用程序已升级时,警报已禁用。真的吗 ?

直到现在,我都使用SharedPreferences带有的FIRST_RUN键,以了解它是否是我的应用程序的首次运行。如果找不到此键,则启用警报并将其设置FIRST_RUN为false,否则我什么也不做。

但我也注意到,在应用升级之间,这些偏好仍然保持不变!

因此,升级后,FIRST_RUN密钥已经为假,因此在需要启用警报时我什么也不做。

如何处理这种情况?

提前致谢

Answers:


63

我自己从来没有尝试过,但是如何创建一个BroadcastReceiver监听ACTION_PACKAGE_REPLACEDIntent的东西呢?

我曾经考虑过尝试此操作,但是不确定是否存在“鸡与蛋”问题(例如,是否在新的升级应用程序接收到Intent之前就发送了Intent?)。不过,值得一试。


1
是的,它有效!谢谢Daniel,实际上是在升级后立即发送意图的,所以我的接收者可以抓住它。我只是想知道我的接收器是否会在任何应用程序的每次升级时被触发?
tbruyelle

1
它会在每次升级时触发,但是在文档中说您可以查看Intent的数据,并会告诉您软件包的名称。因此,您可以使用意图过滤器来过滤掉所有非您自己的软件包。
丹·卢

1
该应用是否需要特殊权限才能收听PACKAGE_REPLACED?
AlikElzin-kilaka

37
从API 12开始,您可以使用MY_PACKAGE_REPLACED:developer.android.com/reference/android/content/…–
Maks

2
请不要再使用此功能。它将为每个应用程序的每次升级启动您的应用程序流程,这效率极低。使用此操作将Intent限制为您的应用程序的唯一方法是使用ssp属性,该属性仅在API 19+上可用,因此我建议仅使用MY_PACKAGE_REPLACED。
BladeCoder

92

Daniel Lew的解决方案:

在清单中需要以下行的接收器:

<receiver android:name=".OnUpgradeReceiver">
  <intent-filter>
    <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" android:path="your.app.package" />
  </intent-filter>
</receiver>

android:path用于防止OnUpgradeReceiver被任何应用程序的任何升级触发。


7
仅当方案引用分层URI时才使用路径部分。在“包”不引用分层URI的情况下,您不能传递路径字符串。但是,<data android:scheme =“ package” />会将您的应用程序包附加到URI(“ package:your.app.package”),因此您无论如何都无需传递路径。
toc777

1
该应用是否需要特殊权限才能收听PACKAGE_REPLACED?
AlikElzin-kilaka 2012年

1
没有应用程序不需要特殊许可
tbruyelle 2012年

android:path正是我想要的!谢谢!
praneetloke

1
有没有办法通过此操作调试“ onReceive”方法?
忍者编码

23

简单地,请听android.intent.action.MY_PACKAGE_REPLACED...。这INTENT将通知您是否已在现有应用程序上安装了新版本的应用程序

注意:此意图可以从API 12开始使用


1
这应该是唯一推荐的解决方案。仅在API 19之前,无法对本地应用程序正确过滤android.intent.action.PACKAGE_REPLACED,并且让该Intent触发每次应用安装的应用启动都是非常低效的。
BladeCoder

20

对于Android OS v12及更高版本,您需要通过ACTION_MY_PACKAGE_REPLACED操作注册BroadcastReceiver

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

如果您支持现代Android操作系统,这是正确的答案。对于大多数应用程序(目前,姜饼的市场份额为1%),使用MY_PACKAGE_REPLACED可以简化广播接收器代码。
Chantell Osejo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.