2

背景

我们已向应用程序添加了一个帐户,以便在用户单击联系人的图像时显示该帐户(如“联系人卡片”部分中所示)

目前,同步时我们不需要任何功能,因此“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 进行同步时,我们将不得不再次处理这个问题。

4

1 回答 1

0

这可能是由与这里的问题相同的问题引起的- 每次 SyncAdapter 启动时,您的 Application 方法中可能有代码onCreate启动 - 即使onPerformSync它自己什么也没做,应用程序代码阻止它重新进入睡眠状态再次。

只是一个理论——现在发现可能为时已晚!

于 2015-02-25T11:44:42.917 回答