2017-01-18 3 views
2

Как и заголовок, я хочу подключить третье приложение и могу вызвать активность своего приложения из активности третьего приложения. Итак, я хочу получить контекст третьего приложения, как мне это сделать?Xposed: Как получить контекст подключенного приложения?

Комплект третьего приложения: com.ss.android.gallery.heavy, пакет моего проекта: com.example.hao.hookstartupinterfacetest;

Моего Xposed Module.java (MainActivity здесь деятельность моего проекта)

XposedHelpers.findAndHookMethod("com.ss.android.gallery.heavy.activity.SplashActivity", 
       loadPackageParam.classLoader, "getMainIntent", new XC_MethodReplacement() { 
        @Override 
        protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 
         Context context = (Activity)methodHookParam.getResult(); 
         return new Intent(context, MainActivity.class); 
        } 
       }); 

SplashActivity.class (Это в третьем приложении, MainActivity здесь принадлежит третьему приложению.)

public class SplashActivity extends BaseSplashActivity{ 
     protected Intent getMainIntent(){ 
      return new Intent(this, MainActivity.class); 
     } 
    } 

Ошибка

01-18 20:38:23.669 4730-4730/com.ss.android.gallery.heavy E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.ss.android.gallery.heavy, PID: 4730 
    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.ss.android.gallery.heavy/com.example.hao.hookstartupinterfacetest.MainActivity}; have you declared this activity in your AndroidManifest.xml? 
     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1777) 
     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1501) 
     at android.app.Activity.startActivityForResult(Activity.java:3745) 
     at android.app.Activity.startActivityForResult(Activity.java:3706) 
     at android.app.Activity.startActivity(Activity.java:4016) 
     at android.app.Activity.startActivity(Activity.java:3984) 
     at com.ss.android.gallery.base.activity.BaseSplashActivity.goMainActivity(BaseSplashActivity.java:61) 
     at com.ss.android.gallery.base.activity.BaseSplashActivity.access$000(BaseSplashActivity.java:17) 
     at com.ss.android.gallery.base.activity.BaseSplashActivity$1.run(BaseSplashActivity.java:76) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102) 
+0

[AndroidAppHelper.currentApplication] (http://api.xposed.info/reference/android/app/AndroidAppHelper.html#currentApplication()) –

+0

Привет, вы замечательный, я решаю проблему, но она не может позвонить мне активность приложения. Вы знаете принцип? – hao

+0

Что вы пытаетесь сделать? Измените свой вопрос и добавьте код и любые ошибки, с которыми вы столкнулись. –

ответ

0

Вы пытаетесь начать деятельность вашего приложения непосредственно с помощью контекстного вывода f подключенное приложение, которое не работает, поскольку эта активность фактически не является частью подключенного приложения (следовательно, ошибка «не определена в AndroidManifest.xml»). Вы должны явно указать ваше приложение пакета и полное имя класса, когда вы создаете свое намерение:

Intent intent = new Intent(); 
intent.setClassName(
    // Your app's package name 
    "com.example.hao.hookstartupinterfacetest", 
    // The full class name of the activity you want to start 
    "com.example.hao.hookstartupinterfacetest.MainActivity"); 
return intent; 

Вы также должны установить android:exported свойство вашего MainActivity к true внутри AndroidManifest.xml, так что он может быть запущен подключенное приложение.

Кроме того, Context context = (Activity)methodHookParam.getResult();, вероятно, должен быть Context context = (Activity)methodHookParam.thisObject;, хотя на самом деле этого не требуется.

0

Если вы хотите запустить мероприятие с помощью метода, вы можете использовать следующий код.

Примечание: Ответ основан на моем понимании вопроса (я не понял английский вопрос). Просьба прокомментировать ниже до голосования.

Intent intent = new Intent(); 
intent.setComponent(new ComponentName("com.example.hao.hookstartupinterfacetest", "com.example.hao.hookstartupinterfacetest.MainActivity")); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
AndroidAppHelper.currentApplication().startActivity(intent); 

Если вы хотите получить контекст стороннего приложения. Вы можете передать param.thsobject в Activity.

Activity activity = (Activity) param.thisobject; 

, то вы можете использовать

activity.getApplicationContext(); 

убедитесь, что класс (который вы подключаете) является экземпляром деятельности в противном случае вы не можете бросить param.thisobject в операцию. Надеюсь, это поможет.

Смежные вопросы