过年了,你想要一把刀拿它能杀猪,杀鸭,杀鸡,他们共同的点就是都需要“刀”这个方法,你有两个方法获取刀,第一,跟邻居借,如果你只是很久才用一次刀,就可以跟邻居借,第二,自己将刀做成之后就可以重复使用一把刀去杀,省去借刀的流程不然就只能今天拿这把刀,明天又得去借刀,会浪费时间。
而今天学的就是自己做一把刀,基类就是一把刀,公用方法就是可以杀鸡也可以杀鸭。
组件化开发中,已经是将各个功能进行区分模块化开发,在模块中常常会运用到同一个接口或者需要实现同一个功能方法。
或者传递一些众需的参数等。这时,需要用到基类来封装常用的方法。
这里一个 protected 声明一个参数,除了package不能共享,其他都可获取
本次例子中将是获取辅助服务AccessibilityService时各方法类都需要去实现或获取mAccessibilityService的接口回调,此时适合使用基类进行封装
例:
/**
* 辅助服务事件观察者基类
**/
public abstract class BaseEventObserver {
protected final Context mContext;
protected final AccessibilityService mAccessibilityService;
// protected Handler mHandler = new Handler();
public BaseEventObserver(Context context, AccessibilityService service) {
mContext = context;
mAccessibilityService = service;
}
public Context getContext() {
return mContext;
}
public AccessibilityService getAccessibilityService() {
return mAccessibilityService;
}
/**
* 设置APP窗口变化处理
*
*/
// public abstract void onWindowsChanged(String pkgName);
public abstract void onWindowsChanged(AccessibilityEvent event, String pkgName);
/**
* 窗口变化处理
*
*/
public void onWindowsChanged(AccessibilityNodeInfo info, AccessibilityEvent event, String pkgName) {
}
}
此处例子中将辅助服务的两个窗口处理接口封装成基类,也是一个父类,供继承者调用
以下是调用例子:
public class AutoSetPermissionClicker extends BaseEventObserver implements IAutoPermission, IModelCallback {
private boolean mClickedUsage = false;
// 找到自身APP的时间 用于过滤点击
private long mFindMyAppTime;
public AutoSetPermissionClicker(Context context, AccessibilityService service) {
super(context, service);
PermissionModelSingleton.getInstance().registerModelCallback(this);
}
@Override
public void autoPermission(AccessibilityEvent accessibilityEvent, AccessibilityService accessibilityService) {
if(!ActivityHolder.isAgreeEula()){
return;
}
}
/**
* 设置APP窗口变化处理
*/
@Override
public void onWindowsChanged(AccessibilityEvent event, String pkgName) {
}
/**
* 窗口变化处理
*/
public void onWindowsChanged(AccessibilityNodeInfo info, AccessibilityEvent event, String pkgName) {
// if(ActivityHold.isAgreeEula()) {
// autoClick(info); // for 忽略省电优化
// }
}
/**
* 窗口变化处理
*/
@Override
public void onPermissionWindowsChanged(AccessibilityNodeInfo info, AccessibilityEvent event, String pkgName) {
// if(!ActivityHold.isAgreeEula()){
// return;
// }
// autoClick(info); // slowly
}
例子2
/**
* @brief 过滤屏蔽内置浏览器打开链接
**/
public class BroserInterceptObserver extends BaseEventObserver {
private static boolean isAliPayChatWindow = false;
private static boolean isWeChatChatWindow = false;
//false 开启拦截 true 打开拦截
private static boolean InternalBrowserWatcher_AliPay=false;
private static boolean InternalBrowserWatcher_WeChat=false;
private static boolean InternalBrowserWatcher_DingDing=false;
private static final String TAG = "BroserInterceptObserver";
private ExitHandler mExitHandler;
private static final int MSG_WHAT_LAUNCHER_BROSER=1;
private static final int MSG_WHAT_WEICHAT_BROSER=0;
private static final int MSG_WHAT_SCREEN_BROSER=2;
private static final int MSG_WHAT_SCREEN_NOTIFICATION=3;
public BroserInterceptObserver(Context context, AccessibilityService service) {
super(context, service);
mExitHandler = new ExitHandler(this);
}
@Override
public void onWindowsChanged(AccessibilityEvent event, String pkgName) {
// boolean browserWatcher = isInternalBrowserWatcher();
//Log.d(TAG, "onWindowsChanged.......browserWatcher=" + browserWatcher);
}
}
将一些公用的方法或接口做成一个基类提供给继承者使用做其他功能。