例如一个小项目:实现单词本的添加单词等功能

功能:不同的方式实现跨app之间数据的暴露与接收
  暴露端app:实现单词的添加(Word、Translate),增删改查;
  接收端app:模糊查询,得到暴露端的数据。

暴露端主页及布局:
1、布局:
  主页布局:ListView、TextView(empty)
  item布局:TextView(单词)、TextView(翻译)
  添加或修改单词的Dialog布局:EditText(hint="word")、EditText(hint="translate")

2、菜单:
  选项菜单:添加(单词)
  上下文菜单:删除、修改(ListView上)

3、主页程序:
  初始化MySQLiteOpenHelper(工具类)、初始化控件
  数据库的操作、自定义对话框、设置适配器、创建选项菜单、上下文菜单

  接收端主页及布局:
  1、布局:主页布局:EditText(关键词)、Button(点击查询)、ListView、TextView(empty)
        item布局:TextView(单词)、TextView(翻译)
  2、主页:初始化控件,解析得到的String返回集合,设置适配器

一、Content-Provider

Provider:
  1、自定义Provider继承ContentProvider,重写6个抽象方法
  2、定义静态代码块:目的是定义多个Uri地址。
  3、声明SQLiteDatabase、MySQLiteOpenHelper,生命周期onCreate()中,实例化
  4、重写数据库的增删改查:根据UriMatcher对象的match(uri)方法的返回值进行CRUD
  注意:查询的时候,返回的是Uri对象:
  long id = dbConn.insert("tb_words",null,values);
  Uri uri_id = ContentUris.withAppendedId(uri,id);
  5、清单中注册:节点:<provider>:authorities、name、exported

