关闭

一个apk调用另一个apk的某个activity (根据帖子整理)

标签: androidactionexceptiongoogleapigo
1550人阅读 评论(0) 收藏 举报
分类:

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的名字,只能你自己手动筛选了..

===

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:289573次
    • 积分:3497
    • 等级:
    • 排名:第9840名
    • 原创:7篇
    • 转载:430篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论