Android SyncAdapter:如何获得发生特定同步的通知
Android SyncAdapter: how to get notified of specific sync happened
我有以下场景。
我在我的应用程序中使用 SyncAdapter 从服务器下载数据。
当用户打开应用程序时,我调用 requestSync()
以确保最新数据可用。
当用户请求时,我再次调用 requestSync()
传递我要下载的特定数据包。
问题如下:
我可以使用 SyncStatusObserver
获取有关下载状态的通知,但不会告诉我哪个同步已完成:
例如:
在应用程序启动时我开始 "Total" 同步,
然后用户请求刷新特定数据,因此我启动了 "Specific sync of datum foo",
SyncStatusObserver
会告诉我同步是 pending/active,但不会告诉我那是不是 "Total"同步或"Specific sync of datum foo"
我该怎么做?
意图广播是唯一的方式吗?
SyncStatusObserver
不会告诉你这个,但有多种方法可以实现,这在很大程度上取决于你的架构。
这是对我们有用的:
我们计划让我们的 SyncAdapter
return 另一个 IBinder
和 return 在将我们的 SyncService
与特定操作绑定时。这个 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 中,我们绑定我们的同步服务并设置操作 SyncService.ACTION_SYNC_INFO
。这告诉同步服务 return 同步信息绑定器而不是同步适配器绑定器。
活页夹将有一个如下所示的界面:
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 中的好方法。
我有以下场景。
我在我的应用程序中使用 SyncAdapter 从服务器下载数据。
当用户打开应用程序时,我调用 requestSync()
以确保最新数据可用。
当用户请求时,我再次调用 requestSync()
传递我要下载的特定数据包。
问题如下:
我可以使用 SyncStatusObserver
获取有关下载状态的通知,但不会告诉我哪个同步已完成:
例如:
在应用程序启动时我开始 "Total" 同步,
然后用户请求刷新特定数据,因此我启动了 "Specific sync of datum foo",
SyncStatusObserver
会告诉我同步是 pending/active,但不会告诉我那是不是 "Total"同步或"Specific sync of datum foo"
我该怎么做?
意图广播是唯一的方式吗?
SyncStatusObserver
不会告诉你这个,但有多种方法可以实现,这在很大程度上取决于你的架构。
这是对我们有用的:
我们计划让我们的 SyncAdapter
return 另一个 IBinder
和 return 在将我们的 SyncService
与特定操作绑定时。这个 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 中,我们绑定我们的同步服务并设置操作 SyncService.ACTION_SYNC_INFO
。这告诉同步服务 return 同步信息绑定器而不是同步适配器绑定器。
活页夹将有一个如下所示的界面:
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 中的好方法。