【问题标题】:How to know my Android application has been upgraded in order to reset an alarm?如何知道我的 Android 应用程序已升级以重置警报?
【发布时间】:2010-01-25 16:59:49
【问题描述】:

我注意到当设置此警报的应用程序升级后,警报被禁用。 这是真的吗?

到目前为止,我使用SharedPreferences 和FIRST_RUN 键来了解它是否是我的应用程序的第一次运行。如果我没有找到这个密钥,我启用警报并将FIRST_RUN 设置为 false,否则我什么也不做。

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

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

这种情况如何处理?

提前致谢

【问题讨论】:

    标签: android


    【解决方案1】:

    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 被任何应用程序的任何升级触发。

    【讨论】:

    • 路径部分仅在方案引用分层 URI 时使用。在不引用分层 URI 的“包”的情况下,您不能传递路径字符串。但是, 会将您的应用程序包附加到 URI(“package:your.app.package”),因此您无需传递路径。
    • 应用是否需要特殊权限才能收听 PACKAGE_REPLACED?
    • 不,该应用不需要特殊权限
    • android:path 正是我想要的!谢谢!
    • 有没有办法用这个动作调试“onReceive”方法?
    【解决方案2】:

    我自己从未尝试过,但是创建一个监听 ACTION_PACKAGE_REPLACED Intent 的 BroadcastReceiver 怎么样?

    我之前曾考虑过尝试此方法,但我不确定它是否存在先有鸡还是先有蛋的问题(例如,是否在新升级的应用程序接收到 Intent 之前发送了 Intent?)。不过值得一试。

    【讨论】:

    • 是的,它有效!谢谢丹尼尔,实际上意图是在升级后发送的,所以我的接收器能够捕捉到它。我现在只是想知道我的接收器是否会在每次升级任何应用程序时触发?
    • 它会在您每次升级时触发,但是在文档中它说您可以查看 Intent 的数据,它会告诉您包的名称。因此,您可以使用意图过滤器过滤掉所有不属于您自己的包替换。
    • 应用是否需要特殊权限才能收听 PACKAGE_REPLACED?
    • 从 API 12 开始,您可以使用 MY_PACKAGE_REPLACED:developer.android.com/reference/android/content/…
    • 请不要再使用这个了。它会为每个应用程序的每次升级启动你的应用程序进程,这是非常低效的。使用此操作过滤 Intent 以将其限制为您的应用程序的唯一方法是使用仅在 API 19+ 上可用的 ssp 属性,因此我建议仅使用 MY_PACKAGE_REPLACED。
    【解决方案3】:

    Android API level 12及以上,需要注册BroadcastReceiver动作ACTION_MY_PACKAGE_REPLACED

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

    【讨论】:

    • 如果您支持现代 Android 操作系统,这是正确的答案。对于大多数应用程序(此时 Gingerbread 的市场份额为 1%),使用 MY_PACKAGE_REPLACED 可以简化广播接收器代码。
    【解决方案4】:

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

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

    【讨论】:

    • 这应该是唯一推荐的解决方案。只有在 API 19 之前,无法为本地应用正确过滤 android.intent.action.PACKAGE_REPLACED,并且让这个 Intent 为每次应用安装触发您的应用启动是非常低效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2011-06-27
    相关资源
    最近更新 更多