android中跨进程通讯的4种方式

转自: http://www.2cto.com/kf/201202/119100.html

由于android中不同的进程使用的内存空间不同,所以如果想要在进程中传递数据直接传递数据地址是不行的,proA中的数据地址在proB中是无效的。

所以在android中目前知道的有四种数据通信方式:

方式一 使用Intent方式进行数据传递

通过Intent来启动访问其他应用程序的Activity,Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的Class对象,而需要指定的是要访问的Activity所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过Intent构造方法的第2个参数指定)。
例如,下面的代码可以直接调用拨打电话的Activity,通过Extra来携带参数。
Intent callIntent = new  Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678" );
callIntent.putExtra("value","xxx"); 
startActivity(callIntent); 

方式二:Content Provider
Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content Provider完成下面的工作
1. 查询数据
2. 修改数据
3. 添加数据
4. 删除数据
虽然Content Provider也可以在同一个应用程序中被访问,但这么做并没有什么意义。Content Provider存在的目的向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改操作。
Android系统本身提供了很多Content Provider,例如,音频、视频、联系人信息等等。我们可以通过这些Content Provider获得相关信息的列表。这些列表数据将以Cursor对象返回。因此,从Content Provider返回的数据是二维表的形式。
对于访问Content Provider的程序,需要使用ContentResolver对象。该对象需要使用getContentResolver方法获得,代码如下:ContentResolver cr = getContentResolver();

\

A:Content Provider URI的固定前缀,也就是说,所有的URI必须以content://开头。
B:URI中最重要的部分。该部分是Content Provider的唯一标识。对于第三方应用程序来说,该部分最后使用完整的类名(包名+类名),以确保URI的唯一性。该部分需要在AndroidManifest.xml文件中<provider>标签中定义,代码如下:
<provider name=".TransportationProvider" authorities="com.example.transportationprovider" ...> 

C:这部分是URI的路径(path)。表示URI中各种被请求的数据。这部分是可选的, 如果Content Provider仅仅提供一种请求的数据,那么这部分可以省略。如果Content Provider要提供多种请求数据。就需要添加多个路径,甚至是子路径。例如,“land/bus”、“land/train”、“sea/ship” 就指定了3种可能提供的数据。
D:这部分也是可选的。如果要传递一个值给Content Provider,可以通过这部分传递。当然,如果不需要传值,这部分也可以省略。

方式三:广播(Broadcast)
      广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。
     在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。
先建一个android工程:sendbroadcast。在XML布局文件中放两个组件:EditText和Button,当单击按钮后,会弹出显示EditText组件中文本的对话框,关闭对话框后, 会使用sendBroadcast方法发送消息,并将EditText组件的文本通过Intent对象发送出去。
Intent intent = new  Intent("net.blogjava.mobile.MYBROADCAST" ); 
intent.putExtra("text" , editText.getText().toString()); 
sendBroadcast(intent); 

当应用程序发送广播时,系统注册改广播监听的应用会调用onReceive方法来接收广播,并通过intent.getAction()方法返回广播的ID,也就是在发送广播时Intent构造方法指定的字符串。然后就可以从Bundle对象中获得相应的数据了。
 

方式四:使用binder方式进行应用间通信

后面详细介绍该内容。


posted on 2015-09-29 20:26  kma  阅读(369)  评论(0编辑  收藏  举报

导航