Resolver:
  1、定义ContentResolver,及uriString:提供者定义的authorities
     resolver=getContentResolver();

  2、查询:resolver.query(Uri.parse(uri)-->>返回Cursor

  3、如有需求,可使用Loader方法:当提供者数据发生改变时及时更新,
    ①、实现LoaderManager.LoaderCallbacks<Cursor>:
    ②、初始化LoaderManager:
        loaderManager = getLoaderManager();
        loaderManager.initLoader(LOADER_ID, null, this);
    ③、实现三个方法:
        onCreateLoader(){return new CursorLoader(6个参数)}、
        onLoadFinished(){adapter.changeCursor(data)}、
        onLoaderReset(){adapter.changeCursor(null)}

二、AIDL:Android Interface Define Language

服务端:
  1、aidl文件夹-->包-->后缀.aidl-->抽象方法,形参为要传递的数据,返回String
  2、自定义服务类,继承Service
    ①、onCreate()中,初始化helper对象
    ②、自定义内部类继承自定义的aidl中的Stub,重写一个自定义的抽象方法,其中执行数据库的查操作,得到集合,

      可适当的处理集合得到String,以便接收者解析
    ③、onBind()中,返回new MyBinder()对象
  3、清单注册,包含<Intent-filter>节点<action>属性:建议包名.类名

客户端:

  1、同服务端第一条,可复制.aidl文件,不建议复制文件夹
  2、主页:声明自定义的.aidl的接口,绑定服务:
    bindService(intent, conn, BIND_AUTO_CREATE)-->返回boolean,绑定成功否
    集齐三个参数intent.setPackage、setAction(包名.类名)、创建conn的时候,重写两个方法,

    建立连接时:实例化myInterface等于Stub.asInterface(iBinder),断开连接赋值为null、第三个参数建议为BIND_AUTO_CREATE
  3、既然myInterface已经实例化,就可以调用里面的方法,处理返回的数据,加载到ListView上
  4、解除绑定

三、Messenger
服务端:
  1、自定义服务类继承Service
  2、初始化信使、数据库操作工具类对象的声明
  3、周期方法onCreate()中:初始化helper对象、信使对象:
    Handler handler = new Handler(){//第5步、第6步}
    messenger = new Messenger(handler);
  4、重写onBind()方法,返回messenger.getBinder()
  5、在Handler{}内,对客户端传过来的信息进行事后处理,将处理的消息返回给客户端:
    执行查操作(查询条件为,msg.getData().getString()+"%")返回集合,定义Message,what值为1,

    携带setData(bundle),Bundle携带String
  6、定义信使对象等于msg.replyTo,信使对象发送message
  7、清单注册:包含<Intent-filter>节点<action>属性:建议包名.类名

客户端:
  1、声明两个信使对象messenger、messenger_reply;
  2、bindMyService绑定服务;
    bindService(intent, conn,BIND_AUTO_CREATE):集齐三个参数:
    intent.setPackage、setAction(包名.类名)、创建conn的时候,重写两个方法,建立连接时:
    实例化messenger = new Messenger(service);,
    断开连接赋值为null、第三个参数建议为BIND_AUTO_CREATE
  3、initMesengerReply初始化返回信使:
    Handler handler = new Handler(){//第5步}、messenger_reply = new Messenger(handler);
  4、客户端向服务端发送请求信息:
    定义Message,msg.setData(bundle),Bundle携带String(查询的关键词)、重点:
    msg.replyTo = messenger_reply、messenger.send(msg)
  5、返回信使对返回信息进行事后处理:msg.what = 1、
  String result = msg.getData().getString("result");
  6、处理得到的result加载到listView控件上

Android中实现跨app之间数据的暴露与接收的更多相关文章

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

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

  2. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  3. Android中使用File文件进行数据存储

    Android中使用File文件进行数据存储 上一篇学到使用SharedPerences进行数据存储,接下来学习一下使用File进行存储 我们有时候可以将数据直接以文件的形式保存在设备中, 例如:文本 ...

  4. 解剖android中的闹钟app 一

    首先,看一看android市场上有哪些主流的闹钟app了,我们来进行一个简单的评测: 一.正点闹钟 这是一款源自金山技术的闹钟app,其主力创始团队都是来自于金山,其装机量,下载量都是排名第一.老样子 ...

  5. Android中使用Gson解析JSON数据

      Android中使用Gson解析JSON数据 在Android中可以使用Gson解析JSON数据 首先,从 code.google.com/p/google-gson/downloads/list ...

  6. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

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

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

  8. iOS中两个APP之间的跳转和通信

    app间的跳转 一:在第一个app首先要做下面这些操作: 1.在info.plist文件中的Information Property List下添加一项:URL types. 2.点开URL type ...

  9. Android中解析JSON形式的数据

    1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...

随机推荐

  1. php 拓展 Filter 过滤器

    简介       Filter,它的作用就和他的名字一样——过滤.过滤规则成为过滤器,Filter内置了多个常用过滤器,根据过滤器功能的不 同,可以分成净化过滤器(Sanitization)和验证过滤 ...

  2. 写个自己的Xcode4插件(二)

    补充上一篇: 一.在XCode5里面,要在info.plist里面再加入以下两个字段: 1. 内容要保持一致喔,别问我为什么,我也不知道,是参考其他许多插件发现的,那些插件都用了这个字段,而且内容一样 ...

  3. iOS的app 中的 埋点

    埋点 就是 挖个坑把 种子埋到土里 然后浇水  等待发芽 埋点就是 ,鬼子要进村,我们埋下地雷 埋点就是 小说中 作者欲扬先抑  或者欲擒故纵  设下的伏笔... 好了,用文学的手法很好的  解释了一 ...

  4. Solr4.8.0源码分析(25)之SolrCloud的Split流程

    Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大 ...

  5. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  6. Find The Multiple(poj 1426)

    Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose ...

  7. IHS怎么通过80端口连接WAS——<转>

    IHS如何通过80端口连接WAS? 经常看到有朋友问这个问题,所以简单总结一下基本步骤:   IHS和WAS之间是通过Plugin来实现的,一般的Plugins和IHS安装在同一物理机器上,WAS安装 ...

  8. OTP语音芯片和掩模语音芯片(mask)的区别

    OTP(One Time Programable)是MCU的一种存储器类型,意思是一次性可编程:程序烧入IC后,将不可再次更改和:因此OTP语音芯片就是指一次性烧录的语音IC. 从OTP定义上来看,只 ...

  9. activiti入门3排他网关,并行网管,包含网关,事件网关(转)

    网关用来控制流程的流向 网关可以消费也可以生成token. 网关显示成菱形图形,内部有有一个小图标. 图标表示网关的类型. 基本分支 首先 利用 流程变量  写个带有分支的一个基本流程 流程图: 部署 ...

  10. ubuntu server配置xmanager

    ubuntu server配置xmanager   ubuntu是典型的多用户多任务操作系统,通过XDMCP方式可以轻松的实现远程的多用户同时登录ubuntu任务.   www.2cto.com   ...