天天看点

android apk调用apk的方式汇总

1.使用自定义 Action A 程序中调用的代码为: 1 Intent intent = new Intent();

2 intent.setAction("com.test.action.PLAYER");

3 startActivity(intent);

B 程序中的 AndroidManifest.xml 中启动 Activity 的 intent-filter:

 1 <intent-filter> 2 3 4 <action android:name="android.intent.action.MAIN" />

 <action android:name="com.test.action.PLAYER" />

<category android:name="android.intent.category.DEFAULT" /><!- -必须,否则无效-->

5 <category android:name="android.intent.category.LAUNCHER" /> 6 </intent-filter>

 2.使用包类名 A 程序中调用的代码为: 1 Intent intent = new Intent();

2 intent.setClassName("com.test", "com.test.Player"); 3 startActivity(intent);

intent.setClassName(arg1,arg2)中的 arg1 是被调用程序 B 的包名,arg2 是 B 程序中目的 activity 的完整类名。

又或者: 1 Intent intent = new Intent();

2 ComponentName comp = new ComponentName("com.test", "com.test.Player " );

3 intent.setComponent(comp); 4 startActivity(intent);

B 程序(被调用)中的 AndroidManifest.xml 中启动 Activity 的 intent-filter 不需要特别加入其它信息,如下即可:

 1 <intent-filter> 2 3 <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" /> 4 </intent-filter> 隐式调用 多个 Activity 之间的相互调用:

新建一个类继承 Activity 类, 在功能清单 AndroidManifest.xml 文件中添加进上面 Activity 的配置代码,

打开新的 Activity:startActivity(new Intent(MainActivity.this, NewActivity.class)); 打开新的 Activity,并传递若干个参数给它: Intent intent = new Intent(MainActivity.this, NewActivity.class) Bundle bundle = new Bundle();//该类用作携带数据 bundle.putString("name", "姓名"); bundle.putInt("age", 4); intent.putExtras(bundle);//附带上额外的数据 startActivity(intent); 在另一个 Activity 里面接收参数: Bundle bundle = this. getIntent(). getExtras(); String name = bundle. getString("name"); int age = bundle. getInt("age"); Bundle 类用作携带数据,它类似于 Map,用于存放 key-value 名值对形式的值。相对于 Map,它提供 了各种常用类型的 putXxx()/ getXxx()方法,如:putString()/ getString()和 putInt()/ getInt(),putXxx()用于往 Bundle 对象放入数据, getXxx()方法用于从 Bundle 对象里获取数据。Bundle 的内部实际上是使用了 HashMap 类型的变量来存放 putXxx()方法放入的值: 请求码的作用: 使用 startActivityForResult(Intent intent, int requestCode)方法打开新的 Activity,我们需要为 startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于 标识请求来源。

例如:一个 Activity 有两个按钮,点击这两个按钮都会打开同一个 Activity,不管是那个按 钮打开新 Activity, 当这个新 Activity 关闭后, 系统都会调用前面 Activity 的 onActivityResult(int requestCode, int resultCode, Intent data)方法。在 onActivityResult()方法如果需要知道新 Activity 是由那个按钮打开的, 并且要做出相应的业务处理。 结果码的作用: 在一个 Activity 中, 可能会使用 startActivityForResult()方法打开多个不同的 Activity 处理不同的业务, 当这些新 Activity 关闭后,系统都会调用前面 Activity 的 onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新 Activity,我们就要用到结果码。 Intent(意图): Intent 提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动 作和产生事件。使用 Intent 可以激活 Android 应用的三个核心组件:活动、服务和广播接收器。 Intent 可以划分成显式意图和隐式意图。 显式意图:调用 Intent.setComponent()或 Intent.setClass()方法明确指定了组件名的 Intent 为显式意 图,显式意图明确指定了 Intent 应该传递给哪个组件。 隐式意图:没有明确指定组件名的 Intent 为隐式意图。 对于隐式意图,Android 是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个 intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式 Intent 的,当一个意图对象被一个意图过滤器 进行匹配测试时,只有三个方面会被参考到:动作、数据(URI 以及数据类型)和类别。 动作测试(Action test) 一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器 没有指定任何动作,结果将如下: ? 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图 能够通过这个过滤器。 ? 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试 类别测试(Category test) 对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可 以列举另外的类别,但它不能遗漏在这个意图中的任何类别。 原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这 个是对的。但有一个例外,Android 把所有传给 startActivity()的隐式意图当作他们包含至少一个类别: "android.intent.category.DEFAULT" (CATEGORY_DEFAULT 常量)。 因此, 想要接收隐式意图的活动必须 在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN" 和 "android.intent.category.LAUNCHER"设置的过滤器是例外) 数据测试(Data test) 当一个意图对象中的 URI 被用来和一个过滤器中的 URI 比较时,比较的是 URI 的各个组成部分。例 如,如果过滤器仅指定了一个 scheme,所有该 scheme 的 URIs 都能够和这个过滤器相匹配;如果过滤器 指定了一个 scheme、主机名但没有路经部分,所有具有相同 scheme 和主机名的 URIs 都可以和这个过 滤器相匹配, 而不管它们的路经;如果过滤器指定了一个 scheme、 主机名和路经, 只有具有相同 scheme、 主机名和路经的 URIs 才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这 样只需要部分匹配即可。 数据测试同时比较意图对象和过滤器中指定的 URI 和数据类型。规则如下: a. 一个既不包含 URI 也不包含数据类型的意图对象仅在过滤器也同样没有指定任何 URIs 和数据类型 的情况下才能通过测试。 b. 一个包含 URI 但没有数据类型的意图对象仅在它的 URI 和一个同样没有指定数据类型的过滤器里 的 URI 匹配时才能通过测试。 这通常发生在类似于 mailto:和 tel: 这样的 URIs 上: 它们并不引用实际数据。 c. 一个包含数据类型但不包含 URI 的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指 定一个 URI 的情况下才能通过测试。 d. 一个同时包含 URI 和数据类型(或者可从 URI 推断出数据类型)的意图对象可以通过测试, 如果它的 类型和过滤器中列举的类型相匹配的话。 如果它的 URI 和这个过滤器中的一个 URI 相匹配或者它有一个内 容 content:或者文件 file: URI 而且这个过滤器没有指定一个 URI,那么它也能通过测试。换句话说,一个 组件被假定为支持 content:和 file: 数据如果它的过滤器仅列举了一个数据类型。