2017-09-16 66 views
1

我目前正在开发这需要一些ADB命令通过不同的过程的非活性类的Android:通知应用

首先我在应用模块1一个单独的模块的应用程序,并且有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(adb shell dalvikvm -cp com.mordred.MyApplication com.mordred.xyz.Main

是主类(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,即使应用程序已关闭“主类是通过adb实例化”?

我试图Context.sendIntent但它需要上下文对象的,也是我无法从MainActivity还是其他物体传递上下文对象(因为我想主要的类可以被实例化,即使应用程序没有运行)

我不要使用隐藏的API(IActivityManager具有broadcastIntent方法,但这个类是隐藏的系统API)

我能为它做些什么?

UPDATE:

灵光,也许我找到了一种方法,

我将在主类中的硬编码路径,并在那里创建一个虚拟文件,然后会给出一个可读写的权限给大家通过File.setReadable(),然后当Main类被实例化时,它会在该文件中写入类似“Main:1”的内容,然后我将在应用程序的MainActivity类中添加一个检查,该类将检查该文件是否为“Main:1 “与否,(”主:1" 的意思是主类被实例化,否则‘主:0’表示反之亦然)

回答

0

OK如果ound一个更清洁,更好的方式来做到这一点,是它的反射黑客:P

这里是我做了在全球范围内发送意图可以从任何地方

我测试了它被调用的函数和它的作品好,还要注意:它是用于>棉花糖,(因为主要的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(); 
    } 
}