免責事項:この記事はxing_starオリジナル記事です、ソースを明記してください!
この記事の同期http://javaexception.com/archives/113
ActivityTrackerのAndroidの開発ツール
今日では、グループ内の水、質問をするために小さなパートナーは、「会社よりマニフェストファイルの活動がどのような解決策、見つけると見つけることは容易ではありません参加しました。」私はActivityTracker他のソフトウェアをお勧めするために、非常に経験豊富だと思う問題は、このソフトウェアは、事の役割である、フローティングウィンドウを開くことですが、現在のページのアクティビティの名前に関係なく、システムアプリケーションの、表示される、または新規を引き継ぐために同社のAppは、Activityクラス名表示を通じて、簡単にコードのビジネスロジックのこの部分を見つけることができます。このガジェットは、本当にこの事は、数年前から使用され、記録されるように調製することが、今日はそれが求められ、また特別ActivityTracker記録記事を書くためのアイデアを持っていなかった、開発効率を向上させることができます。
ソースコード解析
このガジェットは、GitHubのオープンソース、アドレス上にあるhttps://github.com/fashare2015/ActivityTracker、また特権言及PR、4つのまたは5つのクラスのコードの量を持っていた、それを読みやすいです。それは本質的にアンドロイドAccessibilityServiceこの補助サービス機構、同時にウィンドウマネージャサービス中断ビューに表示される画面のアクティビティに対応する検出タイミングを使用します。
ユーザはTrackerServiceが活性化された補助的なサービスを、開いたときのコードレベルの特定、onAccessibilityEvent方法が実行され続けます
@Override 公共 ボイドonAccessibilityEvent(AccessibilityEventイベント){ Log.d(TAG、 "onAccessibilityEvent:" + event.getPackageName())。 もし(event.getEventType()== AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){ たCharSequenceのpackageName = event.getPackageName()。 たCharSequenceクラス名 = event.getClassName()。 もし(!TextUtils.isEmpty(のpackageName)&&!TextUtils.isEmpty(クラス名)){ EventBus.getDefault()。ポスト(新ActivityChangedEvent( event.getPackageName()。のtoString()、 。event.getClassName()のtoString() )); } } }
onAcessibilityEvent満たすTYPE_WINDOW_STATE_CHANGED(変更を示すウィンドウウィンドウ)条件をトリガしたとき、転送パッケージ名EventBus現在のページによって、FloatingViewする活性クラス名、クラスにリフレッシュFloatingView対応パッケージ名に従っ名前値。
公共 ボイドonEventMainThread(TrackerService.ActivityChangedEventイベント){ Log.d(TAG、 "イベント" + event.getPackageName()+ ":" + event.getClassName())。 ストリングのpackageName = event.getPackageName()、 クラス名 = event.getClassName()。 mTvPackageName.setText(のpackageName)。 mTvClassName.setText( className.startsWith(のpackageName) ? className.substring(packageName.length()): クラス名 ); Log.d(TAG、 "イベント:" + event.getPackageName()+ ":" + event.getClassName()+ "!、最後に呼び出さ" );
これは、コアロジックです。
FloatingViewが、あなたはメンバ変数mTrackerWindowManagerを持ってTrackerServiceを見ることができ、その中に隠されたサービスを表示する方法である、彼はFloatingViewを非表示にするには、ディスプレイを制御するために使用します。
TrackerWindowManager静的コードブロック設定のデフォルトサスペンションビューの表示位置、及びタッチジェスチャを受け入れることができます
静的{ WindowManager.LayoutParamsのparamsは = 新しいWindowManager.LayoutParams()。 params.x = 0 ; params.y = 0 ; params.width = WindowManager.LayoutParams.WRAP_CONTENT。 params.height = WindowManager.LayoutParams.WRAP_CONTENT。 params.gravity = Gravity.LEFT | Gravity.TOP; params.type = WindowManager.LayoutParams.TYPE_PHONE。 params.format = PixelFormat.RGBA_8888。 params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; LAYOUT_PARAMSの =ののparams; }
公共 ボイドaddView(){ 場合(mFloatingView == NULL ){ mFloatingView = 新しいFloatingView(mContext)。 mFloatingView.setLayoutParams(LAYOUT_PARAMS)。 mWindowManager.addView(mFloatingView、LAYOUT_PARAMS)。 } }
addViewメソッドは、ウィンドウマネージャにサービスにFloatingViewを追加し、表示され、これはウィンドウマネージャを理解する必要が、その使用方法を理解することです。
プロセスでは、実際の用途を見出すであろうサービスに生き、ActivityTrackerは明らかアクティビティページには、仕上げを持っていますが、ビューはまだ現在の画面上に表示中断され、サスペンション制御ビューは、ウィンドウマネージャを示しており、このウィンドウマネージャ。だから、基本的には、システムによって殺される可能性が低い、とのままになります。
分析は、ガジェットが難しいことではないことが判明した後、主な用途はAccessibilityService、ウィンドウマネージャはFloatingView、およびEventBusを追加することです。私たちは、このガジェットを達成していると信じています。