繁体   English   中英

Android通过不同进程非活动类通知应用程序

[英]Android Informing application through different process non-activity class

我目前正在开发需要一些adb命令的应用程序

首先,我在应用程序Module1中有一个单独的模块,在其中有com.mordred.xyz.Main类。

public class Main {
    public static void main(String[] args) {
         System.out.println("mordred main class is instantiated");
         // rest of code
    }
}

我正在通过adb实例化该主类(com.mordred.xyz.Main)( adb shell dalvikvm -cp com.mordred.MyApplication com.mordred.xyz.Main

我的应用程序中有一个MainActivity(com.mordred.MyApplication.MainActivity)

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // MainActivity rest of code
    }
}

所以问题是即使关闭应用程序,我如何通知application.MainActivity“ Main类通过adb实例化”?

我尝试使用Context.sendIntent,但是它需要Context对象,并且我也无法从MainActivity或其他对象传递Context对象(因为即使应用程序未运行,我也希望可以实例化Main类)

我不想使用隐藏的api(IActivityManager具有broadcastIntent方法,但是该类是隐藏的系统api)

我该怎么办?

更新:

尤里卡,也许我找到了办法,

我将在Main类中设置一个硬编码的路径并在其中创建一个虚拟文件,然后将通过File.setReadable()向所有人提供可读和可写的权限,然后在实例化Main类时,它将编写类似“ Main: 1“放入该文件,然后将检查添加到应用程序的MainActivity类中,该类将检查该文件是否为“ Main:1”,(“ Main:1”表示实例化了Main类,否则将实例化“ Main:0 “反之亦然)

好的,我发现了一种更干净,更好的方法,是的,它的反射技巧:P

这是我在全球范围内发送Intent的功能,可以从任何地方调用

我对其进行了测试,并且效果很好,并且还请注意:它用于>棉花糖,(因为主要的broadcastIntent()方法的参数类型)

public void sendGlobalIntent(Intent intent,String[] requiredPermissions) {
    try {
        Class<?> cActivityManagerNative = Class
                .forName("android.app.ActivityManagerNative");
        Method mGetDefault = cActivityManagerNative.getMethod("getDefault");
        mGetDefault.setAccessible(true);
        Object oActivityManagerNative = mGetDefault.invoke(null);
        Method[] methods = cActivityManagerNative.getMethods();
        Method m = null;
        for (Method method : methods) {
            if (m.getName().equals("broadcastIntent")) {
                m = method;
            }
        }
        if (m == null) {
            return;
        }
        m.setAccessible(true);
        m.invoke(oActivityManagerNative, null, intent, null, null, 0, null,
                null, requiredPermissions, -1, null, true, false, android.os.Process.myUid() / 100000);

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM