2017-02-07 12 views
1

Добавлена ​​зависимость к GradleПолучить контекст в подписке RxBroadcast.fromBroadcast

compile 'com.cantrowitz:rxbroadcast:1.0.0' 

Использование RxBroadcast внутри службы

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

Посмотрел внутри исходного кода BroadcastProvider.createBroadcastReceiver метод

@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); 
      } 
     } 
    }; 
} 

Как я могу получить Context внутри fromBroadcast подписка?

+0

Вскоре - вы не можете, потому что только «умысел» переводится. Конечно, если вы не измените источники и не испустите объект-оболочку с намерением и контекстом. – azizbekian

+0

@azizbekian спасибо. Я пытаюсь вызвать 'getSystemService' внутри подписки, есть ли способ обхода? – tchelidze

ответ

0

Вскоре вы не можете, потому что только intent испускается. Конечно, если вы не измените источники и не испустите объект-оболочку с намерением и контекстом.

Вы можете получить контекст глобального приложения, и после этого вы можете выполнить getSystemService с этим контекстом.

То, что вы должны сделать, это добавить свои Application подкласс в AndroidManifest.xml

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

И создать сам MyApplication класс, который наследует от android.app.Application

public class MyApplication extends Application { 
    static MyApplication application; 

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

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

Теперь вы можете позвонить MyApplication.getApplication().getSystemService() из вашего подписка.

В течение жизненного цикла приложения существует только один экземпляр Application, поэтому утечка не может произойти из-за сохранения статической ссылки.