您的位置:首页 > 移动开发 > Android开发

[置顶] Android进程之间通信的四种方式

2016-10-27 09:14 267 查看
于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服务。

跨进程通信方式如下:

1:访问其他应用程序的Activity

比如现在有两个Activity A 和B ,我们需要从B客户端启动A客户端的Activity,

这个时候我们需要在A的清单列表当中把A的activity 注册为如下:

1.

2.

3.

4.

5.

在B中启动A 的activity 启动方式如下:

1. Intent intent = new Intent(“android.intent.action.APP_A_SECOND_ACTIVITY”);

2. startActivity(intent);

2:Content Provide

Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content Provider完成下面的工作


1. 查询数据

2. 修改数据

3. 添加数据

4. 删除数据

虽然Content Provider也可以在同一个应用程序中被访问,但这么做并没有什么意义。Content Provider存在的目的向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改操作。

Android系统本身提供了很多Content Provider,例如,音频、视频、联系人信息等等。我们可以通过这些Content Provider获得相关信息的列表。这些列表数据将以Cursor对象返回。因此,从Content Provider返回的数据是二维表的形式。

3:广播(Broadcast)

广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。

在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据

发送广播的代码如下:

1. // 通过Intent类的构造方法指定广播的ID

2. Intent intent = new Intent(“net.blogjava.mobile.MYBROADCAST” );

3. // 将要广播的数据添加到Intent对象中

4. intent.putExtra(“text” , editText.getText().toString());

5. // 发送广播

6. sendBroadcast(intent);

注意: net.blogjava.mobile.MYBROADCAST 是自己定义的一个协议,(自己起的)

在另外一个客户端接受广播的代码如下:

首先第一步:在 注册文件注册广播,指定广播的协议,代码如下:
<!--  注册receiver 


1.

2.

3.

4.

5.

第二步: 在activity 里面接收广播,代码如下:

首先需要自定义一个类,继承 BroadcastReceiver,重写他的 onReceive,这里是用来接收广播发送的广播信息,代码如下:

public class MyReceiver extends BroadcastReceiver

1. {

2. // 当sendbroadcast发送广播时,系统会调用onReceive方法来接收广播

3. @Override

4. public void onReceive(Context context, Intent intent)

5. {

6. // 判断是否为sendbroadcast发送的广播

7. if (“net.blogjava.mobile.MYBROADCAST”.equals(intent.getAction()))

8. {

9. Bundle bundle = intent.getExtras();

10. if (bundle != null)

11. {

12. String text = bundle.getString(“text”);

13. Toast.makeText(context, “成功接收广播:” + text, Toast.LENGTH_LONG).show();

14. }

15. }

16. }

17. }

4:AIDL服务

服务(Service)是android系统中非常重要的组件。Service可以脱离应用程序运行。也就是说,应用程序只起到一个启动Service的作用。一但Service被启动,就算应用程序关闭,Service仍然会在后台运行。
android系统中的Service主要有两个作用:后台运行和跨进程通讯。
AIDL的全称是Android Interface Definition Language,也就是说,AIDL实际上是一种接口定义语言。通过这种语言定义接口后,Eclipse插件(ODT)会自动生成相应的Java代码接 口代码。下面来看一下编写一个AIDL服务的基本步骤。

使用AIDL 的场景:
只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL”(存在同时访问客户端的情况的时候使用ALDL)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: