Android系统层面使用Binder机制实现进程间通讯,而在应用层(Application),进程间或者程序之间的通信方式主要使用Intent,Broadcast,AIDL,ContentProvider,实际上应用层进程间的通信方式Intent,Broadcast,AIDL都是基于系统层的Binder通信机制的,底层实现都依赖于Binder,而ContentProvider是基于数据库查询,严格来说ContentProvider只能说是一种程序间的数据访问方式,它一般用来访问本程序或者其他程序的静态数据,这里所说的静态数据是相对于其他三种进程间的通讯数据而言,前三种进程间通信数据都是实时的,数据变动较快,而ContentProvider所访问的数据变动性不是太大,比如电话簿和短信等,所以称ContentProvider共享的数据一般为静态数据;
Intent:使用Intent对象可以实现同进程(同一个应用)访问,也可以实现跨进程的访问。在同一个进程内访问Activity,需要指定Context对象和Activity对象,具体代码如下:
而跨进程访问并不需要Context对象和Activity对象,但是需要指定所访问的Acitivity对应的Action,有些Activity还需要指定一个Uri对象,比如使用程序启动拨号功能如下:
这段代码中Intent.ACTION_CALL 就是"android.intent.action.CALL"字符串,这个常量是一个字符串常量,也是使用Intent跨进程调用Activity的关键,如果在应用程序中要共享某个Activity,需要为这个Activity指定一个字符串ID,也就是Action,也可以将这个Action看做这个Activity的key,在其他的应用程序中只要通过这个 Action就可以找到与Action对应的Activity,并通过startActivity方法来启动这个Activity。
Broadcast:广播是一种被动跨进程通讯的方式,当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据,这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通,在应用程序中发送广播比较简单,只需要调用sendBroadcast方法即可,该方法需要一个Intent对象,通过Intent对象可以发送需要广播的数据。
ContentProvider:Android应用程序可以使用文件或SqlLite数据库来存储数据。ContentProvider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据),应用程序可以利用ContentProvider完成对数据的增删改查,ContentProvider存在主要作用是向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改、查操作。
Android系统本身提供了很多ContentProvider,例如,音频、视频、联系人信息等等。我们可以通过这些ContentProvider获得相关信息的列表,这些列表数据将以Cursor对象返回,对于访问ContentProvider的程序,需要使用ContentResolver对象。该对象需要使用getContentResolver方法获得,代码如下:
AIDL(Android Interface Definition Language):是Android接口描述语言,也是进程间通信的方式的一种,可以实现客户端和服务端的进程间通信,AIDL接口使用的是直接调用的函数调用方式进行的,而且服务端并不知道多少客户端数量,也不知道客户端何时连接,所以服务端必须是线程安全的。通过AIDL,可以让本地调用远程服务器的接口就像调用本地接口那么简单,让用户无需关注内部细节,只需要实现自己的业务逻辑接口,内部复杂的参数序列化发送、接收、客户端调用服务端的逻辑,你都不需要去关心了。
参考网址:
http://dengzhangtao.iteye.com/blog/1311703
http://blog.youkuaiyun.com/singwhatiwanna/article/details/17041691
Intent:使用Intent对象可以实现同进程(同一个应用)访问,也可以实现跨进程的访问。在同一个进程内访问Activity,需要指定Context对象和Activity对象,具体代码如下:
Intent intent = new Intent(this, Test.class);
startActivity(intent);
而跨进程访问并不需要Context对象和Activity对象,但是需要指定所访问的Acitivity对应的Action,有些Activity还需要指定一个Uri对象,比如使用程序启动拨号功能如下:
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086");
startActivity(callIntent);
这段代码中Intent.ACTION_CALL 就是"android.intent.action.CALL"字符串,这个常量是一个字符串常量,也是使用Intent跨进程调用Activity的关键,如果在应用程序中要共享某个Activity,需要为这个Activity指定一个字符串ID,也就是Action,也可以将这个Action看做这个Activity的key,在其他的应用程序中只要通过这个 Action就可以找到与Action对应的Activity,并通过startActivity方法来启动这个Activity。
Broadcast:广播是一种被动跨进程通讯的方式,当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据,这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通,在应用程序中发送广播比较简单,只需要调用sendBroadcast方法即可,该方法需要一个Intent对象,通过Intent对象可以发送需要广播的数据。
ContentProvider:Android应用程序可以使用文件或SqlLite数据库来存储数据。ContentProvider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据),应用程序可以利用ContentProvider完成对数据的增删改查,ContentProvider存在主要作用是向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改、查操作。
Android系统本身提供了很多ContentProvider,例如,音频、视频、联系人信息等等。我们可以通过这些ContentProvider获得相关信息的列表,这些列表数据将以Cursor对象返回,对于访问ContentProvider的程序,需要使用ContentResolver对象。该对象需要使用getContentResolver方法获得,代码如下:
ContentResolver cr = getContentResolver();
AIDL(Android Interface Definition Language):是Android接口描述语言,也是进程间通信的方式的一种,可以实现客户端和服务端的进程间通信,AIDL接口使用的是直接调用的函数调用方式进行的,而且服务端并不知道多少客户端数量,也不知道客户端何时连接,所以服务端必须是线程安全的。通过AIDL,可以让本地调用远程服务器的接口就像调用本地接口那么简单,让用户无需关注内部细节,只需要实现自己的业务逻辑接口,内部复杂的参数序列化发送、接收、客户端调用服务端的逻辑,你都不需要去关心了。
参考网址:
http://dengzhangtao.iteye.com/blog/1311703
http://blog.youkuaiyun.com/singwhatiwanna/article/details/17041691