2017-02-07 2 views
1

Added Abhängigkeit Gradleabrufen Kontext in RxBroadcast.fromBroadcast Abonnement

compile 'com.cantrowitz:rxbroadcast:1.0.0' 

Mit RxBroadcast innerhalb Dienst

RxBroadcast.fromBroadcast(this, someFilter) 
      .subscribe(new Action1<Intent>() { 
         @Override 
         public void call(Intent intent) { 
          //NOTICE : only intent is received. no Context 
         } 
        }); 

innerhalb Quellcode Sah BroadcastProvider.createBroadcastReceiver Methode

@NonNull 
private BroadcastReceiver createBroadcastReceiver(
     final Subscriber<? super Intent> subscriber) { 
    return new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (!subscriber.isUnsubscribed()) { 
       //NOTICE : context is discarded here. 
       subscriber.onNext(intent); 
      } 
     } 
    }; 
} 

Wie ich Context abrufen innerhalb fromBroadcast Abonnement?

+0

Kurz - Sie können nicht, weil nur 'Absicht' emmitiert wird. Natürlich, es sei denn, Sie ändern Quellen und geben ein Wrapper-Objekt mit Absicht und Kontext aus. – azizbekian

+0

@azizbekian danke. Ich versuche, 'getSystemService' innerhalb des Abonnements aufzurufen. Gibt es eine Problemumgehung? – tchelidze

Antwort

0

Kurz - Sie können nicht, weil nur intent ausgestrahlt wird. Natürlich, es sei denn, Sie ändern Quellen und geben ein Wrapper-Objekt mit Absicht und Kontext aus.

Sie können den globalen Anwendungskontext abrufen, und danach können Sie getSystemService mit diesem Kontext ausführen.

Was Sie tun müssen, ist Ihre benutzerdefinierte Application Unterklasse in AndroidManifest.xml

<application 
    android:name="com.your.package.MyApplication" 
    ... 
    > 

hinzuzufügen und MyApplication Klasse selbst, die von android.app.Application

public class MyApplication extends Application { 
    static MyApplication application; 

    @Override 
    public void onCreate() { 
     application = this; 
    } 

    public static MyApplication getApplication() { 
     return application; 
    } 
} 

Jetzt können Sie MyApplication.getApplication().getSystemService() rufen erbt erstellen aus Ihrem Abonnement.

Es gibt nur eine Application Instanz während des Anwendungslebenszyklus, so dass keine Leckage auftreten kann, da die statische Referenz beibehalten wird.