Android中进程间通信(IPC)方式总结

本文详细介绍了Android中实现进程间通信(IPC)的七种方式:使用Bundle、文件共享、Messenger、AIDL、ContentProvider、Broadcast和Socket。通过这些方法,不同进程的应用可以相互通信,交换数据。其中,AIDL适用于处理多线程和多客户端并发访问,而Messenger则适合轻量级的消息传递。
摘要由CSDN通过智能技术生成

      IPC为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程。PC和移动设备上一个进程指的是一个程序或者一个应用,所以我们可以将进程间通信简单理解为不同应用之间的通信,当然这种说法并不严谨。

      Android中,为每一个应用程序都分配了一个独立的虚拟机,或者说每个进程都分配一个独立的虚拟机,不同虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机互相访问数据需要借助其他手段。下面分别介绍一下在Android中进行实现IPC的方式。

 

1.使用Bundle

      我们知道在Android中三大组件(ActivityServiceReceiver)都支持在Intent中传递Bundle数据,由于Bundle实现了Parcelable接口,所以他可以方便的在不同的进程之间进行传输。当我们在一个进程中启动另外一个进程的ActivityServiceReceiver时,我们就可以在Bundle中附加我们所需要传输给远程进程的信息并通过Intent发送出去。这里注意:我们传输的数据必须能够被序列化。

      下面我们看一下利用Bundle进行进程间通信的例子:

        Intent intent = new Intent(MainActivity.this, TwoActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("data", "测试数据");
        intent.putExtras(bundle);
        startActivity(intent);

    利用Bundle进行进程间通信是很容易的,大家应该也注意到,这种方式进行进程间通信只能是单方向的简单数据传输,他的使用时有一定局限性的。

 

2.使用文件共享

    共享文件也是以后总不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据,比如A进程把数据写入文件FILEB进程可以通过读取这个文件来获取这个数据。通过这种方式,除了可以交换简单的文本信息以外,我们还可以序列化一个对象到文件系统中,另一个进程可以通过反序列化恢复这个对象。

比如在A进程中创建一个线程进行写数据:

        new Thread(new Runnable() {
			@Override
			public void run() {
				User user = new User(1, "user", false);
				File cachedFile = new File(CACHE_FILE_PATH);
				ObjectOutputStream objectOutputStream = null;
				try{
					objectOutputStream = new ObjectOutputStream(new FileOutputStream(cachedFile));
					objectOutputStream.writeObject(user);
				}catch(IOException e){
					e.printStackTrace();
				}finally{
					objectOutputStream.close();
				}
			}
		}).start();

      B进程中创建一个线程进行读取数据:

        new Thread(new Runnable() {
			@Override
			public void run() {
				User user = null;
				File cachedFile = new File(CACHE_FILE_PATH);
				if(cachedFile.exists()){
					ObjectInputStream objectInputStream = null;
					try{
						objectInputStream = new ObjectInputStream(new FileInputStream(cachedFile));
						user = objectInputStream.readObject(user);
					}catch(IOException e){
						e.printStackTrace();
					}finally{
						objectInputStream.close();
					}
				}
				
				try{
					objectOutputStream = new ObjectOutputStream(new FileOutputStream(cachedFile));
					objectOutputStream.writeObject(user);
				}catch(IOException e){
					e.printStackTrace();
				}finally{
					objectOutputStream.close();
				}
			}
		}).start();

    通过文件共享的这种方式来共享数据对文件的格式师妹有句提要求的,比如可以是文本文件、也可以是XML文件,只要读写双方约定数据格式即可。这种方式进行进程间通信虽然方便,可是也是有局限性的,比如并发读/写,这会导致比较严重的问题,如读取的数据不完整或者读取的数据不是最新的。因此通过文件共享的方式适合在对数据同步要求不高的进程之间通信,并且要妥善处理并发读/写问题。


3.使用Messenger

    我们也可以通过

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值