Android中实现跨app之间数据的暴露与接收

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

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

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

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

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

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

1、Content-Provider翻译


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

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

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

  三、若有需求,可以使用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)}接口

2、AIDL:Android Interface Define Language


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

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

客户端:

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

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


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

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

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

相关文章
相关标签/搜索