Ich weiß, dass die Antwort bereits akzeptiert wurde, aber ich dachte, ich würde darüber schreiben, wie ich das Problem gelöst habe, falls jemand darüber stolpert und neugierig ist, wie der Code aussehen könnte.
Wenn Sie Otto verwenden, folgte ich der oben genannten Antwort, indem Sie die android:process
aus dem Manifest entfernen. Ich folgte auch der Antwort, die hier How to send event from Service to Activity with Otto event bus? zur Verfügung gestellt wurde, wo eine Bus-Ausnahme geworfen wurde, um nicht auf dem Hauptthread ausgeführt zu werden. Daher habe ich die beiden Antworten kombiniert und einen Bus erstellt, der auf dem Hauptthread gemäß dem obigen Link ausgeführt werden soll.
public class MainThreadBus extends Bus {
private final Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void post(final Object event) {
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
MainThreadBus.super.post(event);
}
});
}
}
}
Ich habe dann ein Bus Singleton, die überall in der Anwendung verwendet werden können:
public final class BusProvider {
private static final MainThreadBus BUS = new MainThreadBus();
public static MainThreadBus getInstance() {
return BUS;
}
private BusProvider() {
}
}
In meinem SyncAdapter habe ich den folgenden Code an der Veranstaltung, BusProvider.getInstance().post(event);
und in meiner Anwendung Fragment initiieren ich einfach abonniert das Ereignis.
Dies funktionierte einwandfrei, wenn die Anwendung im Vordergrund war und wenn der Synchronisierungsadapter im Hintergrund gestartet wurde, nachdem die Anwendung entfernt wurde.
Aber dann würde ich "Sync" -Funktion verlieren, wenn App geschlossen ist (weil ': Sync' Prozess ist häufig geteilt und arbeitet im Hintergrund)? "Das Attribut android: exported =" true "ermöglicht anderen Prozessen als Ihrer App (einschließlich des Systems) den Zugriff auf den Dienst. Das Attribut android: process =": sync "weist das System an, den Dienst in einem globalen freigegebenen Prozess namens sync auszuführen . " - http://developer.android.com/training/sync-adapters/creating-sync-adapter.html#DeclareSyncAdapterManifest – svenkapudija
@svenkapudija: Sie müssen 'android: process =": sync "' nicht verwenden, um '' zu verwenden SyncAdapter'."weil: sync process ist häufig geteilt und arbeitet im hintergrund" - es wäre üblich, dass mehrere ihrer komponenten 'android: process =": sync "' verwenden. [Es wäre mit nichts auf dem Gerät anders] (http://developer.android.com/guide/topics/manifest/service-element.html#proc). – CommonsWare
Auch dachte, dass die: Sync für den SyncAdapter im Hintergrund ausgeführt werden benötigt. Stellt sich heraus, dass dies nicht der Fall ist, und indem Sie es entfernen, können Sie im Hintergrund synchronisieren, während Ihre Benutzeroberfläche (über Otto oder Broadcasts) weiß, dass etwas passiert – Entreco