即使syncAdapter什么都不做,同步服务也会保持清醒状态

时间:2013-09-11 07:24:57

标签: android android-service battery wakelock android-syncadapter

背景

我们已在应用中添加了一个帐户,以便在用户点击联系人图片时显示该帐户(如“联系人卡片”部分中显示的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进行同步时,我们将不得不再次处理这个问题。

1 个答案:

答案 0 :(得分:0)

这可能是由与this question here相同的问题引起的 - 您的应用onCreate方法中的代码可能会在每次SyncAdapter启动时启动 - 即使{{1本身没有做任何事情,应用程序代码阻止它再次回到睡眠状态。

只是一个理论 - 现在可能已经太晚了!