一、基于消息的通信机制 Intent ---boudle ,extra
Android为了屏蔽进程的概念,利用不同的组件[Activity、Service]来表示进程之间的通信!
组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Service,不论这个Activity或Service是属于当前应用还是其它应用的!
                                                                 
Intent包含两部分:
1、目的[action]--要往哪里去
2、内容[category、data]--路上带了些啥,区分性数据或内容性数据

Intent类型:
1、显式--直接指定消息目的地,只适合同一进程内的不同组件之间通信
new Intent(this,Target.class)
2、隐式--AndroidMainifest.xml中注册,一般用于跨进程通信
new Intent(String action)

实现-Intent简单进程间通信
显式的Intent较为简单!

如何实现隐式Intent呢?
在AndroidManifest.xml文件中定义<activity>
说明:
1、一个<activity>包括:
零个或多个<intent-filter>

它主要是作为匹配的标准,能否匹配成功由<action>、<category>、<data>三个tag共同决定的。

2、一个<intent-filter>包括:
一个或多个 <action>
零个或多个 <category> 
指定<activity>的分类特征
eg:
<category android:name="android.intent.category.LAUNCHER" />
--说明该<activity>是该project运行的第一个界面

<category android:name="android.intent.category.HOME" />
--说明该<activity>可以作为Launcher的,即系统操作界面

<category android:name="android.intent.category.DEFAULT" />
--缺省情况

