2010-01-25 28 views
62

我注意到,当设置此报警的应用程序已升级时,报警被禁用。 这是真的吗?如何知道我的Android应用程序已升级以重置闹钟?

到现在为止,我用SharedPreferencesFIRST_RUN键来知道它是否是我的应用程序的第一次运行。如果我没有找到这个键,我启用闹钟并将FIRST_RUN设置为false,否则我什么也不做。

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

所以升级后,FIRST_RUN键已经是假的,所以我什么都不做,而我的闹钟需要启用。

如何处理这种情况?

在此先感谢

回答

55

我从来没有尝试过这个自己,但有关创建BroadcastReceiver侦听到ACTION_PACKAGE_REPLACED意图是什么?

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

+1

是它的工作原理进行注册广播接收器!谢谢丹尼尔,实际上这个意图是在升级后发送的,所以我的接收器能够抓住它。我只是想知道,如果我的接收器将在每次升级任何应用程序时触发? – tbruyelle 2010-01-25 17:55:34

+1

它会在每次升级时触发,但是在文档中说它可以查看Intent的数据,它会告诉您包的名称。因此,您可以使用意向过滤器来过滤掉所有不属于您自己的软件包替换。 – 2010-01-25 17:58:10

+1

该应用是否需要特殊权限才能收听PACKAGE_REPLACED? – 2012-11-28 12:33:45

86

解决方案由丹尼尔·卢:

需要在清单如下的接收机:

<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的“包”,不能传递路径字符串。但是,会将您的应用程序包附加到URI(“package:your.app.package”),因此您无需传递路径。 – toc777 2012-04-09 17:37:07

+1

该应用程序是否需要特殊权限才能收听PACKAGE_REPLACED? – 2012-11-28 12:34:04

+1

没有应用程序不需要特别许可 – tbruyelle 2012-11-28 13:35:00

19

简单地说,听android.intent.action.MY_PACKAGE_REPLACED ...这INTENT会通知你,如果你的应用程序的新版本已经安装在现有的一个

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

+1

这应该是唯一推荐的解决方案。没有办法在API 19之前正确过滤本地应用程序的android.intent.action.PACKAGE_REPLACED,并且让这个Intent触发您的应用程序启动对于每个应用程序安装都是非常低效的。 – BladeCoder 2017-02-08 17:58:14

16

为Android OS V12及以上,你需要用行动ACTION_MY_PACKAGE_REPLACED

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

如果您支持现代Android操作系统,这是正确的答案。对于大多数应用程序(姜饼在这个市场份额的1%),使用MY_PACKAGE_REPLACED简化了广播接收器代码。 – 2017-01-20 22:12:24

相关问题