【问题标题】:Sharing and persisting data between multiple Android applications在多个 Android 应用程序之间共享和持久化数据
【发布时间】:2014-11-06 20:58:25
【问题描述】:

我正在开发一组需要共享通用状态和配置设置的复杂 Android 应用程序。

例如,看这张解释我的场景的图片:

我希望 APP 1、APP 2 和 APP 3 能够访问(读/写)公共存储区域的数据。 此外,我需要卸载保护,即我不希望在用户卸载任何应用程序时删除数据。

我已经阅读了有关 SQLite 数据库、ContentProviders 以及在内部和外部存储上的写作,但上述每种方法都有如下所列的缺点:

  • SQLite 数据库:DB 在应用卸载时被删除,并且对每个应用都是私有的
  • ContentProvider:移除带有 ContentProvider 的应用时,数据被移除
  • 内部存储:每个应用程序都是私有的,数据在应用程序卸载时被删除 (http://developer.android.com/training/basics/data-storage/files.html#InternalVsExternalStorage)
  • 外部存储:不可靠(用户可以移除 SD 卡)
  • 存储在服务器上:不可能,用户可能没有可靠的互联网连接

编辑:

我不希望对 Google Play 服务有任何依赖,因为我将通过 Play 商店分发应用程序并作为第 3 方下载。

请帮帮我。

【问题讨论】:

  • External storage: Is unreliable (user may remove SD card)。错误观念。在大多数设备上,外部存储器是内置的。如果您添加一个微型 SD 卡,那么它就是可移动存储器,但通常称为外部存储器。
  • 你能解决这个问题吗?
  • 你找到解决这个问题的方法了吗?

标签: android sqlite android-contentprovider android-external-storage


【解决方案1】:

Google 云端硬盘可以为您做到这一点。您基本上获得了对由远程文件系统支持的本地文件系统的权限。在大多数手机上,这是预装的,因此您担心的卸载问题不再是问题。

您可以为您的应用创建一个文件夹,然后您可以读取/写入。

https://developers.google.com/drive/android/

【讨论】:

  • 但是如果用户没有安装 Play 服务怎么办?在这种情况下,这种方法会失败。
  • 如果您的目标市场是 Google Play 商店(这涵盖了大多数手机的数量),那么您可以让他们安装 google play 服务(API 调用)。如果您担心这是一个问题,我建议您非常擅长 bizdev,让所有大型手机制造商都将您的远程文件系统应用程序预安装在系统分区中,这样普通用户就无法将其从手机中删除;)然后您就可以满足您的所有要求。卸载证明要求与将应用程序和数据合二为一的应用程序模型背道而驰。
【解决方案2】:

您可以使用共享首选项对象从文件中读取和写入首选项数据。最重要的是使用 MODE_MULTI_PROCESS。如果多个进程正在改变同一个 SharedPreferences 文件,则使用位 MODE_MULTI_PROCESS。

使用以下代码:

SharedPreferences shPrefernces = context.getSharedPreferences("filename", MODE_MULTI_PROCESS);
String s1 = shPrefernces.getString("keytosearch1", "");
String pass = shPrefernces.getString("keytosearch2", "");

【讨论】:

  • 这个文件会存放在哪里?
  • SharedPreferences 存储在应用数据文件夹中的 xml 文件中,即 /data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml 或默认首选项位于:/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME_preferences运行时添加的 .xml SharedPreferences 不存储在 Eclipse 项目中。
  • 使用 MODE_MULTI_PROCESS 保存敏感数据是否安全?
  • 此标志与安全无关,但与访问并发性有关。如果您浏览文档,它建议使用 MODE_MULTI_PROCESS 在多个进程之间共享首选项。每次要写入或读取首选项时使用 Context.getSharedPreferences(...) 也不是过程安全的。
  • 是的,卸载应用程序时,数据文件夹会被删除。所以这行不通。 Multiprocess 标志仅确保具有共享首选项的访问凭据的进程在从 SharedPreferences 实例读取时始终看到相同的状态。它实际上更慢,因为您必须在每次访问时检查磁盘并且不能解决任何 OP 的标准。除非你使用 WORLD_WRITEABLE WORLD_READABLE 在这种情况下每个人都可以读写它,但我怀疑那是真正想要的
【解决方案3】:

我同意使用 world_readable 的 Shared Preferences 对您来说是不够的,或者无法通过 Internet 共享,但您仍然可以做一件事。

使用广播接收器和自定义广播。 在具有共享偏好的所有应用程序中具有冗余公共数据。

更新数据的人将向系统发送广播。 所有的应用程序都实现了广播接收器。每当收到新广播时,他们都会更新共享偏好中的数据。 应用 A -> 数据更新时发送广播。

如果已经安装了 App B,则 App B 也会接收广播并保存来自该意图的数据。

如果应用 B 更新新数据。 APP B -> 为公共数据发送广播 其他应用会更新数据。

  • 删除所有应用后,只会丢失常用数据。如果至少安装了一个应用,则数据仍然存在。

【讨论】:

    【解决方案4】:

    偏好数据将始终存储在每个应用程序自己的上下文中。使用 sharedUserId 并在所有应用程序中创建一个新的首选项文件。打开每个应用程序时,应用程序必须从所有其他应用程序上下文中检查首选项值,并应根据首选项中可用的最后更新时间值写入其首选项以查找最新更新的时间值。

    无论何时打开任何应用程序,都会将最新数据存储在其本地。如果安装或卸载了任何应用程序,这应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多