91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Android中實現一個hook點擊事件

發布時間:2021-03-08 14:26:06 來源:億速云 閱讀:398 作者:Leah 欄目:移動開發

本篇文章給大家分享的是有關怎么在Android中實現一個hook點擊事件,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。

1.先建一個代理類實現View.OnClickListener,用來做點擊后的后續處理。

import android.view.View;

/**
 * 實現點擊監聽
 */
public class OnClickListenerProxy implements View.OnClickListener{
  private View.OnClickListener mOriginalListener;

  //直接在構造函數中傳進來原來的OnClickListener
  public OnClickListenerProxy(View.OnClickListener originalListener) {
    mOriginalListener = originalListener;
  }

  @Override public void onClick(View v) {
    if (mOriginalListener != null) {
      mOriginalListener.onClick(v);
    }
    Log.d("LOGCAT","hooked!");
  }
}

2.通過java的反射機制進行hook

public static void hookOnClickListener(View view) {
    try {
      // 得到 View 的 ListenerInfo 對象
      Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
      //修改getListenerInfo為可訪問(View中的getListenerInfo不是public)
      getListenerInfo.setAccessible(true);
      Object listenerInfo = getListenerInfo.invoke(view);
      // 得到 原始的 OnClickListener 對象
      Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");
      Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");
      mOnClickListener.setAccessible(true);
      View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);
      // 用自定義的 OnClickListener 替換原始的 OnClickListener
      View.OnClickListener hookedOnClickListener = new OnClickListenerProxy(originOnClickListener);
      mOnClickListener.set(listenerInfo, hookedOnClickListener);
    } catch (Exception e) {
      Log.d("LOGCAT","hook clickListener failed!", e);
    }
  }

3.在你需要hook的事件后調用上面這個hookOnClickListener

Button btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        log.info("onClick");
      }
    });
    HookManager.hookOnClickListener(btnSend);

4.作為統計埋點,不免需要帶點參數

在原業務代碼的onClick里設置參數

private View.OnClickListener clickBtn = new Button.OnClickListener(){
    @Override
    public void onClick(View v) {
      Map map = new HashMap();
      map.put("name",v.getClass().getName());
      v.setTag(v.getId(),map);
      HookManager.hookOnClickListener(v);
    }
  };

在自定義的代理onClick里接收參數

@Override public void onClick(View v) {
    if (mOriginalListener != null) {
      mOriginalListener.onClick(v);
    }
//    Log.d("LOGCAT","hooked!"+v.getId());
    //拿到之前傳遞的參數
    Object obj = v.getTag(v.getId());
    Log.d("LOGCAT","hooked!"+v.getId()+"_"+obj.toString());
  }

以上就是怎么在Android中實現一個hook點擊事件,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福州市| 鹤庆县| 武陟县| 通化县| 周宁县| 依兰县| 金堂县| 绥滨县| 鲁甸县| 连平县| 崇明县| 周至县| 兴国县| 昆明市| 宁武县| 广汉市| 商洛市| 乌海市| 商丘市| 黎平县| 堆龙德庆县| 喀喇沁旗| 衡南县| 海晏县| 宣化县| 辽宁省| 阿城市| 彰化市| 叶城县| 陆川县| 德安县| 陵川县| 手机| 莱州市| 宝应县| 哈密市| 西平县| 多伦县| 海南省| 巢湖市| 陇西县|