So che la risposta è stata già accettata, ma ho pensato di scrivere su come ho risolto il problema nel caso in cui qualcuno si imbattesse in questo ed è curioso di sapere come potrebbe apparire il codice.
Se si utilizza Otto, ho seguito la risposta accettata in precedenza rimuovendo il file android:process
dal manifest. Ho seguito anche la risposta fornita qui How to send event from Service to Activity with Otto event bus?, dove veniva lanciata un'eccezione Bus per non essere eseguita sul thread principale. Pertanto ho combinato le due risposte e creato un bus da eseguire sul thread principale come da link sopra.
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);
}
});
}
}
}
Ho quindi creato un Singleton Bus che può usato qualsiasi punto dell'applicazione:
public final class BusProvider {
private static final MainThreadBus BUS = new MainThreadBus();
public static MainThreadBus getInstance() {
return BUS;
}
private BusProvider() {
}
}
Nel mio SyncAdapter ho usato il seguente codice avviare l'evento, BusProvider.getInstance().post(event);
e nel mio frammento applicazione che ho semplicemente sottoscritto l'evento.
Questo ha funzionato perfettamente quando l'applicazione era in primo piano e quando l'adattatore di sincronizzazione è stato avviato in background dopo che l'applicazione è stata trascinata via.
Ma poi perderei la funzionalità 'sync' se l'app è chiusa (perché il processo': sync' è condiviso e funziona in background)? "L'attributo android: exported =" true "consente ai processi diversi dall'app (incluso il sistema) di accedere al Servizio. L'attributo android: process =": sync "indica al sistema di eseguire il Servizio in un processo condiviso globale denominato sync ". - http://developer.android.com/training/sync-adapters/creating-sync-adapter.html#DeclareSyncAdapterManifest – svenkapudija
@svenkapudija: Non è necessario utilizzare 'android: process =": sync "' per usare a ' SyncAdapter'."perché: il processo di sincronizzazione è condiviso in comune e funziona in background" - sarebbe comune tra molti dei tuoi componenti che usano 'android: process =": sync "'. [Non sarebbe in comune con nient'altro sul dispositivo] (http://developer.android.com/guide/topics/manifest/service-element.html#proc). – CommonsWare
Inoltre, si pensava che il: sync fosse necessario per SyncAdapter per l'esecuzione in background. Risulta che non è il caso, e rimuovendolo puoi sincronizzarlo in background mentre permetti alla tua interfaccia utente di sapere (tramite Otto o Trasmissioni) che qualcosa è successo – Entreco