我们已在应用中添加了一个帐户,以便在用户点击联系人图片时显示该帐户(如“联系人卡片”部分中显示的here)。
目前,我们在同步时不需要任何功能,因此“onPerformSync”的代码完全为空。也许以后我们会为它添加代码。
出于某种原因,在某些设备上(如Nexus 4,Android 4.3),似乎同步服务在很长一段时间内保持清醒(至少9小时,可能更多),即使它什么都没有要做。
在这样的设备上,应用程序会耗尽电池,因此解决此问题至关重要。
然而,根据我所阅读和听到的内容,该功能要求我们有一个syncAdapter,即使它不需要做任何事情。
实际上代码没什么特别之处,因为它与其他样本几乎完全相同。它甚至还有很少的代码,因为我们现在不需要同步。
不过我会把它写下来:
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) {
}
}
SyncService :
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>
contacts.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>
syncadapter.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" />
AuthenticatorActivity :
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();
}
}
为什么会发生?
我们已按照样本上的所有步骤进行操作,但同步服务仍然保持活动状态,这可能会保留唤醒锁定(如here所示)。
也许我需要拨打“setSyncAutomatically”或“setIsSyncable”?如果是这样,是否意味着默认情况下syncAdapters会自动设置为同步?我应该在哪里打电话呢?在“confirmCredentials”功能?
然而,它仍然没有解释为什么服务继续运行,即使它无关,当我们使用SyncAdapter进行同步时,我们将不得不再次处理这个问题。
答案 0 :(得分:0)
这可能是由与this question here相同的问题引起的 - 您的应用onCreate
方法中的代码可能会在每次SyncAdapter启动时启动 - 即使{{1本身没有做任何事情,应用程序代码阻止它再次回到睡眠状态。
只是一个理论 - 现在可能已经太晚了!