零个或一个 <data> 
-- 指定携带的数据的类型,使用MIME类型描述方式来描述
eg:
<data android:mimeType="video/mpeg" />
video/mpeg表示编码格式为mpeg的视频,
也可以使用通配符video/*表示任意格式的视频文件类型;

在查询ContentProvider时,可以使用
<data android:mimeType="vnd.android.cursor.dir/vnd.myq.note" />
查询上来的数据是多个记录
<data android:mimeType="vnd.android.cursor.item/vnd.myq.note" />
查询上来的数据是单个记录
如上设置,要重写SQLiteOpenHelper的getType(Uri uri)方法
eg:
@Override
public String getType(Uri uri) {
  final int match = sUriMatcher.match(uri) ;
  switch(match)
  {
  case NOTES :
  case LIVE_FOLDER_NOTES:
   return "vnd.android.cursor.dir/vnd.myq.note" ;
   
  case NOTES_ID :
   return "vnd.android.cursor.item/vnd.myq.note" ;
   
  default:
   throw new IllegalArgumentException("invalid uri : " + uri) ;
  }
}

数据的URI由scheme(协议),host,port,path四部分:scheme://host:port/path
<data android:scheme="http://localhost:8080/test.jsp" />

3、一个Intent对应多种匹配结果的处理说明
一个intent有多个可匹配的处理组件,系统如何处理?
分响应消息的组件类型:
1)如果是service那么这些service都可以启动并处理消息。
2)如果是Activity则会弹出一个对话框让用户进行选择。

4、安全性问题
如果不同进程间的组件可以通过隐式消息互相通信,那程序不是可以轻易调用到其他的程序或者系统中的一些敏感程序的组件,这样会不会很不安全呢?
其实Android在安全方面有一个统一,完备和轻便的安全策略模型。

简单一点说就是:权限设置问题
我们可以自己定义permission,然后在需要的组件处设置该permission,那么用户要想该组件,必须要配置该permission,否则访问失败的!

eg:
1、定义permission
<permission-group android:name="android.permission-group.MYQ_INFO"/> 
<permission
     android:name="com.myq.android.permission.DATETIME_SERVICE"
     android:permissionGroup="android.permission-group.MYQ_INFO"
     android:protectionLevel="normal"
     />

2、配置permission
<service android:name=".DateTimeService" android:permission="com.myq.android.permission.DATETIME_SERVICE">
   <intent-filter>
<action android:name="com.myq.android.MultiProcessTest.DATETIMESERVICE_ACTION" />
   </intent-filter>
</service>

3、使用permission
<uses-permission android:name="com.myq.android.permission.DATETIME_SERVICE"/>

二.基于IPC的通信机制
有了Intent这种基于消息的进程内或进程间通信模型,我们就可以通过Intent去开启一个Service,可以通过Intent跳转到另一个Activity,不论上面的Service或Activity是在当前进程还是其它进程内即不论是当前应用还是其它应用的Service或Activity,通过消息机制都可以进行通信!

但是通过消息机制实现的进程间通信,有一个弊端就是,如果我们的Activity与Service之间的交往不是简单的Activity开启Service操作,而是要随时发一些控制请求,那么必须就要保证Activity在Service的运行过程中随时可以连接到Service。

eg:音乐播放程序
后台的播放服务往往独立运行,以方便在使用其他程序界面时也能听到音乐。同时这个后台播放服务也会定义一个控制接口,比如播放,暂停,快进等方法,任何时候播放程序的界面都可以连接到播放服务,然后通过这组控制接口方法对其控制。

如上的需求仅仅通过Intent去开启Service就无法满足了!从而Android的显得稍微笨重的IPC机制就出现了,然而它的出现只适用于Activity与Service之间的通信,类似于远程方法调用,就像是C/S模式的访问,通过定义AIDL接口文件来定义一个IPC接口,Server端实现IPC接口,Client端调用IPC接口的本地代理。

由于IPC调用是同步的,如果一个IPC服务需要超过几毫秒的时间才能完成的话,你应该避免在Activity的主线程中调用,否则IPC调用会挂起应用程序导致界面失去响应。在 这种情况下,应该考虑单起一个线程来处理IPC访问。

两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。

IPC机制鼓励我们“尽量利用已有功能,利用IPC和包含已有功能的程序协作完成一个完整的项目”

IPC实现demo:
我的
project -- MultiProcessTest
package -- com.myq.android.MultiProcessTest

1、AIDL文件,我是放在package下,
文件名称为:
IDateTimeService.aidl
文件内容为:
package com.myq.android.MultiProcessTest ;
interface IDateTimeService 
{
String getCurrentDateTime(in String format) ;
}

如果正确配置,会在gen下,生成同名的java文件
简单摘要:
//我们需要实现的类Stub
public interface IDateTimeService extends android.os.IInterface
{
...
public static abstract class Stub
extends android.os.Binder
implements com.myq.android.MultiProcessTest.IDateTimeService
{
...
//获取实例的方法asInterface
public static com.myq.android.MultiProcessTest.IDateTimeService asInterface(android.os.IBinder obj)
{
  ...
}
...
}
//我们自己的业务方法,需要实现的
public java.lang.String getCurrentDateTime(java.lang.String format) throws android.os.RemoteException;
}

2、Service中实现IDateTimeService.Stub
eg:
package com.myq.android.MultiProcessTest;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class DateTimeService extends Service {

public static final String DATETIME_SERVICE_ACTION = "com.myq.android.MultiProcessTest.DATETIMESERVICE_ACTION" ;

private static final String TAG = "--------DateTimeService-------" ;

private  SimpleDateFormat sdf ;

private final IDateTimeService.Stub stub = new IDateTimeService.Stub()
{
  
  public String getCurrentDateTime(String format) throws RemoteException {
   return getCurrentDateTimeString(format) ;
  }
} ;

private synchronized String getCurrentDateTimeString(String format)
{
     sdf = new SimpleDateFormat(format) ;
     final String temp = sdf.format(new Date()) ;
   Log.i(TAG,"getCurrentDateTimeString--" + Thread.currentThread() + "--" + temp) ;
   return temp ;
}

public IBinder onBind(Intent arg0) 
{
  Log.i(TAG, "onBind--" + Thread.currentThread()) ;
  return stub;
}
}

3、Client端代码实现
private ServiceConnection mServiceConn = new ServiceConnection()
{
  
  public void onServiceConnected(ComponentName name, IBinder service) {
   mDateTimeService = IDateTimeService.Stub.asInterface(service) ;
  }
  
  public void onServiceDisconnected(ComponentName name) {
   mDateTimeService = null ;
  }
} ;

说明:
网上的好多资料都没有涉及IPC调用的AIDL的具体说明!
它本质上是Server端和Client端都具有相同的AIDL文件,要位于相同的包下,即package的包名药一样,然后才能正确的通过proxy访问,否则client与server的aidl文件处于不同package会出错的。

aidl模型如下:
                |<--------------------aidl---------------------->|
client端-->proxy  ----------parcel数据包-------- stub<---server端
从而proxy+parcel+stub构成了aidl.
只不过,proxy运行在客户进程,而stub运行在服务端进程。
当你通过aidl去访问服务端时,客户端会阻塞在proxy,服务端处理完后,通知proxy返回。

四、附件及说明
1、
附件是我测试所用的demo,我用的系统是ubuntu9,Android2.2版本
基本功能:
可以根据用户选择的不同输出格式输出当前系统的时间。
2、
运行顺序:
先运行Server端:MultiProcessTest
再运行Client端:MultiProcessTestClient

3、
注意点:
Server和Client端的AIDL文件必须要位于同package下,否则会出错
安全性问题实现,权限控制--定义、配置、使用
异步处理问题--Handler

android 应用程序Activity之间数据传递与共享的几种途径相关推荐

  1. 解析activity之间数据传递方法的详解

    转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Int ...

  2. 小程序页面之间数据传递的五种方法

    小程序页面之间数据传递的五种方法 目录 小程序页面之间数据传递的五种方法 **使用 `wx.navigateTo()` 时,在 url 中拼接,这种方法适用于数据量少的情况** **使用 `wx.na ...

  3. android数据回传的代码,android Activity之间数据传递 Parcelable和Serializable接口的使用...

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口. 0. ...

  4. 小程序页面之间数据传递的四种方法

    近期再使用小程序开发的时候遇到小程序页面和页面之间的数据传递问题.总结一下大致有以下几种方式实现页面数据传递. 最常见的就是路由传参,使用场景主要是页面汇总的少量数据的传递.以下都以Taro+vue示 ...

  5. 微信小程序页面之间数据传递

    微信小程序跳转界面传递数据,要传递的数据拼接在url 后面实现 下面看一个简单的demo 传递数据 要传递界面 wxml <!--index.wxml--> <view class= ...

  6. # android开发:4-1、Activity启动方式、生命周期、不同activity的数据传递

    4.Activity活动简介 什么是Activity: 如何创建Activity: Activity启动方式: Activity的生命周期: 不同Activity之间数据的传递: 什么是Activit ...

  7. 实现程序间的数据传递

    在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能.例如两个应用程序间的同步.互斥:应用程序在起第二份实例时的参数自动传递-.要实现这些功能,就必须能实现程序间的数据传递. 有些特殊的高级技 ...

  8. 【转载】用Delphi实现程序间的数据传递

    在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能.例如两个应用程序间的同步.互斥:应用程序在起第二份实例时的参数自动传递-.要实现这些功能,就必须能实现程序间的数据传递. 有些特殊的高级技 ...

  9. vue组件之间数据传递和通信方式总结

    vue组件之间数据传递和通信方式总结 方式主要包括: 父组件=>子组件 | 单向数据流,props 子组件=>父组件 | 观察者模式,即vue的自定义事件 $emit 和 $on 非父子组 ...

  10. java实参将数据传递给形参的两种形式

    java实参将数据传递给形参的两种形式 /*** java实参将数据传递给形参的两种形式* 1,按值传递* 2,按引用传递* * 当参数是基本数据类型时,数据不占用堆内存,按值传递* 当参数是引用类型 ...

最新文章

  1. WMI技术介绍和应用——查询硬件信息
  2. 用正则表达式和java解析csv文件
  3. 在VS2010中使用wxWidgets 2.9.3
  4. 哈希表的实现(取余法)
  5. 职称计算机必考和选考,2017职称计算机考试选择题「附答案」
  6. java中一个线程最小优先数_Java线程的优先级
  7. Activate Windows server 2003 in VMware
  8. vb 字符串截取_VB进阶之玩转文件读写
  9. 如何让apache支持php,Apache怎么才能支持PHP程序?
  10. 关于Fragment的setUserVisibleHint() 方法和onCreateView()的执行顺序
  11. Windows10永久关闭自动更新,禁止windows10自动更新方法!
  12. UCINET使用经验分享
  13. html修改progress背景色,html5progress标签如何更改进度条颜色?progress进度条详解
  14. updating mysql.pid_启动mysql ERROR! The server quit without updating PID file
  15. AI智能尺寸测量仪简介(图像尺寸测量仪)
  16. push()与pop()的使用
  17. ABAQUS如何输出应力应变曲线(XY曲线)
  18. html论文参考文献m,论文与排版
  19. 致敬贝叶斯以及自己对贝叶斯的一些见解
  20. 爬虫实现百度贴吧的图片爬取

热门文章

  1. vue 检测ie版本_vue 兼容低版本ie浏览器
  2. 【推荐】数据科学中的非数学特征提取方法
  3. 机器学习相关博客收藏(KL 散度、信息熵、谱聚类、EM、Isolation Kernel、iForest、元学习、小样本学习、课程学习)
  4. 使用Lucifer实现自动化渗透测试任务
  5. Hvv近期0day总结三
  6. rbf java_RBF网络
  7. 四、docker-compose的编程模版
  8. Java异步NIO框架Netty实现高性能高并发
  9. 解决Boost库链接出错问题
  10. ASP.NET的gridview设置数据格式(DataFormatString={})与 String.Format()【转载】