:로
int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, syncObserver);
syncObserver가 정의된다. ContentResolver의 getCurrentSyncs() 또는 getCurrentSync() 메서드 중 사용할 수있는 메서드를 사용하는 것이 좋습니다. 아래의 메소드는 동기화 작업이 현재 계정과 권한에 대해 작동하는지 확인합니다. API 레벨 8 (Froyo = Android 2.2)이 필요합니다.
private static boolean isSyncActive(Account account, String authority)
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
return isSyncActiveHoneycomb(account, authority);
} else
{
SyncInfo currentSync = ContentResolver.getCurrentSync();
return currentSync != null && currentSync.account.equals(account) &&
currentSync.authority.equals(authority);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private static boolean isSyncActiveHoneycomb(Account account, String authority)
{
for(SyncInfo syncInfo : ContentResolver.getCurrentSyncs())
{
if(syncInfo.account.equals(account) &&
syncInfo.authority.equals(authority))
{
return true;
}
}
return false;
}
활동은 onDestroy()
에서 onResume()
에서 업데이트 및 등록 취소에 대한 등록합니다. 또한 현재 상태를 따라 잡기 위해 onResume()
에서 상태를 수동으로 업데이트해야합니다.
여기에 바로 그런 구현이 있습니다. 서브 클래스 자체는 어떤 계정
- 는
- 은 무엇 authoritity (현장
CONTENT_AUTHORITY
) 유지해, 동기 상태를 표시하는 방법을
- 사용 (
getAccount()
구현)를 사용하여 정의해야합니다 (구현을 updateState(boolean isSynchronizing)
)
나는 희망 그것은 미래에 누군가를 도울 것입니다.
import android.accounts.Account;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.SyncInfo;
import android.content.SyncStatusObserver;
import android.os.Build;
import android.os.Bundle;
public abstract class SyncActivity extends Activity
{
private static final String CONTENT_AUTHORITY = "com.example.authority";
private Object syncHandle;
private SyncStatusObserver observer;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
observer = new SyncStatusObserver()
{
@Override
public void onStatusChanged(int which)
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
Account account = getAccount();
boolean isSynchronizing =
isSyncActive(account, CONTENT_AUTHORITY);
updateState(isSynchronizing);
}
});
}
};
}
@Override
protected void onResume()
{
super.onResume();
// Refresh synchronization status
observer.onStatusChanged(0);
// Watch for synchronization status changes
final int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING |
ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, observer);
}
@Override
protected void onPause()
{
super.onPause();
// Remove our synchronization listener if registered
if (syncHandle != null)
{
ContentResolver.removeStatusChangeListener(syncHandle);
syncHandle = null;
}
}
private static boolean isSyncActive(Account account, String authority)
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
return isSyncActiveHoneycomb(account, authority);
} else
{
SyncInfo currentSync = ContentResolver.getCurrentSync();
return currentSync != null && currentSync.account.equals(account)
&& currentSync.authority.equals(authority);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private static boolean isSyncActiveHoneycomb(Account account,
String authority)
{
for(SyncInfo syncInfo : ContentResolver.getCurrentSyncs())
{
if(syncInfo.account.equals(account) &&
syncInfo.authority.equals(authority))
{
return true;
}
}
return false;
}
protected abstract Account getAccount();
protected abstract void updateState(boolean isSynchronizing);
}
Eclair, Froyo, Gingerbread의 경우 위의 해결 방법은 기기에 계정이 하나 뿐인 경우에만 사용할 수 있습니다. 기기에 둘 이상의 계정이있는 경우 첫 번째 계정은 동기화 만됩니다. 나머지는 무시됩니다. – ChuongPham