正月には、豚、アヒル、鶏を殺すためのナイフが必要です。共通しているのは、すべて「ナイフ」方式が必要なことです。ナイフを入手するには2つの方法があります。まず、近所の人から借ります。 。ナイフを長期間使用する場合は、近所の人から借りることができます。次に、ナイフを作った後、繰り返しナイフを使用して殺すことができます。それ以外の場合は、今日と明日しかナイフを持てません。もう一度ナイフを借りなければならず、時間が無駄になります。
今日学んだのは自分でナイフを作ることです。基本クラスはナイフです。一般的な方法は鶏やアヒルを殺すことです。
コンポーネントベースの開発では、さまざまな機能が差別化され、モジュール化されています。同じインターフェイスがモジュールで使用されることが多いか、同じ機能メソッドを実装する必要があります。
または、一般的に必要なパラメータなどを渡します。このとき、基本クラスを使用して、一般的に使用されるメソッドをカプセル化する必要があります。
ここで、プロテクトは、共有できないパッケージを除いて取得できるパラメータを宣言します。
この例では、各メソッドクラスは、補助サービス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) {
}
}
この例では、補助サービスの2つのウィンドウ処理インターフェイスが基本クラスにカプセル化されています。基本クラスは、継承者が呼び出す親クラスでもあります。
呼び出し例を次に示します。
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);
}
}
継承者が他の関数に使用できるように、いくつかのパブリックメソッドまたはインターフェイスを基本クラスにします。