Служба Syncronize не работает на API => уровень 26 - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть несколько служб, которые не работают на Android с 26 уровня и выше. Они активированы, как вы можете видеть на этом изображении в настройках пользователя и учетной записи:

enter image description here

Даже если я перезапущу эту синхронизацию, служба не будет запущена в приложении. Но они работают нормально в старых версиях Android API.

Android Manifest.xml :

использует-разрешение

    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
    <uses-permission android:name="android.permission.READ_SYNC_STATS" />

применение

провайдеры

    <provider
        android:name=".sincronismo.SincronizadorSemFilaContentProvider"
        android:authorities="@string/sincronismo_sem_fila_content_authority"
        android:exported="false"
        android:label="@string/sincronismo_sem_fila_rotulo"
        android:syncable="true" />
    <provider
        android:name=".sincronismo.SincronizadorComFilaContentProvider"
        android:authorities="@string/sincronismo_com_fila_content_authority"
        android:exported="false"
        android:label="@string/sincronismo_com_fila_rotulo"
        android:syncable="true" />

Услуги

    <service
        android:name=".sincronismo.SincronizadorSemFilaService"
        android:exported="true"
        android:process=":sync">
        <intent-filter>
            <action android:name="android.content.SyncAdapter" />
        </intent-filter>

        <meta-data
            android:name="android.content.SyncAdapter"
            android:resource="@xml/sincronismo_sem_fila_sync_adapter" />
    </service>

    <service
        android:name=".sincronismo.SincronizadorComFilaService"
        android:exported="true"
        android:process=":sync">
        <intent-filter>
            <action android:name="android.content.SyncAdapter" />
        </intent-filter>

        <meta-data
            android:name="android.content.SyncAdapter"
            android:resource="@xml/sincronismo_com_fila_sync_adapter" />
    </service>

SincronizadorComFilaService несколько отличий от SincronizadorSemFilaService , но в основном то же самое:

public class SincronizadorComFilaService extends Service {
private static final Object SYNC_ADAPTER_LOCK = new Object();
private static AbstractSincronizadorAdapter syncAdapter;

public SincronizadorComFilaService() {
    super();
}

@Override
public void onCreate() {
    super.onCreate();
    synchronized (SYNC_ADAPTER_LOCK) {
        if (syncAdapter == null){
            syncAdapter = new AbstractSincronizadorAdapter(getApplicationContext(), true) {
                @Override
                protected void executarSincronismo(ServicoFactory servicoFactory,
                        Account account, Bundle extras, String authority,
                        ContentProviderClient provider, SyncResult syncResult)
                        throws AbstractServicoException {
                    servicoFactory.getSincronismoService().executarSincronismoComFila();
                }
            };
        }
    }
}

@Override
public IBinder onBind(Intent intent) {
    return syncAdapter.getSyncAdapterBinder();
}
}

снова sincronismo_com_fila_sync_adapter.xml , с некоторыми отличиями от sincronismo_sem_fila_sync_adapter

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="@string/sincronismo_com_fila_content_authority"
android:accountType="@string/seguranca_tipo_conta"
android:supportsUploading="true"
android:userVisible="true"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
/>

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Android ограничил фоновые сервисы API уровня 26. Читать здесь .Но есть несколько вариантов сервиса.Вы должны переключить свою работу на последнюю версию Work Manager API .

. Вы также можете попробовать Job Scheduler , которыйработает с API 21. Другой альтернативой является Firebase Dispatcher .Он работает с API 14.

Все эти три могут выдержать операции загрузки системы или ограничения сети.Служба не очень хорошее решение для вашей синхронизации.

0 голосов
/ 17 апреля 2019

Вполне возможно, что вам нужно запустить JobService, потому что сервис не является хорошим решением.

https://developer.android.com/reference/android/app/job/JobService

...