网上商城建站服务商,长沙知名网站建设,临沂百度推广的电话,贵阳软件开发公司在哪里版权声明#xff1a;本文为xing_star原创文章#xff0c;转载请注明出处#xff01; 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracker 今天在群里面划水#xff0c;有个小伙伴问到一个问题#xff0c;”刚进公司 清单文件的activity 较…版权声明本文为xing_star原创文章转载请注明出处 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracker 今天在群里面划水有个小伙伴问到一个问题”刚进公司 清单文件的activity 较多 不便于查找和定位有什么办法解决”。这个问题我自认为还是很有经验的向对方推荐了一个ActivityTracker软件这个软件的作用嘛就是开启了一个悬浮窗会显示当前页面的Activity的名称无论是系统App还是新接手的公司App通过展示的Activity类名能够很容易的找到这块业务逻辑的代码所在。这个小工具真的很可以提高开发效率所以准备记录下来这个东西也是用了好几年了不是今天有人问到也不会有想法特意写篇文章记录下ActivityTracker。 源码分析 这个小工具在Github上是开源的地址是https://github.com/fashare2015/ActivityTracker也有幸提过pr代码量上就四五个类很容易看懂的。本质上采用的是Android的AccessibilityService这个辅助服务机制时刻检测屏幕对应的Activity同时在Service中用WindowManager显示悬浮view。 具体到代码层面当用户开启辅助服务后TrackerService被激活onAccessibilityEvent方法就会不断的被执行 Override
public void onAccessibilityEvent(AccessibilityEvent event) {Log.d(TAG, onAccessibilityEvent: event.getPackageName());if (event.getEventType() AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {CharSequence packageName event.getPackageName();CharSequence className event.getClassName();if (!TextUtils.isEmpty(packageName) !TextUtils.isEmpty(className)) {EventBus.getDefault().post(new ActivityChangedEvent(event.getPackageName().toString(),event.getClassName().toString()));}}
} 当onAcessibilityEvent被触发后满足TYPE_WINDOW_STATE_CHANGED用来表示Window窗口发生了变化条件后通过EventBus将当前页面的包名Activity类名传递到FloatingView中接着就在FloatingView中刷新对应的包名类名值。 public void onEventMainThread(TrackerService.ActivityChangedEvent event){Log.d(TAG, event: event.getPackageName() : event.getClassName());String packageName event.getPackageName(),className event.getClassName();mTvPackageName.setText(packageName);mTvClassName.setText(className.startsWith(packageName)?className.substring(packageName.length()):className);Log.d(TAG, event: event.getPackageName() : event.getClassName() , end invoked!);
} 这块是核心逻辑。 FloatingView是如何在Service中显示隐藏的呢可以看到TrackerService里面有个成员变量mTrackerWindowManager他用来控制显示隐藏FloatingView。 TrackerWindowManager的静态代码块设置了悬浮view的默认显示位置以及可以接受手势触摸 static {WindowManager.LayoutParams params new 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;
} public void addView() {if(mFloatingView null){mFloatingView new FloatingView(mContext);mFloatingView.setLayoutParams(LAYOUT_PARAMS);mWindowManager.addView(mFloatingView, LAYOUT_PARAMS);}
} addView方法就是将FloatingView添加到Service的WindowManager中并显示出来这块需要对WindowManager有所理解了解其用法。 在我们真正使用的过程中会发现ActivityTracker明明Activity页面已经finish了但是悬浮view依旧显示在当前的屏幕上控制悬浮view显示的是WindowManager而这个windowManager在Service中存活着。所以基本上就会一直显示着很少会被系统杀死。 分析完后发现这个小工具并不难主要用到的就是AccessibilityServiceWindowManager添加FloatingView,以及EventBus。相信大家都可以实现这个小工具。 项目地址 https://github.com/fashare2015/ActivityTracker转载于:https://www.cnblogs.com/xing-star/p/10962004.html