背景
我们已向应用程序添加了一个帐户,以便在用户单击联系人的图像时显示该帐户(如“联系人卡片”部分中所示)。
目前,同步时我们不需要任何功能,因此“onPerformSync”的代码完全是空的。也许稍后我们会为它添加代码。
问题
出于某种原因,在某些设备上(如 Nexus 4 和 Android 4.3),同步服务似乎保持清醒很长时间(至少 9 小时,可能更长),即使它无关。
在此类设备上,该应用程序会耗尽电池电量,因此解决此问题至关重要。
但是,根据我的阅读和听到的内容,该功能要求我们有一个syncAdapter,即使它不需要做任何事情。
编码
实际上,代码并没有什么特别之处,因为它与其他示例几乎相同。它甚至有更少的代码,因为我们现在不需要同步。
尽管如此,我还是会写下来:
同步适配器:
public class SyncAdapter extends AbstractThreadedSyncAdapter {
public SyncAdapter (Context context, boolean autoInitialize) {
super(context, autoInitialize);
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider,
SyncResult syncResult) {
}
}
同步服务:
public class SyncService extends Service {
private static final Object sSyncAdapterLock = new Object();
private static SyncAdapter sSyncAdapter = null;
@Override
public void onCreate() {
synchronized (sSyncAdapterLock) {
if (sSyncAdapter == null) {
sSyncAdapter = new SyncAdapter (getApplicationContext(), true);
}
}
}
@Override
public IBinder onBind(final Intent intent) {
return sSyncAdapter.getSyncAdapterBinder();
}
}
编辑:我决定展示更多代码,以便尝试为这个问题提供更多线索:
清单:
<service
android:name="...SyncService"
android:exported="true" >
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
<meta-data
android:name="android.provider.CONTACTS_STRUCTURE"
android:resource="@xml/contacts" />
</service>
联系人.xml
<ContactsSource xmlns:android="http://schemas.android.com/apk/res/android" >
<ContactsDataKind
android:detailColumn="data3"
android:icon="@drawable/app_icon"
android:mimeType="vnd.android.cursor.item/....profile"
android:summaryColumn="data2"/>
</ContactsSource>
同步适配器.xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="....contacts"
android:allowParallelSyncs="false"
android:contentAuthority="com.android.contacts"
android:isAlwaysSyncable="false"
android:supportsUploading="false"
android:userVisible="false" />
身份验证器活动:
public class AuthenticatorActivity extends AccountAuthenticatorActivity {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Intent res = new Intent();
res.putExtra(AccountManager.KEY_ACCOUNT_NAME, ...);
res.putExtra(AccountManager.KEY_ACCOUNT_TYPE, ...);
res.putExtra(AccountManager.KEY_AUTHTOKEN, ...);
final Account account = new Account(AccountGeneral.ACCOUNT_NAME, ...);
final AccountManager accountManager = AccountManager.get(this);
accountManager.addAccountExplicitly(account, null, null);
ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY, false);
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
setAccountAuthenticatorResult(res.getExtras());
setResult(RESULT_OK, res);
finish();
}
}
问题
为什么会发生?
我们已经按照示例中的所有步骤进行了操作,但同步服务仍然保持活动状态,它(可能)持有唤醒锁(如此处所写)。
也许我需要调用“ setSyncAutomatically ”或“ setIsSyncable ”?如果是这样,是否意味着默认情况下syncAdapters自动设置为同步?我什至应该在哪里称呼它?在“ confirmCredentials ”函数中?
然而,它仍然没有解释为什么服务会继续运行,即使它无关紧要,当我们使用 SyncAdapter 进行同步时,我们将不得不再次处理这个问题。