进程间通信--IPC

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

前言:

进程间通信(Inter-Process Communication),简称IPC,就是指进程与进程之间进行通信.一般来说,一个app只有一个进程,但是可能会有多个线程,所以我们用得比较多的是多线程通信,比如handler,AsyncTask.

但是在一些特殊的情况下,我们app会需要多个进程,或者是我们在远程服务调用时,就需要跨进程通信了

1.设置多进程

Android设置多进程的步骤很简单,只用在清单文件中为四大组件加上process属性

<service android:name=".MessagerService"
             android:process=":messager">
</service>

( :messager 最终的进程名会变成 包名+:messager)

虽然多进程设置起来很简单,但是使用的时候却会有一系列的问题

(两个进程对应的是不同的内存区域)

  • 1.Application对象会创建多次
  • 2.静态成员不共用
  • 3.同步锁失效
  • 4.单例模式失效
  • 5.数据传递的对象必须可序列化

2.可序列化

进程间通信传递的对象是有严格要求的,除了基本数据类型,其他对象要想可以传递,必须可序列化,Android实现可序列化一般是通过实现Serializable或者是Parcelable

如果你在进程通信中不需要传非基本数据类型的对象,那么你可以不了解序列化,但是可序列化是进程间通信的基础,所以还是建议不了解的朋友先熟悉一下

笔者之前介绍过序列化的相关知识,这里就不重复介绍了

序列化–Serializable与Parcelable

http://blog.csdn.net/yulyu/article/details/56481665

3.通信

跨进程通信的方法有很多,比如通过Intent传递,通过AIDL以及Messager通信,通过socket通信,这里主要介绍的是基于Binder的AIDL和Messager

3.1 Intent

Intent进行数据的传递是我们平时最常用的,他的原理其实是对于Binder的封装,但是他只能做到单向的数据传递,所以并不能很好的实现跨进程通信,我们这里就不展开来介绍了

3.2 Messager

Messager的底层也是基于Binder的,其实应该说他是在AIDL的基础上封装了一层

一般来说安卓中使用Binder主要是通过绑定服务(bindService),服务端(这里指的不是后台,是指其中一个进程)主要是运行Service,客户端通过bindService获取到相关的Binder,Binder就作为桥梁进行跨进程的通信.

这里我们先演示同一个应用内的多进程通信

3.2.1 服务器端

首先我们先创建一个Service,

public class XiayuService extends Service{

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

并在清单文件中配置他的进程

<service android:name=".XiayuService"
             android:process=":xiayu"
 />

在Service里面创建一个Hander用来接受消息

private final static Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        System.out.println("地瓜地瓜,我是土豆,我是土豆, 听到请回答,听到请回答");

    }
};

在Service里面创建一个Messager,并把Handler放入其中

private final static Messenger mMessenger = new Messenger(mHandler);

重写onbind方法,返回Messager里面的Binder

public IBinder onBind(Intent intent) {
    return mMessenger.getBinder();
}

3.2.2 客户端

创建一个对象实现ServiceConnection

private class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //当连接上服务后会调用这个方法
            //TODO 
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
}

绑定服务

Intent    intent = new Intent(MainActivity.this, XiayuService.class);

MyServiceConnection  myServiceConnection = new MyServiceConnection();

bindService(intent, myServiceConnection, BIND_AUTO_CREATE);

绑定服务后,会调用ServiceConnection的onServiceConnected方法,通过Messager发送消息,服务

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值