用于在android和服务器之间同步数据的SyncService未启动

用于在android和服务器之间同步数据的SyncService未启动,android,android-service,android-contentprovider,android-syncadapter,android-service-binding,Android,Android Service,Android Contentprovider,Android Syncadapter,Android Service Binding,我目前正在尝试使用后台服务与服务器同步一些数据。使用以下网站作为指南: 我还搜索了StackOverflow,并尝试了以下解决方案: 不可能,因为我当前正在使用用户登录的帐户,并且该帐户已添加到帐户管理器中 通过使用intent启动服务,我可以让onCreate()为服务运行,但它不会在绑定时运行,并且当onChange运行ContentResolver.requestSync(…)时,适配器仍然不会被调用 此外,我目前已经使用requestSync(ACCOUNT、AUTH

我目前正在尝试使用后台服务与服务器同步一些数据。使用以下网站作为指南:

我还搜索了StackOverflow,并尝试了以下解决方案:

    • 不可能,因为我当前正在使用用户登录的帐户,并且该帐户已添加到帐户管理器中
    • 通过使用intent启动服务,我可以让onCreate()为服务运行,但它不会在绑定时运行,并且当onChange运行ContentResolver.requestSync(…)时,适配器仍然不会被调用
    • 此外,我目前已经使用requestSync(ACCOUNT、AUTHORITY、new Bundle()),并且我三次检查了帐户和权限是否与syncadapter.xml中的帐户类型和权限相同
    • 我目前正在使用“无过滤器”登录和查看LogCat,并且可以查看我的所有其他日志。但是,服务日志没有显示,这意味着我的服务没有创建
我也尝试过StackOverflow上的其他解决方案,但这些解决方案基本上是由上面列出的解决方案封装的。我想知道我的代码中是否缺少启动此服务的地方

SyncService.java:

public class SyncService extends Service {
private static SyncAdapter syncAdapter = null;
private static final Object syncAdapterLock = new Object();

@Override
public void onCreate() {
    super.onCreate();
    Log.d("SyncService", "[DEBUG]       SyncService created...");
    synchronized (syncAdapterLock) {
        if (syncAdapter == null) {
            syncAdapter = new SyncAdapter(getApplicationContext(), true);
        }
    }
}

@Override
public IBinder onBind(Intent intent) {
    Log.d("SyncService", "[DEBUG]      onBind(...) run for SyncAdapter...");
    return syncAdapter.getSyncAdapterBinder();
}
}
SyncAdapter.java:

public class SyncAdapter extends AbstractThreadedSyncAdapter {
private ContentResolver resolver;
private AccountManager am;

public SyncAdapter(Context context, boolean autoInitialize) {
    super(context, autoInitialize);
    resolver = context.getContentResolver();
    am = AccountManager.get(context);
}

// Maintains compatibility with Android >= 3.0 platform versions
public SyncAdapter(Context context , boolean autoInitialize, boolean allowParallelSyncs) {
    super(context, autoInitialize, allowParallelSyncs);
    resolver = context.getContentResolver();
    am = AccountManager.get(context);
}

@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    Log.d("SyncAdapter", "[DEBUG]       onPerformSync for account[" + account.name + "] called. Syncing....");

    // Connect to server
    // Download and upload data
    // Handle data conflicts and determining if data is current
    // Clean up
}
}
观察员:

public class AlarmObserver extends ContentObserver {
Account account;

public AlarmObserver(Handler handler, Account account) {
    super(handler);
    this.account = account;
}

@Override
public void onChange(boolean selfChange) {
    onChange(selfChange, null);
}

@Override
public void onChange(boolean selfChange, Uri changeUri) {
    Log.d("AlarmObserver", "[DEBUG]     Change to content detected. Account: " + account.name + " Uri: " + changeUri.toString() + " Authority: " + AlarmContract.AUTHORITY);
    ContentResolver.requestSync(account, AlarmContract.AUTHORITY, new Bundle());
}
}
syncadapter.xml:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="livotto.smarthomeapi.AlarmProvider"
    android:accountType="@string/default_account_type"
    android:userVisible="true"
    android:supportsUploading="true"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true" />

我已经解决了我遇到的问题。有一些标志将控制同步适配器的运行方式。这些是:

ContentResolver.SYNC_EXTRAS_MANUAL 
ContentResolver.SYNC_EXTRAS_EXPEDITED
您可以使用以下设置:

Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);

ContentResolver.requestSync(ACCOUNT, AUTHORITY, bundle);
有关这些标志的作用的详细信息:

Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);

ContentResolver.requestSync(ACCOUNT, AUTHORITY, bundle);