中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么在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

平遥县| 汉寿县| 印江| 福建省| 莫力| 崇左市| 尚义县| 达孜县| 三门县| 宁阳县| 安仁县| 土默特左旗| 平顶山市| 武义县| 巴南区| 滁州市| 山东| 北海市| 织金县| 东至县| 丰都县| 永嘉县| 玉环县| 深州市| 赤水市| 灌云县| 平谷区| 花莲县| 苏尼特右旗| 金湖县| 和静县| 贡嘎县| 慈利县| 耿马| 图们市| 体育| 循化| 青冈县| 洞口县| 伊宁市| 龙山县|