Simple RxJava2 wrapper for Android BroadcastReceiver
RxReceivers.from("YOUR ACTION HERE", context)
.subscribe(intent -> {
//do what you want here, but don't forget to unsubscribe
});
/** | |
* A custom implementation of {@link Disposable} for use with {@link RxReceivers} that | |
* takes care of un-registering the underlying Broadcast Receiver when it is disposed. | |
*/ | |
class BroadcastDisposable implements Disposable { | |
private BroadcastReceiver receiver; | |
private Context ctx; | |
private boolean isDisposed = false; | |
/** | |
* Initializes a new instance of the {@link BroadcastDisposable} class. | |
* @param receiver | |
* @param ctx | |
*/ | |
BroadcastDisposable(@NonNull BroadcastReceiver receiver, @NonNull Context ctx) { | |
this.receiver = receiver; | |
this.ctx = ctx; | |
} | |
/** | |
* Disposes resources used by the observable (ie.e: the underlying Broadcast Receiver). | |
*/ | |
@Override | |
public void dispose() { | |
if (!isDisposed) { | |
ctx.unregisterReceiver(receiver); | |
isDisposed = true; | |
} | |
} | |
/** | |
* Returns a value indicating whether the underlying resources have been disposed. | |
* @return {@code true} if the underlying resources have been disposed, otherwise {@code false}. | |
*/ | |
@Override | |
public boolean isDisposed() { | |
return isDisposed; | |
} | |
} |
/** | |
* A simple RxJava 2 wrapper for Android {@link BroadcastReceiver}s. | |
*/ | |
public class RxReceivers { | |
/** | |
* Registers a {@link BroadcastReceiver} for the specified action, | |
* and wraps it in an observable stream. | |
* | |
* @param action The action to match. | |
* @param context The context used to register the receiver. | |
* @return An {@link Observable<Intent>} that will emit received messages. | |
*/ | |
public static Observable<Intent> from(@NonNull final String action, @NonNull final Context ctx) { | |
IntentFilter filter = new IntentFilter(action); | |
return from(filter, ctx); | |
} | |
/** | |
* Registers a {@link android.content.BroadcastReceiver} for the specified action, | |
* and wraps it in an observable stream. | |
* | |
* @param intentFilter The action to match. | |
* @param context The context used to register the receiver. | |
* @return An {@link Observable<Intent>} that will emit received messages. | |
* | |
*/ | |
public static Observable<Intent> from(@NonNull final IntentFilter intentFilter, @NonNull final Context ctx) { | |
return Observable.create(new ObservableOnSubscribe<Intent>() { | |
Context appContext = ctx.getApplicationContext(); | |
@Override | |
public void subscribe(@NonNull final ObservableEmitter<Intent> emitter) throws Exception { | |
BroadcastReceiver receiver = new BroadcastReceiver() { | |
@Override | |
public void onReceive(Context context, Intent intent) { | |
emitter.onNext(intent); | |
} | |
}; | |
emitter.setDisposable(new BroadcastDisposable(receiver, appContext)); | |
appContext.registerReceiver(receiver, intentFilter); | |
} | |
}); | |
} | |
} |