安卓同步适配器 : how to get notified of specific sync happened

标签 android android-networking android-syncadapter

我有以下场景。

我在我的应用程序中使用 SyncAdapter 从服务器下载数据。

当用户打开应用程序时,我调用 requestSync() 以确保最新数据可用。

当用户请求时,我再次调用 requestSync() 传递我要下载的特定数据包。

问题如下:

我可以使用 SyncStatusObserver 获得有关下载状态的通知,但不会告诉我哪个同步已完成:

例如:

  • 在应用程序启动时,我开始了一个“Total”同步,

  • 然后用户请求刷新特定数据,因此我启动了“数据 foo 的特定同步”

  • SyncStatusObserver 会告诉我同步处于待定/Activity 状态,但不会告诉我这是“Total” 同步还是 < strong>“数据foo的特定同步”

我该怎么做?

Intent 广播是唯一的方式吗?

最佳答案

SyncStatusObserver 不会告诉您这一点,但有多种方法可以实现,这在很大程度上取决于您的架构。

这是一个对我们有用的:

我们计划让我们的 SyncAdapter 返回另一个 IBinder 并在将我们的 SyncService 与特定操作绑定(bind)时返回那个。此 IBinder 对象将提供有关同步适配器当前状态的信息。这是可行的,因为只有一个同步服务实例,而我们的同步服务恰好包含同步适配器的一个实例。

这是一个简单的例子:

目前我们同步服务的onBind(Intent)方法是这样的:

@Override
public IBinder onBind(Intent intent)
{
    return sSyncAdapter.getSyncAdapterBinder();
}

sSyncAdapter 是我们同步适配器的静态实例。

我们计划将其更改为如下内容:

public final static ACTION_SYNC_INFO = "com.example.SYNC_INFO";

@Override
public IBinder onBind(Intent intent)
{
    if (ACTION_SYNC_INFO.equals(intent.getAction())
    {
        // sync info binder has been requested
        return sSyncAdapter.getSyncInfoBinder();
    }
    // otherwise return the sync adapter binder
    return sSyncAdapter.getSyncAdapterBinder();
}

在我们的 Activity 中,我们绑定(bind)我们的同步服务并设置操作 SyncService.ACTION_SYNC_INFO。这告诉同步服务返回同步信息绑定(bind)器而不是同步适配器绑定(bind)器。

Binder 将有一个如下所示的界面:

public interface SyncInfoBinder extends IBinder
{
    public boolean isTotalSync();
}

当然,同步适配器仍然需要实现这个方法(在您的情况下)可能如下所示:

private abstract class AbstractSyncInfoBinder extends Binder implements SyncInfoBinder
{
}

private final IBinder mSyncInfoBinder = new AbstractSyncInfoBinder()
{
     @Override
     public boolean isTotalSync()
     {
          // return some field that was set by your onPerformSync method
          return mCurrentSyncIsTotalSync;
     }
}

public IBinder getSyncInfoBinder()
{
    return mSyncInfoBinder
}

当然,如果您的同步适配器设置为单线程,那么这很容易工作。对于多线程同步适配器,您必须采取额外的步骤来确保您获得所有正在进行的同步的状态。

无论如何,这是从同步适配器获取实时结果并将其呈现在您的 UI 中的好方法。

关于安卓同步适配器 : how to get notified of specific sync happened,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35147093/

相关文章:

android - 在android中上传高分辨率图像

android - 用户登录后重新运行/继续 SyncAdapter

android - 当应用程序未运行时在后台运行 SyncAdapter

java - 改善月球车的运动

android - 更改/删除图表引擎标签背景色

android - udp转发到模拟器

android - 如何判断网络类型是2G、3G还是4G

android - SyncAdapter 可以修改另一个 SyncAdapter 添加的 RawContacts 吗?

android - Android 上的 Titanium.UI.createTableViewRow

android - 搜索 查看更改搜索菜单项图像