如何从Android SyncAdapter收听进度?

mob*_*bob 6 android listener android-syncadapter

我记得读过同步适配器的广播接收器接口或同步进度事件的一些ResultReceiver.SyncAdapter模式中是否有内置的东西,或者是自己种植的?

Let*_*all 11

我刚从同步适配器实现了一个广播接收器,它就像发条一样!

使用Receiver设置为内部类并在onCreate中调用registerReceiver并在onDestroy中调用unregisterReceiver为我做了这个.

由于我有一个策略方法来生成和查询多个线程,所以我在SyncAdapter运行的开头就是:

Intent intent = new Intent();
intent.setAction(ACTION);
intent.putExtra(SYNCING_STATUS, RUNNING);
context.sendBroadcast(intent); 
Run Code Online (Sandbox Code Playgroud)

在同步运行结束时,我有:

intent.putExtra(SYNCING_STATUS, STOPPING);
context.sendBroadcast(intent); 
Run Code Online (Sandbox Code Playgroud)

在我的活动中,我声明:

onCreate(Bundle savedInstance){

super.onCreate(savedInstance);
SyncReceiver myReceiver = new SyncReceiver();
RegisterReceiver(myReceiver,ACTION);

}



onDestroy(){

super.onPause();
unRegisterReceiver(myReceiver);

}



 public class SyncReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
            Bundle extras = intent.getExtras();
    if (extras != null) {
        //do something  
    }
   }
 }
Run Code Online (Sandbox Code Playgroud)

对于此方案,您无需将接收器添加到清单文件中.只是按原样使用!

  • 虽然这适用于大多数情况,但它不会处理在SyncAdapter已经运行时启动Activity的情况.您将不会收到初始广播.(如果您考虑在SyncAdapter端创建一个接收器来响应状态请求,那么问题就是它在与适配器本身相同的线程中运行,并且不会按时响应.) (5认同)

jcw*_*ger 5

什么有效:

在2010 Google IO会话中建议的方法,开发Android REST客户端应用程序是将列作为标记放入ContentProvider,以指示正在提取或放置记录等.这允许每行微调器(或其他视觉更改)放在你的用户界面中.您可以通过驱动ListView的自定义CursorAdapter来实现.您的ContentProvider可以根据需要更改标志.

什么不:

您还可以使用SyncStatusObserver - 这几乎没用,因为它会响应每次状态更改,而不仅仅是您的特定帐户/内容授权对,并且除了发生更改之外,实际上并没有告诉您任何其他内容.因此,您无法分辨正在同步的内容,并且无法区分"同步事件的开始"和"同步事件结束".一文不值.:P