android - 如何在 Android 中设计同步服务

标签 android android-service android-sqlite android-syncadapter android-service-binding

我们有一个问题,我们需要在后台定期从我们的服务器同步大量信息,并将其保存在我们的 SQLite 数据库中。

在我看来,我有一些选择,只是不太确定我是否完全理解所有的后果。

1) 有一个进程内服务器,START_STICKonStartCommand 返回,并添加 PeriodicSyncs(大概在 Application#onCreate 上)。

2) 有一个带有 START_STICKY 的进程内服务器,它对计时器任务进行排队并定期更新数据库。

3) 让 Service 在它自己的进程中运行并写入我们的 SQLite 数据库。

所以,这里是问题:

a) 选项 #1 和 #2 是否排除了 SyncAdapter?运行 SyncAdapter 有什么好处? (除了必须在 Service 上启动一个新的 Thread 来发出 HTTP 请求之外)

b) #1 和 #2 是否在我的应用程序被销毁后仍然存在?如果他们这样做,他们会带回整个应用程序吗?

c) 我可以用 #3 写入我的 SQLite 数据库吗?我猜是的,因为他们会使用相同的用户 ID,对吗?

d) 在#3 和主要申请流程之间来回对话的最简单方法是什么?广播接收器?其中大部分将通过纯粹使用带有通知 URI 的 Cursor

来处理

e) 只是一般的想法、优点/缺点等:)

最佳答案

  1. Android 同步框架的主要优点是您无需实现自己的框架。
  2. addPeriodicSync() 将同步设置写入系统,意味着告诉 Android 同步框架定期运行您的同步适配器。所以你不需要实现你自己的调度器。 (您需要持有WRITE_SYNC_SETTINGS权限)
  3. 实现自定义(不是 stub )ContentProvider 并对其执行 CRUD。管理进程间通信是 Content Provider 的主要功能之一,因此您不需要广播。相反,使用 ContentProvider + Loader ( http://developer.android.com/guide/components/loaders.html ) 更新游标。

内容提供者:

class MyContentProvider extends ContentProvider {
    public Uri insert(...) {
        ...
        mDbHelper.getWritableDatabase.insert(...);
        ...
    }
}

同步适配器:

class MySyncAdapter extends AbstractThreadedSyncAdapter {
    public void onPerformSync(...) {
        ...
        new ContentResolver(getContext()).insert(...);
        ...
    }
}

关于android - 如何在 Android 中设计同步服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811609/

相关文章:

java - 如何使用 java 代码创建简单的 Android TextView 并在其上显示文本?

android - 使用 HashMap 填充 Spinner?

Android IntentService 以空 Intent 触发

java - 为什么一个后台线程与主服务线程具有相同的线程ID?

database - 我是否使用 sqlite 破坏了我的磁盘?

java - 在项目点击时发送字符串

安卓。在另一个布局上的透明布局

Android SyncAdapter 不在我的设备 Samsung S6 Edge Plus Nougat 上同步(在 API<=23 上定期同步)

android - 如何在android中使用现有数据库?

android - 重新初始化 SQLite 数据库后抛出异常