android - How to create RxJava observables to collect smartphone data inside a service and be subscribed in an activity -


context:

i'm trying develop android application gather data many sources such as: battery, hardware, sensors, cell towers, satellites , wifis.

these data has "observed" inside service because need run in background in order log data , send server. when user opens app need show data in activity.

first wrote code using many behaviorsubject singletons, each representing data source. way pass data service using onnext method , subscribe anywhere. want rid of subject objects since recommended usage of observable.


problems:

i have 2 questions:

question 1: how create rxjava observable registers listener or broadcastreceiver @ first subscription and, when subscribers call unsubscribe method, unregisters listener or receiver?

i have piece of code listen satellites:

private final gpsstatus.listener gpslistener = new gpsstatus.listener() {      gpsstatus gpsstatus = null;      @override     public void ongpsstatuschanged(int event) {         gpsstatus = locationmanager.getgpsstatus(gpsstatus);          if (event == gpsstatus.gps_event_satellite_status) {             if (gpsstatus != null) {                 //put satellite data in list             }         }     } };  public registersatellite() {     locationmanager.addgpsstatuslistener(gpslistener); }  public void unregistersatellite() {     locationmanager.removegpsstatuslistener(gpslistener); } 

i have piece of code listen battery information:

private broadcastreceiver batteryreceiver = new broadcastreceiver() {     @override     public void onreceive(context context, intent intent) {         //put intent data in variable     } };  public registerbattery() {     context.registerreceiver(batteryreceiver, new intentfilter(intent.action_battery_changed)); }  public unregisterbattery() {     context.unregisterreceiver(batteryreceiver); } 

question 2: in order pass data service activity, singletons option?

you use rxjava's publishsubject. emits subsequent observed items subscriber , supports multiple subscribers:

publishsubject<gpsstatus> subject = publishsubject.create(); // observer1 receive onnext events subject.subscribe(observer1); subject.onnext(<gpsstatus#1>); subject.onnext(<gpsstatus#2>); // observer2 receive gpsstatus #3 subject.subscribe(observer2); subject.onnext(<gpsstatus#3>); 

in combination singleton, create sort of bus allows generators (e.g. gpslistener, broadcastreceiver) publish activities.

just don't forget unsubscribe ondestroy(), otherwise you'll leak activities!


Comments