博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发中的跨进程通信方式总结
阅读量:3923 次
发布时间:2019-05-23

本文共 4159 字,大约阅读时间需要 13 分钟。

Android开发中的跨进程通信方式

总的来说的Android跨进程通信的方式常用的有以下几种

  1. Activity可以跨进程调用其他应用程序
  2. Content Provider可以跨进程访问其他应用程序中的数据
  3. Broadcast可以向android系统中所有应用程序发送广播
  4. Service通信,这种可以跨进程通讯的服务叫AIDL服务

1.Activity通信方式

activity通信可以是当前应用程序的中的两个Activity进行数据交换,也可以跨进程,去和其他应用程序中的Activity进行通信。也是最常用的通信方式之一。下面描述的是App间通信的大致流程。

通信流程大致如下:

代码如下:

Activity_A中启动方法Activity_B

/**     * Activity_A开始通信     */    public void startActivity_B() {
Intent intent = new Intent(); int requestCode = 1; //设置启动的包名+类名(全路径) intent.setClassName("com.appb.activity","com.appb.activity.Activity_B"); //设定将要传输的数据 intent.putExtra("requestKey", "testData"); super.startActivityForResult(intent, requestCode); }

Activity_BIntent中数据的获取

@Override    protected void onCreate(final Bundle savedInstanceState) {
Intent intent = getIntent(); //数据取得 mRequestData = intent.getStringExtra("requestKey"); }

Activity_B中向Activity_B返回数据

public void closeActivity_B() {
Intent data= new Intent(); //返回数据定义 data.putExtra("responseKey", "responseData"); //返回数据设置 setResult(Activity.RESULT_OK, data); //关闭当前Activity,返回启动Acivity super.finish(); }

Activity_A中接收Intent 中返回的数据

@Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1 && resultCode == Activity.RESULT_OK){
//接收返回的数据 String responseData = data.getStringExtra("responseKey"); } else {
//TODO. } }

2. Content Provider 通信

//TODO

3. Broadcast 通信

//TODO

4.Service通信方式

service通信其实就是安卓独有的AIDL服务,AIDLAndroid Interface definition language),接口描述语言(语法和java类似),android特有的一种IPC机制。

关联类图:在这里插入图片描述

Binder的流程图:
在这里插入图片描述

具体实现步骤

  • 在客户端和服务端定义相同的aidl接口文件

aidi文件 TestAppService .aidl

interface TestAppService {
int checkService(int requestId, TestAppServiceCallbacks callback);}

aidi文件 TestAppServiceCallbacks .aidl

用于通信的回调

interface TestAppServiceCallbacks {
void onCompleteCheckService(int requestId, int result);}
  • 服务端代码实现

需要实现aidl编译后生成的 TestAppService.Stub 接口

public class TestAppServiceBinder extends TestAppService.Stub {
@Override public int checkService(int requestId, TestAppServiceCallbacks callback){
//TODO 其他逻辑处理 int result = 0; callback.onCompleteCheckService( requestId, result ); return 0; }}

同时需要定义提供给外部App绑定的Service

public TestAppAidlService extends Service {
private TestAppServiceBinder mBinder = null; @Override public void onCreate() {
super.onCreate(); mBinder = new TestAppServiceBinder(this); } @Nullable @Override public IBinder onBind(Intent intent) {
return mBinder; }}
  • 客户端代码实现

客户端定义连接对象

//客户端用来请求的service    private  TestAppService  testAppService;    //service的连接对象    private ServiceConnection serviceConnection = new  ServiceConnection () {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
// 我们这里拿到的对象其实就是其Stub的内部类Proxy对象 testAppService = TestAppService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) {
//TODO service断开连接 } }

客户端定义绑定服务

private boolean bindAppService() {
Intent intent = new Intent(); intent.setClassName("com.app.service", "com.app.service.TestAppService"); try {
if (getApplicationContext().bindService(intent, serviceConnection , Context.BIND_AUTO_CREATE)) {
return true; } } catch (SecurityException ex) {
//TODO } return false; }

客户端开始调用Service

@Override    protected void onResume() {
//绑定service成功 if (bindAppService()){
int result = testAppService.checkService(); } else {
//TODO 绑定失败 } }

客户端Service回调处理

private TestAppServiceCallbacks.Stub  testAppServiceCallbacks =      new TestAppServiceCallbacks.Stub(){
@Override void onCompleteCheckService (int requestId, int result ){
//TODO 回调处理,接收服务端返回的数据 } }

https://github.com/cteamx/Thief-Book

转载地址:http://qqugn.baihongyu.com/

你可能感兴趣的文章
程序员必看的书
查看>>
struts2 的struts.properties(xml)配置详解
查看>>
ssh hibernate和spring 的注解介绍
查看>>
SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存以及将数据放在application
查看>>
如何使用struts2拦截器 详解
查看>>
hibernate + spring.xml 实体类映射几种方法的介绍
查看>>
SSH注解配置中的几种注解模式
查看>>
Log4J日志管理类使用详解
查看>>
get请求乱码问题
查看>>
jsp frameset 全局刷新和局部刷新
查看>>
MD5 加密和解密 (参考资料写的)
查看>>
DES 加密解密
查看>>
ssh上传下载 自己整理的。
查看>>
使用RunWith注解改变JUnit的默认执行类,并实Listener在平时的单元测试
查看>>
JQuery 判断文件类型
查看>>
Hibernate4.0 注解 @ManyToMany @JoinTable @OrderBy
查看>>
注释驱动的 Spring cache 缓存介绍
查看>>
hibernate组函数HQL
查看>>
Json解析工具Jackson(使用注解)
查看>>
Easyui datagrid detailview使用简介
查看>>