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

tbr*_*lle 67 android

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

到目前为止,我使用了SharedPreferences一个FIRST_RUN键,以便知道它是否是我的应用程序的第一次运行.如果我找不到这个键,我启用闹钟并设置FIRST_RUN为false,否则我什么都不做.

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

所以在升级之后,FIRST_RUN密钥已经是假的,所以当我的警报需要启用时我什么都不做.

如何处理这种情况?

提前致谢

tbr*_*lle 89

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>
Run Code Online (Sandbox Code Playgroud)

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

  • 仅当方案引用分层URI时才使用路径部分.如果"package"不引用分层URI,则无法传递路径字符串.但是,<data android:scheme ="package"/>会将您的应用程序包附加到URI("package:your.app.package"),因此无论如何都不需要传递路径. (7认同)

Dan*_*Lew 58

我自己从未尝试过这个,但是创建一个BroadcastReceiver倾听ACTION_PACKAGE_REPLACEDIntent的内容呢?

我之前想过尝试过这个,但我不确定它是否存在鸡与蛋的问题(例如,在新升级的应用程序可以接收之前,Intent是否会被发送?).值得一试.

  • 从API 12开始,您可以使用MY_PACKAGE_REPLACED:http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED (33认同)
  • 请不要再使用它了.它将为每个应用程序的每次升级启动您的应用程序进程,这是非常低效的.使用此操作过滤Intent以将其限制为应用程序的唯一方法是使用仅在API 19+上可用的ssp属性,因此我建议仅使用MY_PACKAGE_REPLACED. (2认同)

Sam*_*awy 21

简单地说,听听android.intent.action.MY_PACKAGE_REPLACED... INTENT如果您的应用程序的新版本已安装在现有版本上,则会通知您

注意:此意图可从API 12开始提供


arm*_*n13 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>
Run Code Online (Sandbox Code Playgroud)