2017-02-07 2 views
1

Android에서 현재 가장 위에있는 활동 이름을 가져오고 싶습니다. ActivityManager.getRunningTasks(1);과 같은 메소드는 지원되지 않으며 사용자가 AccessibilityService을 사용하도록 설정해야합니다. 그래서 나는 RxJava을 통해 이것을 결정했다. 기본적으로 Subject를 보유 할 Singleton 클래스가 하나 있습니다. 활동 재개시 및 활동 일시 중지시이 제목을 업데이트합니다. 또한 배경 서비스에서이 Subject를 구독하여 현재 실행중인 활동을 가져옵니다.Android, RxJava를 사용하여 현재 활동 가져 오기

제 질문은 백그라운드 작업에서 현재 활동 이름을 동기식으로 가져와야하는 방법입니다.

제목 홀더 싱글 클래스 ActivityTracker.class

public class ActivityTracker { 
     private static ActivityTracker instance; 

     public static synchronized ActivityTracker getInstance() { 
      if (instance == null) { 
       instance = new ActivityTracker(); 
      } 
      return instance; 
     } 

    public PublishSubject<String> currentActivity = PublishSubject.create(); 

} 

VideoPlayerActivity.class

ActivityTracker.getInstance().currentActivity 
     .onNext(VideoPlayerActivity.class.getSimpleName()); 

답변

1

내 질문은 내가 기적으로 백그라운드 작업에서 내 현재 활동 이름을 얻는 방법이다.

하지 않아야합니다. 항상 구독하고 onNext의 일부로 이름을 가져야합니다. 그렇게하려면 Subject asObservable을 노출해야합니다 (예 : 외부에서

public Observable<String> getActivityName() { 
     return currentActivity.asObservable(); 
    } 

당신은 할 수 있습니다 :

ActivityTracker.getInstance().getActivityName().toBlocking().first(); 

toBlocking 변환됩니다에 ObservableBlockingObservable 첫 번째 항목이

방출 될 때까지 first 내가 강력하게 제안 실행을 차단합니다 과목 유형의 차이점을 읽으십시오. 내가 당신 안에 있다면 BehaviourSubject을 사용할 것입니다.

+0

ActivityTracker에서 다음과 같이 BehaviorSubject를 사용해 보았습니다 : public BehaviorSubject currentActivitySubject = BehaviorSubject.create(); public Observable getActivityName() { return currentActivitySubject.asObservable(); }'. 하지만 아무 것도 반환하지 않는다면, 코드는'getActivityName'을 얻으려고 한 후에 작동을 멈춘다. –

+0

나의'currentActivitySubject'는 비어 있는데, 그의 첫 번째'onNext'를 아직 얻지 못하고있다. 이 사건을 어떻게 처리 할 수 ​​있습니까? –

+0

음, 시작 활동을 알았습니다. 그것은 귀하의 목록에 선언되어 있습니다. 생성 이름에서 이름을 주제로 전달할 수 있습니다. 예 : public'BehaviorSubject currentActivitySubject = BehaviorSubject.create (SplashActivity.class.getSimpleName());', 여기서 Subject는 'ActivityTracker'의 구성원입니다. – Blackbelt

관련 문제