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

时间:2013-12-18 17:05:51

标签: android contacts sync android-syncadapter

在我的应用程序中,我使用的是联系人同步适配器,但它有很多与主应用程序共享的信息。适配器需要进行适当的设置(例如登录信息以及用户是否更改了任何同步设置),因此我目前在相同的过程中运行它,并使用getApplicationContext()与主ap进行通信,并且然后我在同步过程中同步适配器使用的Application中有一些共享变量。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

1)如果您希望自己的服务能够承受主应用程序的流程销毁(但START_STICKY对于该情况绰绰有余),

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

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

要与在单独进程中运行的Service进行通信,请使用Bound Services

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

答案 2 :(得分:1)

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

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

在单独的进程之间维护共享数据很难。对于登录凭据和偏好设置,我猜您可以使用SharedPreferencesOnSharedPreferenceChangeListener的组合。