2 Stimmen

Der SyncAdapter-Prozess wird beendet, wenn er aus den zuletzt verwendeten Apps verschoben wird.

Ich versuche, einen SyncAdapter zu erstellen, der im Hintergrund läuft (ohne Benachrichtigung im Vordergrund).

Es funktioniert, außer in dem Fall, wenn die Aktivität (Aufgabe), die ContentResolver.requestSync(...) ausgelöst hat, aus den zuletzt verwendeten Anwendungen weggefegt wird. In diesem Fall wird der Prozess beendet und onPerformSync(...) wird nicht abgeschlossen.

Ich weiß, dass dies das erwartete Verhalten von Android ist, aber in einem regulären Service würde ich

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

    return START_REDELIVER_INTENT;
}

oder vielleicht verwenden

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

    restartSynchronization();
}

um die Synchronisierung erneut zu versuchen, aber dies funktioniert nicht im SyncAdapterService.

Wie kann ich sicherstellen, dass die Synchronisierung fortgesetzt/wiederholt wird, nachdem die Aktivität aus den zuletzt verwendeten Anwendungen weggefegt wurde?

Vielen Dank im Voraus.

0voto

Jan Pintr Punkte 21

Nach einigen Recherchen fand ich heraus, dass onTaskRemoved(...) nur aufgerufen wird, wenn startService(...) aufgerufen wird und nicht, wenn sich jemand nur damit verbindet.

Also habe ich einen Workaround gemacht, indem ich den Service in den Methoden onBind(...) starte und ihn und seinen Prozess in den Methoden onUnbind(...) stoppe.

Dies ist der endgültige Code:

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);

    /*
     * Sync neu planen, da der laufende aufgrund des Entfernens aus neuesten Anwendungen beendet wurde.
     */
    SyncHelper.requestSyncNow(this);
}

@Override
public IBinder onBind(Intent intent) {
    /*
     * Starte Service, um {@link @onTaskRemoved(Intent)} zu überwachen
     */
    startService(new Intent(this, SyncAdapterService.class));

    return sSyncAdapter.getSyncAdapterBinder();
}

@Override
public boolean onUnbind(Intent intent) {
    /*
     * Keine Notwendigkeit mehr, Task-Entfernungen zu überwachen.
     */
    stopSelf();

    /*
     * Stoppt den aktuellen Prozess, dies ist nicht unbedingt erforderlich. Geht davon aus, dass der Sync-Prozess ein anderer Anwendungsprozess ist. ( zum Beispiel).
     */
    Process.killProcess(Process.myPid());

    return super.onUnbind(intent);
}
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X