android - xposed在线程中运行以hooked方法显示对话框

标签 android android-alertdialog xposed-framework

我尝试在 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/

相关文章:

java - Android Java中递归文件夹删除(API17)

Android - onContextItemSelected 中的 AlertDialog 不起作用

android - 关于卸载 Android 应用程序的警报

java - 如果返回类型是 xpose 中的 list<string>,我该如何 Hook ?

android - Xpose 如何创建带有 GUI 首选项屏幕的模块

Android 信任特定域证书

Android:使用搜索 API 做相当于 startActivityForResult

android - Javascript 接口(interface)类中的 SetText

android Activity 已泄露窗口 com.android.internal.policy.impl.phonewindow$decorview 问题

java - Android系统如何告诉应用程序该应用程序已进入后台(不可见)?