在Android中,联系人同步适配器应该在单独的进程中运行吗?

在我的应用程序中,我使用的是联系人同步适配器,但它有很多与主应用程序共享的信息。 有适配器需要工作的设置(如登录信息和用户更改任何同步设置),所以我目前在同一个进程中运行它,并使用getApplicationContext()与主ap通信,然后我在同步适配器正在同步过程中使用的Application中有一些共享variables。

但是在培训文档和一些在线教程中,示例适配器设置为在其自己的进程中运行 – 它在清单中使用android:process=":sync" 。 这有必要吗? 如果它确实在一个单独的进程中运行,我该如何与主应用程序进行通信?

在我们的上下文中,由于快速搜索要求,我们使用远程服务在内存中保存一个巨大的数据库。

我们使用远程服务而不是本地服务的原因是,我们认为在单独的过程中运行服务会使我们更难以达到每个进程限制的最大内存(限制因不同的设备和操作系统版本而异)。

在我们的初始设计中,我们使用的是AIDL 。 之后,我们切换到Messenger 。 我不记得背后的原因。 我将检查我们的源代码历史记录日志以找出原因。 但是,我认为主要是, Messenger不如AIDL复杂,我们不需要AIDL提供的multithreadingfunction。

在自己的流程中运行Service可能会有所帮助

1)如果您希望您的服务能够承受主应用程序的进程销毁(但START_STICKY对于该情况来说已经足够了),

2)如果您想为应用程序的所有“同步”任务指定此过程(如教程中所述),

3)如果您希望其他应用程序使用您的服务。

要与在单独进程中运行的Service通信,请使用绑定服务 。

但是,在单独的进程中运行服务会增加与之通信的复杂性,因此请考虑上述任何情况是否与您的应用程序目的相关。

我认为应该分开,但这不是必需的。

通常,如果可以独立于系统组件或其他应用程序使用Service进程,则将其分离是值得考虑的。 从这个角度来看,流程的生命周期应该独立于其他组件(例如同一应用程序中的Activity进行管理,因此Android可以轻松准确地标记当前使用的流程,以确定在内存不足的情况下要杀死哪个流程。 即使前端活动意外崩溃,服务也可以继续运行。

在单独的进程之间维护共享数据很难。 对于登录凭据和首选项,我猜你可以使用SharedPreferences和OnSharedPreferenceChangeListener的组合。

当应用程序启动时,它可以缓存不同的东西,特别是对于UI。 通过在不同的进程中拆分同步逻辑,您可以在设备内存不足时释放UI进程,从而释放这些UI缓存。

因此,这种技术主要是长期运行服务的应用程序感兴趣。 典型例子:

  • 在音乐应用中播放音乐的服务
  • 在Youtube上传video的服务

然而:

  • 这增加了应用程序的复杂性
  • 如果操作不正确,它实际上可以增加应用程序的总内存占用量