【问题标题】:Android detect when app is going to be updatedAndroid检测应用程序何时更新
【发布时间】:2013-01-31 09:38:12
【问题描述】:

我正在开发一个安卓应用程序,当用户进行市场更新时我需要保存数据。实际上在更新开始之前。我尝试使用 onDestroy() 但更新应用程序时不会调用它。你有什么想法吗?

问题是应用程序会定期保存数据。有时会发生这种情况,当您选择更新时,它会尝试在同一时间保存文件,导致数据损坏......这就是我试图检测更新事件的原因。

使用计划线程(例如 60 秒)以固定间隔保存文件。同样在文件中,我使用经典的 writeObject() 保存了一个序列化对象。这仅以 60 秒的固定速率发生,并且在 Activity 的 onPause 或服务的 onDestroy() 上发生。

但是,如果固定速率保存恰好在更新时发生(这会导致应用程序被销毁),则保存不完整并且对象会损坏,从而导致下次启动应用程序时从保存文件中获取无效对象。

【问题讨论】:

  • 我不明白你的问题。你的意思是当你的应用程序最小化时你需要保存数据?或者当用户将应用程序更新到较新版本时?
  • onDestroy 在没有使用 Activity 并且 Android 需要释放一些内存时调用。它与更新 android market 中的应用程序无关。
  • 问题是应用程序定期保存数据。有时会发生这种情况,当您选择更新时,它会尝试在同一时间保存文件,导致数据损坏......这就是我试图检测更新事件的原因。

标签: android ondestroy


【解决方案1】:

在 android 上保存数据(来自 Android developpers documentation)的一般方法是使用:

  • 共享首选项上的键值对
  • 将数据保存在文件中
  • 或使用 SQLite 数据库

即使在常规活动生命周期中,您也应该使用它们,我不明白为什么它们也不能解决您在更新之间的持久性需求。

为了避免损坏,如果您使用 SQL,请使用 SQLite Transaction,并在处理文件时检查此question 以了解损坏安全策略。

【讨论】:

  • 我想我说得不够清楚。我知道那些保存数据的方法。我正在使用文件一的数据。问题是该应用程序定期保存数据。有时会发生这种情况,当您选择更新时,它会尝试在同一时间保存文件,导致数据损坏......这就是我试图检测更新事件的原因。
  • 您能否修改问题以包括您如何在关闭/销毁时保存数据以及您在启动时正在做什么?我想知道您处理这些文件的方式是否没有问题
  • 使用预定线程(例如 60 秒)以固定间隔保存文件。同样在文件中,我使用经典的 writeObject() 保存了一个序列化对象。这仅以 60 秒的固定速率发生,并且也在活动的 onPause 或服务的 onDestroy() 上发生。但是,如果固定速率保存恰好在更新时发生(这会导致应用程序被破坏),则保存不完整并且对象已损坏,从而导致下次启动应用程序时从保存文件中获取无效对象。
  • 还有关于 SQLite... 它安全吗?我的意思是,如果你有一部 root 手机,你可以访问任何数据库吗?
  • 如果您的手机已root,您可以访问任何内容。 SQLite 数据库,私人偏好和文件,任何东西。如果您有真正私人数据(例如密码),无论您将其保存在何处,都应该对其进行加密。
【解决方案2】:

AFAIK 无法知道您的应用何时会更新(您不会收到与软件包相关的意图,因为在更新期间您的应用不再安装)。它将像往常一样简单地停止,所有广播接收器都取消注册并更新。

然而,您可以做的是在您的应用程序中添加检查,以便在启动时检查它是否刚刚更新,如果是,则执行您必须做的任何事情。这非常简单,只需将应用程序的当前版本(您可以通过PackageManager 获取)存储在共享首选项中,并在每次应用程序启动时检查存储的版本与当前版本。

【讨论】:

  • 我没有这个问题。问题是何时实际触发更新。请查看我的帖子,因为我更详细地解释了我的问题
  • 哦,好的,我知道你的问题出在哪里了。在这种情况下,@Thomas 的答案是正确的。只需确保完成数据写入并关闭组件的onPause 方法中所有打开的文件/数据库/首选项对象即可。
猜你喜欢
  • 2012-07-08
  • 2017-06-14
  • 2014-08-30
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多