5

我正在开发一个Android应用程序,它与服务器执行后台同步(使用SyncAdapter和认证等)。有没有人在Android SyncObserver上实现(或获得更多信息)

当前台应用程序(带UI)启动时,可能正在进行背景同步,或者可以选择通过UI按钮启动它。

我想要一种“插入”正在进行的后台同步(无论是由系统启动,还是定期同步设置或用户界面),并显示它在前台活动中的进度。

ContentResolver文档(http://developer.android.com/reference/android/content/ContentResolver.html)提到了一个神秘的“SyncObserver”,它没有链接到javadoc,没有记录(我可以找到) 。

还有一些其他网页提到它(http://www.chinaup.org/docs/migrating/m5-0.9/changes/android.content.ContentResolver.html)但我找不到更多关于它。

有没有人实现过这个野兽?

如果没有,有没有人有跟踪前台活动中的后台同步进度的示例代码或建议?

回答

3

我遇到了同样的问题,最终实现了1)来自SyncAdapter的广播,2)使用SharedPreferences来指示状态。

在SyncAdapter,像这样的:

public static final String START_SYNC = "com.whatever.sync.start"; 
public static final String STOP_SYNC = "com.whatever.sync.stop"; 
public static final String SYNC_PROGRESS = "syncProgress"; 


public void onPerformSync(Account account, Bundle extras, String authority, 
    ContentProviderClient provider, SyncResult syncResult) { 

     // Add an integer to the shared settings to indicate the status 
     SharedPreferences settings = mContext.getSharedPreferences(Constants.PREFS, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt(SyncAdapter.SYNC_PROGRESS, 0); 
     editor.commit(); 

     Intent intent = new Intent(); 
     intent.setAction(START_SYNC); 
     mContext.sendBroadcast(intent); 


     //... do some stuff, setting SYNC_PROGRESS to other values and 
     // sending more broadcasts as the state changes 

     // When we are done, remove the "in progress" setting and store some 
     // other data 
     editor.putString(SyncAdapter.LAST_UPDATED, new Date().toString()); 
     editor.remove(SyncAdapter.SYNC_PROGRESS); 
     editor.commit(); 

     Intent stopIntent = new Intent(); 
     stopIntent.setAction(STOP_SYNC); 
     mContext.sendBroadcast(stopIntent); 
     } 

在活动中,我们做两件事情在简历1)检查共享偏好同步是否正在进行中,2)注册侦听用接收器广播。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
// .. do some UI stuff 

    mReceiver = new SyncReceiver(this); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(SyncAdapter.START_SYNC); 
    intentFilter.addAction(SyncAdapter.STOP_SYNC); 
    registerReceiver(mReceiver, intentFilter); 

    showProgress(); 
} 

public void showProgress() { 
    SharedPreferences settings = getSharedPreferences(Constants.PREFS, 0); 
    if (settings.contains(SyncAdapter.SYNC_PROGRESS)) { 
     // ... set the UI to show that a sync is in progress 
    } else { 
     // ... set the UI to show that a sync is NOT in progress 
    } 
} 

private class SyncReceiver extends BroadcastReceiver { 

    private MyActivity mActivity; 

    public SyncReceiver(MyActivity activity) { 
     mActivity = activity; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(SyncAdapter.START_SYNC)) { 
      Log.i("@string/app_name", "Started sync"); 
      mActivity.showProgress(); 
     } 
     else if (intent.getAction().equals(SyncAdapter.STOP_SYNC)) { 
      Log.i("@string/app_name", "Started sync"); 
      mActivity.showProgress(); 
     } 
    } 
} 

这似乎适用于我。我必须承认,由于广播的异步性,我感觉有一些潜在的问题。任何关于改进我的方法的意见,将不胜感激!

+0

我觉得这个唯一的问题,就是因为你暗示,涉及到后台同步的异步性质。 – 2011-06-06 14:32:43

+0

我不知道ContentResolver.isSyncActive(),这可能是不是检查sharedpreference更好。谢谢。 – fredw 2011-06-06 17:47:14

5

感谢您的回答。

由于背景的异步性质同步您的应用程序(活动)可以与后台同步已经开始,你与存储在偏好状态检测开始。

我所做的是实现一个SyncObserver类,该类实现SyncStatusObserver接口并在挂起/恢复时创建/销毁。

syncObserverHandle = ContentResolver.addStatusChangeListener(ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, new SyncObserver()); 

这被通知同步有关的任何活动(待定,开工等),我也使用

ContentResolver.isSyncActive(); 

Android的API来这是非常基本的检查情况,你必须尊重规则,关于什么是UI线程上完成的,哪些不是,但如果有人想看看我的实现只是张贴问题,并指出了我吧,我会高兴地回答。

+1

我想带你上你的实物:)你的解决方案听起来像它可能解决我的问题http://stackoverflow.com/questions/9268453/android-syncadapter-callback – JosephL 2012-03-08 22:30:34

+0

@Andrew Mackenzie我也喜欢看到你的实现,请回答上面给出的问题由JosephL – Thomas 2015-07-15 09:45:01

+0

@Thomas你应该看看[BasicSyncAdapter]的代码(https://developer.android.com/samples/BasicSyncAdapter/src/com.example.android.basicsyncadapter/EntryListFragment。 html#l82)from android google doc。特别是EntryListFragment的代码。 – hermannovich 2015-10-08 14:08:04

相关问题