How to know my Android application has been upgraded in order to reset an alarm?
我注意到,设置此警报的应用程序已升级时,警报已禁用。是真的吗?
直到现在,我都使用SharedPreferences和FIRST_RUN键来确定它是否是我的应用程序的第一次运行。如果找不到此键,则启用警报并将FIRST_RUN设置为false,否则我什么也不做。
但是我也注意到,在应用升级之间这些首选项保持不变!
因此,升级后,FIRST_RUN键已经为假,因此在需要启用警报时我什么也不做。
如何处理这种情况?
预先感谢
Solution by Daniel Lew :
清单中需要以下行的接收者:
1 2 3 4 5 6
| <receiver android:name=".OnUpgradeReceiver">
<intent-filter>
<data android:scheme="package" android:path="your.app.package" />
</intent-filter>
</receiver> |
android:path用于防止任何应用程序的任何升级触发OnUpgradeReceiver。
-
仅当方案引用分层URI时才使用路径部分。对于不引用分层URI的" package ",则不能传递路径字符串。但是,<data android:scheme = " package " />会将您的应用程序包附加到URI(" package:your.app.package "),因此您无论如何都不需要传递路径。
-
该应用是否需要特殊权限才能收听PACKAGE_REPLACED?
-
否,该应用无需特殊许可
-
android:path正是我想要的!谢谢!
-
如果要在这种情况下重新启动应用程序,则需要为此接收器使用单独的应用程序,对吗?
-
它也可以用于新安装吗?还是我必须使用sharedprefs或其他方法分别处理?
-
有没有办法通过此操作调试" onReceive "方法?
-
在Android 4.2下进行测试后,我确认上述解决方案均不能正确地将Intent仅过滤到您的应用:如果仅指定方案,则将获得所有Intent。如果同时指定方案和路径,由于URI不是分层的,因此也会获得每个Intent。唯一有效的方法是使用ssp而不是路径,该路径需要API19。因此,最好使用MY_PACKAGE_REPLACED(API 12)或什么都不使用。推荐阅读:chris.orr.me.uk/android-ssp-data-intent-filter
我从来没有尝试过自己,但是如何创建一个BroadcastReceiver来监听ACTION_PACKAGE_REPLACED意图?
我之前曾考虑过尝试此操作,但不确定是否存在"鸡与蛋"问题(例如,是否在新的升级应用程序接收到Intent之前就发送了Intent?)。不过,值得一试。
- 是的,它有效!谢谢Daniel,实际上是在升级后立即发送意图的,所以我的接收者可以抓住它。我只是想知道我的接收器是否会在任何应用程序的每次升级时被触发?
-
它会在每次升级时触发,但是在文档中说您可以查看Intent的数据,并且会告诉您程序包的名称。因此,您可以使用意图过滤器来过滤掉所有非您自己的软件包。
-
该应用是否需要特殊权限才能收听PACKAGE_REPLACED?
-
从API 12开始,您可以使用MY_PACKAGE_REPLACED:developer.android.com/reference/android/content/…
-
请不要再使用此功能。它将为每个应用程序的每次升级启动您的应用程序流程,这是非常低效的。使用此操作将Intent限制为您的应用程序的唯一方法是使用ssp属性,该属性仅在API 19上可用,因此我建议仅使用MY_PACKAGE_REPLACED。
-
如果您使用的是12级及以上的API,则可以将MY_PACKAGE_REPLACED用于自己的应用程序。 developer.android.com/reference/android/content/…
只需听android.intent.action.MY_PACKAGE_REPLACED ... ... INTENT会通知您是否已在现有版本上安装了新版本的应用程序
注意:此意图可以从API 12开始使用
-
这应该是唯一推荐的解决方案。仅在API 19之前,无法对本地应用程序正确过滤android.intent.action.PACKAGE_REPLACED,并且让该Intent触发每次应用安装的应用启动都是非常低效的。
对于Android OS v12及更高版本,您需要使用操作ACTION_MY_PACKAGE_REPLACED
注册BroadcastReceiver
1 2 3 4 5
| <receiver android:name=".MyBroadcastReceiver">
<intent-filter>
</intent-filter>
</receiver> |
-
如果您支持现代Android操作系统,那么这是正确的答案。对于大多数应用程序(目前,姜饼的市场份额为1%),使用MY_PACKAGE_REPLACED可以简化广播接收器代码。