我尝试在 xposed 的 Hook 方法中显示 AlertDialog。 问题是方法在一个线程中运行,而这个线程在一个线程中运行,等等...
例如: Activity -> 线程 -> 线程 -> ... -> 函数
有没有办法显示我的 AlertDialog ?我有上下文,但是由于钩子(Hook)函数不在主线程中,所以没用。
编辑(一些代码):
public class Xposed implements IXposedHookLoadPackage {
private Context ctx;
private Queue<String> queue = new LinkedList<>();
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("xxx.xxx.xxx")) {
return;
}
// Here I get the context from the static class extending Application
findAndHookMethod("xxx.xxx.xxx", lpparam.classLoader, "attachBaseContext", Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("context modified");
ctx = (Context) param.args[0];
}
});
findAndHookMethod("com.xxx.xxx.xxx", lpparam.classLoader, "e", "com.xxx.xxx.xxx", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
if (!(param.args[1]).equals("xxxxxxxxxxxxxx")) {
return ;
}
XposedBridge.log("New element detected detected");
Object param = param.args[0];
Object info = callMethod(param, "q");
// Here, I want to show my alertdialog
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
}
}
};
// I get the classic error like what I can't modify the ui
// in a thread that has not called Looper.prepare()
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setMessage("Are you sure ?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener)
.show();
}
});
}
谢谢
最佳答案
您始终可以保留当前 Activity 的引用 (android.app.Instrumentation.newActivity)。它是这样的:
Class<?> instrumentation = XposedHelpers.findClass(
"android.app.Instrumentation", lpparam.classLoader);
Method method = instrumentation.getMethod("newActivity",
ClassLoader.class, String.class, Intent.class);
XposedBridge.hookMethod(method, iHook);
在这种情况下,ihook 将是您的一个 Hook ,它只静态存储当前 Activity,因此您可以从任何地方调用 runOnUiThread:
public class ActivityHook extends XC_MethodHook{
/* Assure latest read of write */
private static volatile Activity _currentActivity = null;
public static Activity getCurrentActivity() {
return _currentActivity;
}
@Override
protected Object afterHookedMethod(MethodHookParam param)
throws Throwable {
_currentActivity = (Activity) param.getResult();
}
}
然后你就可以在任何地方做:
ActivityHook.getCurrentActivity().runOnUiThread(...);
祝你好运!
关于android - xposed在线程中运行以hooked方法显示对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102901/