2017-09-16 70 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(); 
    } 
}