没有合适的资源?快使用搜索试试~ 我知道了~
首页android中跨进程通讯的4种方式
由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
资源详情
资源评论
资源推荐

android
中跨进程通讯的
4
种方式
分类:android2011-05-25 11:25257 人阅读评论(0)收藏举报
由于 android 系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就
稍微麻烦一些。在 android SDK 中提供了 4 种用于跨进程通讯的方式。这 4 种方式正好对应于 android 系
统中 4 种应用程序组件:Activity、Content Provider、Broadcast 和 Service。其中 Activity 可以跨进程调
用其他应用程序的 Activity;Content Provider 可以跨进程访问其他应用程序中的数据(以 Cursor 对象形
式返回),当然,也可以对其他应用程序的数据进行增、删、改操作;Broadcast 可以向 android 系统中
所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service 和 Content Provider
类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider 返回的是 Cursor 对象,而
Service 返回的是 Java 对象,这种可以跨进程通讯的服务叫 AIDL 服务。
完整示例请参阅本文提供的源代码。
方式一:访问其他应用程序的 Activity
Activity 既可以在进程内(同一个应用程序)访问,也可以跨进程访问。如果想在同一个应用程序中访问
Activity,需要指定 Context 对象和 Activity 的 Class 对象,代码如下:
1. Intentintent=newIntent(this,Test.class);
2. startActivity(intent);
Activity 的跨进程访问与进程内访问略有不同。虽然它们都需要 Intent 对象,但跨进程访问并不需要指
定 Context 对象和 Activity 的Class 对象,而需要指定的是要访问的 Activity 所对应的 Action(一个字符
串)。有些 Activity 还需要指定一个 Uri(通过Intent 构造方法的第 2 个参数指定)。
在 android 系统中有很多应用程序提供了可以跨进程访问的 Activity,例如,下面的代码可以直接调
用拨打电话的 Activity。
1. IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
2. startActivity(callIntent);
执行上面的代码后,系统会自动拨号,界面如图 1 所示。

在调用拨号程序的代码中使用了一个 Intent.ACTION_CALL 常量,该常量的定义如下:
1. publicstaticfinalStringACTION_CALL="android.intent.action.CALL";
这个常量是一个字符串常量,也是我们在这节要介绍的跨进程调用 Activity 的关键。如果在应用程序
中要共享某个 Activity,需要为这个Activity 指定一个字符串 ID,也就是 Action。也可以将这个 Action 看
做这个 Activity 的 key。在其他的应用程序中只要通过这个Action 就可以找到与 Action 对应的 Activity,并
通过 startActivity 方法来启动这个 Activity。
下面先来看一下如何将应用程序的 Activity 共享出来,读者可按如下几步来共享 Activity:
1. 在 AndroidManifest.xml 文件中指定 Action。指定 Action 要使用<action>标签,并在该标签的
android:name 属性中指定 Action
2. 在 AndroidManifest.xml 文件中指定访问协议。在指定 Uri(Intent 类的第 2 个参数)时需要访问协议。
访问协议需要使用<data>标签的 android:scheme 属性来指定。如果该属性的值是“abc”,那么 Uri 就应该
是“abc://Uri 的主体部分”,也就是说,访问协议是 Uri 的开头部分。
3. 通过 getIntent().getData().getHost()方法获得协议后的 Uri 的主体部分。这个 Host 只是个称谓,并不一
定是主机名。读者可以将其看成是任意的字符串。
4. 从 Bundle 对象中获得其他应用程序传递过来的数据。
5. 这一步当然是获得数据后做进一步的处理了。至于如何处理这些数据,就得根据具体的需求决定了。
下面来根据这些步骤共享一个 Activity。首先建立一个 android 工程(ActionActivity),工程的主
Activity 是 Main。在本例中我们会共享这个 Main 类。首先打开 AndroidManifest.xml 文件,添加一个
<activity>标签,并重新定义了Main 的相应属性。AndroidManifest.xml 文件的内容如下:

1. <!--重新配置 Main-->
2. <activityandroid:name=".Main"android:label="@string/app_name">
3. <intent-filter>
4. <actionandroid:name="net.blogjava.mobile.MYACTION"/>
5. <dataandroid:scheme="info"/>
6. <categoryandroid:name="android.intent.category.DEFAULT"/>
7. </intent-filter>
8. </activity>
在配置 AndroidManifest.xml 时要注意,不能在同一个<activity>中配置多个动作,否则会覆盖 MAIN
动作以使该程序无法正常启动(虽然其他应用程序调用 Main 是正常的)。
从上面的代码可以看出,<action>标签的 android:name 属性值是
net.blogjava.mobile.MYACTION,这就是 Main 自定义的动作。<data>标签指定了 Url 的协议。如果指定
了<data>标签的 android:scheme 属性值(info),则在调用 Main 时需要使用如下的 URL:
1. info://任意字符串
一般<category>标签的 android:name 属性值可以设成 android.intent.category.DEFAULT。
下面来看看如何在 Main 类的 onCreate 方法中获得其他应用程序传递过来的数据。
1. packagenet.blogjava.mobile.actionactivity;
2. ......
3. publicclassMainextendsActivityimplementsOnClickListener
4. {
5. privateEditTexteditText;
6. @Override
7. publicvoidonClick(Viewview)
8. {
9. //单击按钮,会显示文本框中的内容(以 Toast 信息框形式显示)
10. Toast.makeText(this,editText.getText().toString(),Toast.LENGTH_LONG)
11. .show();
12. }
13. @Override
14. publicvoidonCreate(BundlesavedInstanceState)
15. {
16. super.onCreate(savedInstanceState);

17. setContentView(R.layout.main);
18. Buttonbutton=(Button)findViewById(R.id.button);
19. button.setOnClickListener(this);
20. editText=(EditText)findViewById(R.id.edittext);
21. //获得其他应用程序传递过来的数据
22. if(getIntent().getData()!=null)
23. {
24. //获得 Host,也就是 info://后面的内容
25. Stringhost=getIntent().getData().getHost();
26. Bundlebundle=getIntent().getExtras();
27. //其他的应用程序会传递过来一个 value 值,在该应用程序中需要获得这个值
28. Stringvalue=bundle.getString("value");
29. //将 Host 和 Value 组合在一下显示在 EditText 组件中
30. editText.setText(host+":"+value);
31. //调用了按钮的单击事件,显示 Toast 信息提示框
32. onClick(button);
33. }
34. }
35. }
从上面的程序可以看出,首先通过 getIntent().getData()来判断其他的应用程序是否传递了
Uri(getData 方法返回了一个 Uri 对象)。如果运行该程序,Uri 为 null,因此,不会执行 if 语句里面的代
码。当其他的应用程序传递了 Uri 对象后,系统会执行 if 语句里面的代码。当运行 ActionActivity 后,在
文本框中输入“Running”,单击“显示文本框的内容”按钮,会显示如图 2 所示的 Toast 提示信息框。
剩余19页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论7