http://www.eoeandroid.com/thread-68933-1-1.html
如果未知被调用的activity名,如何在一个apk中调用另一个apk
我现在在一个项目运行的时候,跳转到另一个项目,并且并不知道另一个项目的main activity名字。Intent intent = new Intent();
ComponentName comp = new ComponentName("com.leqi.activity","com.leqi.activity.IndexActivity");//第一个参数是目标包名,第二个参数是目标包的activity名
intent.setComponent(comp);
intent.setAction("android.intent.category.MIAN");
startActivity(intent);
但是我现在并不知道第二个项目的main activity的名称,不知道该怎么调用。并且我想做到把第二个项目嵌入到第一个项目中,也就是说并不是同时安装两个应用,而是在一个应用内部调用一个子应用。小弟才疏学浅,还请各位帮助。感激不尽!!!!
===
一个应用就是调用另一个Activity,你需要学一下隐式和显示调用另一个Activity的方法,去google吧
===
用Intent的ACTION,隐式调用
===
http://wenku.baidu.com/view/a555b4d676eeaeaad1f330a8.html
功能:Caller.apk调用Callee.apk中的CalleeMainActivity和CalleeLowerActivity。
定义:
Caller.apk:去调用的apk, 包名为com.caller
Callee.apk:被调用的apk, 包名为com.callee
CalleeMainActivity:manifest.xml中的intent-filter字段带有<action android:name="android.intent.action.MAIN" />的activity
CalleeLowerActivity:manifest.xml中的intent-filter字段不带<action android:name="android.intent.action.MAIN" />的activity
做法:
1、需要在Caller.apk的manifest.xml中添加需要调用的activity的声明:
<activity android:name=activity的名称>
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<!-- "activity的名称"为:"com.callee.CalleeMainActivity"或"com.callee.CalleeLowerActivity"-->
2、Caller.apk中实现的调用代码:
try{
ComponentName toActivity = new ComponentName(需要启动apk的包名,需要启动的activity);
Intent intent = new Intent();
intent.setComponent(toActivity);
intent.setAction("android.intent.action.VIEW");
CurActivity.this.startActivity(intent);
}catch(Exception e){
Log.v("go to apk error","------>"+e.toString());
}
<!-- "需要启动apk的包名"为:com.callee-->
<!-- "需要启动的activity"为:"com.callee.CalleeMainActivity"或者"com.callee.CalleeLowerActivity"-->
3、对于启动类似CalleeMainActivity的activity,以上步骤就够了,但是对于类似CalleeLowerActivity的activity,还需要在Callee.apk的manifest.xml中添加一些代码,有两种处理方式:
A.最简单,只要在Callee.apk的manifest.xml中的CalleeLowerActivity对应的activity字段中添加android:exported="true"即可。
B.将A的设置的exported设置为false,然后两个apk协商一个ShareUserId放在各自的manifest.xml中,这种做法可以实现只有知道ShareUserId的apk才能调用。
http://www.eoeandroid.com/thread-33862-1-1.html
调用已安装的APK程序
我想调用已经安装的APK程序,用以下代码可以调用系统的相机程序Intent mIntent = new Intent();
ComponentName comp = new ComponentName("com.android.camera","com.android.camera.Camera");
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW");
startActivity(mIntent);
调用已安装好的程序需要知道包名和对应程序启动的类名,通过PackageInfo或ApplicationInfo可以获取程序名,包名但获取不到类名。有做过这方面的高手给点知道意见啊!谢谢先。。。
===
通过ResolveInfo取得类名
===
如果只是单纯的想打开,还用不了这么复杂。直接:
PackageManager .getLaunchIntentForPackage( PackageName ) ;就可以获得到改程序包默认的launch_intent
另外,说Component是类名就不专业了,它是组建嘛~这个也是可以获取到的,PackageInfo里有activities域包含所有包里的activity信息,activities.name就是相应组建的名字。
===
谢谢各位大哥的帮助,用版主大人的getLaunchIntentForPackage方法已经搞定。。。
===
getLaunchIntentForPackage是获取apk包里面优先级最高的那个activity来启动,具体的你可以去看看那api相关的源码,,,好像记得有个方法可以获取manifest里所有activity的名字,只能你自己手动筛选了..
===