Процесс SyncAdapter убит при ударе с последнего

Я пытаюсь создать SyncAdapter, работающий в фоновом режиме (без уведомления переднего плана).

Работает, кроме случая, когда срабатывает действие (задача) ContentResolver.requestSync(...) сильно удаляется от последних приложений. В этом случае процесс убит и onPerformSync(...) не закончен

Я знаю, это ожидаемое поведение Android, но в обычном Service Я бы поставил

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    return START_REDELIVER_INTENT;
}

или, может быть, использовать

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);

    restartSynchronization();
}

повторить попытку синхронизации, но это не работает в SyncAdapterService.

Как я могу убедиться, что синхронизация продолжается / повторяется после того, как активность была удалена из недавних приложений?

Заранее спасибо.

1 ответ

После некоторого исследования я узнал, что onTaskRemoved(...) вызывается только когда startService(...) называется, а не когда кто-то только привязывается к нему.

Так что я обошел стороной, начав службу в onBind(...) и остановить его и его процесс в onUnbind(...) методы.

Это окончательный код:

public class SyncAdapterService extends Service {
private static final Object sSyncAdapterLock = new Object();
private static MySyncAdapter sSyncAdapter = null;

@Override
public void onCreate() {
    super.onCreate();

    synchronized (sSyncAdapterLock) {
        if (sSyncAdapter == null) {
            sSyncAdapter = new MySyncAdapter(getApplicationContext());
        }
    }
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);

    /*
     * Rescheduling sync due to running one is killed on removing from recent applications.
     */
    SyncHelper.requestSyncNow(this);
}

@Override
public IBinder onBind(Intent intent) {
    /*
     * Start service to watch {@link @onTaskRemoved(Intent)}
     */
    startService(new Intent(this, SyncAdapterService.class));

    return sSyncAdapter.getSyncAdapterBinder();
}

@Override
public boolean onUnbind(Intent intent) {
    /*
     * No more need watch task removes.
     */
    stopSelf();

    /*
     * Stops current process, it's not necessarily required. Assumes sync process is different
     * application one. (<service android:process=":sync" /> for example).
     */
    Process.killProcess(Process.myPid());

    return super.onUnbind(intent);
}
}
Другие вопросы по тегам