用于在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
-
- 不可能,因为我当前正在使用用户登录的帐户,并且该帐户已添加到帐户管理器中
-
- 通过使用intent启动服务,我可以让onCreate()为服务运行,但它不会在绑定时运行,并且当onChange运行ContentResolver.requestSync(…)时,适配器仍然不会被调用
- 此外,我目前已经使用requestSync(ACCOUNT、AUTHORITY、new Bundle()),并且我三次检查了帐户和权限是否与syncadapter.xml中的帐户类型和权限相同
-
- 我目前正在使用“无过滤器”登录和查看LogCat,并且可以查看我的所有其他日志。但是,服务日志没有显示,这意味着我的服务没有创建
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);