在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用、某些新闻客户端可以将新闻分享到QQ、微信等应用,这些都是跨进程通信的情况。简而言之,就是一个应用调用了另一个应用,并传递了一定的数据。在Android中有Activity、Content Provider、BroadcastReceiver、Service四大组件,巧的是Android进程间通信也离不开这四大组件(也有说是AIDL机制,但是现在还分不清Service和AIDL的区别(/ □ \) ),组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或者Service。

  对于这四大组件,最常用也是最容易理解的就是Activity了,因为Activity是看得见摸得到的,所以跨进程通信也就先从Activity先讲起来。

  Activity既可以在同一个进程内访问,也可以跨进程访问,是否跨进程访问的主要区别在于Intent是显示Intent还是隐式Intent。

  Intent类型:

  1、显示Intent——直接指定要启动的Activity类,一般用于同一个进程内的不同组件间通信,其格式为new Intent(this,Target.class);

//显示Intent,一般用于启动同一进程中的Activity
Intent intent = new Intent(this,OtherActivity.class);
startActivity(intent);

  2、隐式Intent——一般用于跨进程通信,注册在AndroidManifest.xml文件中,其格式为intent.setAction(String action)。

// 隐式Intent
Intent intent = new Intent();
// 设置Action,启动系统拨号界面,ACTION_CALL其实是字符串常量"android.intent.action.CALL"
intent.setAction(Intent.ACTION_CALL);
startActivity(intent);

  既然知道了Activity间跨进程通信的主要取决于隐式Intent,那么,我们该如何实现隐式Intent呢?答案是正如上面所说,在AndroidManifest.xml文件中注册就行了。下面就又到了直接上代码的环节,代码注释中会穿插一些要注意内容。

  创建一个OtherActivity的Android项目,将布局文件稍稍修改下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <!-- 实际开发中不建议将内容直接写在text内 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是被另一个Activity跨进程召唤的" /> </RelativeLayout>

  接着,修改OtherActivity项目的AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lsj.otheractivity"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <!-- 一个<activity>包括:零个或多个<intent-filter> -->
<!-- 它主要是作为匹配的标准,能否匹配成功由<action>、<category>、<data>三个tag共同决定的。 -->
<activity
android:name="com.lsj.otheractivity.MainActivity"
android:label="@string/app_name" > <!-- 一个<intent-filter>包括:一个或多个<action> 零个或多个<category> 零个或一个<data> -->
<intent-filter> <!-- <action>是实现隐式Intent启动另一进程中的Activity的关键 -->
<!-- 想要启动这个这个Activity,只要往setAction中添加此处<action>标签中的字符串常量即可 -->
<action android:name="com.lsj.otherActivity" />
<!-- 如果有自定义action时,记得添加下面这句 ,不然会报错-->
<category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.MAIN" /> <!-- <category>用于指定Activity的分类特征,此处代表此Activity是这个程序的启动界面 -->
<category android:name="android.intent.category.LAUNCHER" /> <!-- <data>标签不会用,暂时忽略 -->
</intent-filter>
</activity>
</application> </manifest>

  接着,在创建一个Activity的Android项目,在其MainActivity中添加如下代码:

// 新建一个Intent对象
Intent intent = new Intent();
// 设置Intent对象的Action,Action为OtherActivity配置文件中注册的action值
intent.setAction("com.lsj.otherActivity");
// 启动Activity
startActivity(intent);

  先安装好OtherActivity,然后安装并运行Activity,你会发现OtherActivity已经被打开了。这就实现了Activity间跨进程通信,对于传递数据,可以用bundle或者intent。putExtras()来实现。

  对于前面讲到的设置action可能会有这么个疑惑,如果一个Intent对应多种匹配结果该怎么处理呢?系统会根据组件的不同而不同对待,如果是service那么这些service都可以启动并处理消息;如果是Activity则会弹出一个对话框让用户进行选择。

参考:android多进程通信

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

Android随笔之——跨进程通信(一) Activity篇的更多相关文章

  1. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...

  2. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

  3. Android使用AIDL跨进程通信

    一.基本类型 1.AIDL是什么 AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definiti ...

  4. Android四种跨进程通信

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  5. android自动化测试解决跨进程通信问题

    大概用这些吧: IPC  Handler    Messager   Bundle  service(binder)   messageconnection ,thead.getXXX.getId 注 ...

  6. Android跨进程通信访问其他应用程序的Activity

    访问其他应用程序的ActivityActivity既可以在进程内(同一个应用程序)访问,也可以跨进程访问.如果想在同一个应用程序中访问Activity,需要指定Context对象和Activity的C ...

  7. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  8. android 远程Service以及AIDL的跨进程通信

    在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...

  9. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

随机推荐

  1. laravel 生成验证码的方法

    在Laravel中有很多图片验证码的库可以使用,本篇介绍其中之一:gregwar/captcha,这个库比较简单,在Laravel中比较常用.下面我们就来介绍下使用细节: 首先, composer.j ...

  2. 中间人攻击 -- Cookie 喷发

    0x00 前言 分享个中间人攻击姿势,屡试不爽. 原本是篇老文,不过写的太啰嗦.今天用简明的文字,重新讲一遍. 0x01 原理 传统 cookie 嗅探,只能获得用户主动访问的站点.不访问就抓不到,效 ...

  3. .NET面试题系列[15] - LINQ:性能

    .NET面试题系列目录 当你使用LINQ to SQL时,请使用工具(比如LINQPad)查看系统生成的SQL语句,这会帮你发现问题可能发生在何处. 提升性能的小技巧 避免遍历整个序列 当我们仅需要一 ...

  4. Android 两个activity生命周期的关系

    Acitivity的生命周期想必大家都清楚,但是两个activity之间其实不是独立各自进行的. 从第一个activity1启动另外一个activity2时,会先调用本activity1的onPaus ...

  5. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

  6. HTML、CSS、JS对unicode字符的不同处理

    unicode字符的不同表示法 unicode字符在html.css和js中的表示方法均不相同,下面分别作介绍. 原文发表于这里 css表示法 首先来一段很常见的bootstrap的字体图标代码: . ...

  7. 纸上谈兵: 图 (graph)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...

  8. java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

    java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 严重: Exceptio ...

  9. Step by step SQL Server 2012的安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4006744.html 转载请注明出处 计算机要先设置固定ip,加入域,然后安装账号需要有本地管理员的权限. 演示环境的操作系 ...

  10. C语言 · 回文数

    问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数.   方案一: int main(){ int ...