Я знаю, что ответ уже принят, но я подумал, что напишу о том, как я решил проблему на случай, если кто-нибудь столкнется с этим, и любопытно, как выглядит код.
Если вы используете Отто, я выполнил принятый ответ выше, удалив android:process
из манифеста. Я также выполнил ответ, приведенный здесь How to send event from Service to Activity with Otto event bus?, где исключалось исключение шины, которое не запускалось в основном потоке. Поэтому я объединил два ответа и создал шину для выполнения на основном потоке в соответствии с приведенной выше ссылкой.
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);
}
});
}
}
}
Затем я создал одноэлементный автобус, который может использоваться в любом месте применения:
public final class BusProvider {
private static final MainThreadBus BUS = new MainThreadBus();
public static MainThreadBus getInstance() {
return BUS;
}
private BusProvider() {
}
}
В моей SyncAdapter я использовал следующий код инициировать событие, BusProvider.getInstance().post(event);
и в моем фрагменте приложения я просто подписался событие.
Это работало отлично, когда приложение находилось на переднем плане, а также когда адаптер синхронизации был инициирован в фоновом режиме после того, как приложение было удалено.
Но тогда я бы потерял функциональность 'sync', если приложение закрыто (потому что процесс': sync' является общим общим и работает в фоновом режиме)? «Атрибут android: exported =« true »позволяет другим процессам, кроме вашего приложения (включая систему) обращаться к Сервису. Атрибут android: process =": sync "сообщает системе о запуске службы в глобальном совместном процессе с именем sync «. - http://developer.android.com/training/sync-adapters/creating-sync-adapter.html#DeclareSyncAdapterManifest – svenkapudija
@svenkapudija: Вам не нужно использовать 'android: process =": sync "' использовать ' SyncAdapter'.«потому что: процесс синхронизации является общим общим и работает в фоновом режиме» - это было бы общим для нескольких ваших компонентов, которые используют «android: process =»: sync «'. [Это не было бы распространено ни с чем другим на устройстве] (http://developer.android.com/guide/topics/manifest/service-element.html#proc). – CommonsWare
Также считалось, что для синхронизации SyncAdapter в фоновом режиме требуется синхронизация: sync. Оказывается, это не так, и, удалив его, вы можете синхронизировать в фоновом режиме, пока ваш пользовательский интерфейс (через Otto или Broadcasts) знает, что что-то произошло. – Entreco