安卓开发中我们可以使用hook技术拦截系统的方法做自己想要的操作,大多是通过反射实现.
应用场景之一:在用户跳转到目标页面时,我们经常需要判断用户是否登录,如果已登录,正常跳转.否则先跳转到登录页面,登录之后再跳转到目标页面.
1,先写工具类的方法
我们目标是:替换ActivityThread中的H类中的callback
public void hookHandlerCallback(Context context) {
this.context = context;
try {
//通过反射获取到ActivityThread对象threadObj
Class<?> ActivityThreadClass = Class.forName("android.app.ActivityThread");
Field sCurrentActivityThread = ActivityThreadClass.getDeclaredField("sCurrentActivityThread");
sCurrentActivityThread.setAccessible(true);
Object threadObj = sCurrentActivityThread.get(null);
//通过ActivityThread对象threadObj把系统mCallback替换为自己的callback
Field handlerField = ActivityThreadClass.getDeclaredField("mH");
handlerField.setAccessible(true);
Handler mH = (Handler) handlerField.get(threadObj);
Field callbackField = Handler.class.getDeclaredField("mCallback");
callbackField.setAccessible(true);
HandlerCallBack handlerCallBack = new HandlerCallBack(mH);
callbackField.set(mH, handlerCallBack);
} catch (Exception e) {
e.printStackTrace();
}
其中HandlerC