2017-02-07 9 views
1

Androidでは、現在、一番上のアクティビティ名を取得したいと考えています。 ActivityManager.getRunningTasks(1);のようなメソッドは非推奨であり、AccessibilityServiceはユーザーが有効にする必要があります。そこで私はRxJavaでこれを行うことにしました。基本的には、Subjectを保持するSingletonクラスを1つ用意します。アクティビティの再開時およびアクティビティの一時停止時にこの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(); 

toBlockingBlockingObservablefirstにあなたのObservableを変換しますが、実行をブロックします私は強くあなたを示唆します被験者の種類の違いを読む。

+0

ActivityTrackerでBehaviorSubjectをこのように使用しようとしました: 'public BehaviorSubject currentActivitySubject = BehaviorSubject.create();私はあなたの中にいた場合BehaviourSubjectを使用します。 public Observable getActivityName(){ return currentActivitySubject.asObservable(); } '。しかし、何も返さないのであれば、コードは 'getActivityName'を取得しようとした後に動作しなくなるだけです。 –

+0

私の' currentActivitySubject'は空で、最初の 'onNext'をまだ取得していません。このケースをどうすれば処理できますか? –

+0

まあ、開始アクティビティを知っています。それはマニフェストで宣言されています。その名前を作成名に渡すことができます。例えば。 public 'BehaviorSubject currentActivitySubject = BehaviorSubject.create(SplashActivity.class.getSimpleName());'、サブジェクトはあなたの 'ActivityTracker'のメンバです。 – Blackbelt

関連する問題