Android的跨进程通信

Android AIDL 跨进程通信超详版_aidl跨进程通信代码 【代码】Android AIDL 跨进程通信超详版_aidl跨进程通信代码。 阅读详情


Android的跨进程通信

为什么不能直接跨进程通信?
为了安全考虑,应用之间的内存是无法互相访问的,各自的数据都存在于自身的内存区域内。

如何跨进程通信?
要想跨进程通信,就要找到一个大家都能访问的地方,例如硬盘上的文件,多个进程都可以读写该文件,通过对该文件进行读写约定好的数据,来达到通信的目的。

Android中的跨进程通信采用的是Binder机制,其底层原理是共享内存。
Binder在linux层面属于一个驱动,但是这个驱动不是去驱动一个硬件,而且驱动一小段内存。
不同的应用通过对一块内存区域进行数据的读、写操作来达到通信的目的。
不同的应用在同一内存区域读写数据,为了告知其他应用如何理解写入的数据,就需要一个说明文件,这就是AIDL。当两个应用持有相同的AIDL文件,就能互相理解对方的的意图,就能做出相应的回应,达到通信的目的。

系统服务和应用端的通信机制




Binder对象都有各自的内存区域,当Binder1想要向Binder2发送数据时,就会把数据写入自己的内存区域,然后通知Binder驱动,Binder驱动会把数据拷贝到Binder2的内存区域,然后通知Binder2进行读取,Binder读取完毕后,将把数据写入binder2的内存区域,然后通知Binder驱动,Binder驱动将会把数据拷贝到Binder1的内存区域中。这样就完成了一次通信。

如果Binder1是系统服务,Binder2是系统服务的远程对象,这样任何应用程序在获取了Binder2的引用后,都可以和Binder1进行通信。但是缺点也很明显,只能由应用端请求系统服务,系统服务不能主动去联系应用端。WifiManagerService之类的就是采用这种方式。


还有一种方式是Binder1是系统服务,Binder2是应用端创建的Binder对象,他们两者通过Binder驱动进行连接后,应用端可以主动调系统服务,系统服务也可以主动调用应用端。WindowManagerService就是采用的这种方式。

先复习一下服务的应用绑定

     当Activity需要使用Service中的方法时可以调用bindService()绑定服务,Service会返回一个IBinder对象,

这个对象可以调用Service中的方法.

(当启动服务的Activity退出时可以进行解绑操作)


复习:1)Activity中onResume()---------------所以不能吧这些代码写到onCreate方法中,应该有Activity提供的onResume方法,这个可以实时跟新数据的变化。

           2)Activity中onActivityResult(......)---------

          startActivity(Intent)和startActivityForResult(Intent,int)的区别使用:startActivity(Intent) 方法可以用来启动一个新的 activity ,这个 activity 将被放置在 activity 栈的栈顶。这个方法只有一个参数 Intent ,这个参数描述了将被执行的 activity 。
      有时候你希望在一个 activity 结束时得到它返回的结果。举个例子,你可能启动一个 activity 来让用户从通讯簿中选择一个人;当它结束的时候将会返回这个所选择的人。为了得到这个返回的信息,你可以使用 startSubActivity(Intent, int) 这个方法来启动新的 activity ,第二个整形参数将会作为这次调用的识别标记。这个 activity 返回的结果你可以通过 onActivityResult(int, int, String, Bundle) 方法来获得,此方法的第一个参数就是之前调用所使用的识别标记。


         3)IBinder是什么呢?首先要明白,Android的远程调用(就是跨进程调用)就是通过IBinder实现的.




简单的服务绑定

public class MainActivity extends Activity implements ServiceInterface {
	private Intent intent;
	private ServiceInterface si;
	private ServiceConnection conn = new ServiceConnection() {
		@Override
		public void onServiceDisconnected(ComponentName name) {//意外中断事件
			System.out.println("意外中断事件");
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {// 监听器
			si = (ServiceInterface) service;
			System.out.println("绑定成功");
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		intent = new Intent(this, MySercvice.class);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 绑定服务,得到IBinder(ServiceInterface的实现类)
		bindService(intent, conn, BIND_AUTO_CREATE);
	}

	@Override
	protected void onPause() {
		super.onPause();
		// 解绑服务
		unbindService(conn);
		System.out.println("解绑服务");
	}

	@Override
	public void pay(View view) {
		// 调用服务中pay方法
		si.pay(view);
	}

	@Override
	public void collection(View view) {
		// 调用服务中的collection()方法
		si.collection(view);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		System.out.println("---------------onActivityResult------------------");
	}

public interface ServiceInterface {
	/**
	 * 付款
	 * @param view
	 */
	public void pay(View view);
	/**
	 * 收款
	 * @param view
	 */
	public void collection(View view);
}

public class MySercvice extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		return new MyBinder();//返回一个可以调用pay()和collection()的对象
	}


	class MyBinder extends Binder implements ServiceInterface{

		@Override
		public void pay(View view) {
			System.out.println("支付宝付款");
		}

		@Override
		public void collection(View view) {
			System.out.println("支付宝收款");
		}
		
	}
}


复习使用aidl

创建一个单独的服务程序(单独的进程)

package com.example.remoteserver.invokeinterface;

interface InvokeInterface {
	void pay();	
	void collection();
}

package com.example.remoteserver;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import com.example.remoteserver.invokeinterface.InvokeInterface.Stub;

public class RemoteServer extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("onBind");
		return new MyBinder();
	}

	
	class MyBinder extends Stub {
		@Override
		public void pay() {
			System.out.println("远程支付");
		}

		@Override
		public void collection() {
			System.out.println("远程收款");
		}
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("onCreate    onCreate");
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		System.out.println("onDestroy   onDestroy");
	}
}


RemoteActivity调用其他进程的方法

package com.example.remoteserver.invokeinterface;

interface InvokeInterface {
    void pay();
    void collection();    
}

package com.example.remoteactivity;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;

import com.example.remoteserver.invokeinterface.InvokeInterface;
import com.example.remoteserver.invokeinterface.InvokeInterface.Stub;

public class MainActivity extends Activity {
	private Intent intent;
	private InvokeInterface ik;
	private ServiceConnection conn=new ServiceConnection(){

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {// 绑定成功
//			ik=(InvokeInterface) service;
			ik=Stub.asInterface(service);
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
		
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		intent=new Intent("itheima.service.REMOTE_SERVICE");
	}

	
	@Override
	protected void onResume() {
		super.onResume();
		bindService(intent, conn,Context.BIND_AUTO_CREATE);
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		unbindService(conn);//解绑服务
	}
	
	public void pay(View view){
//		ik.pay();
		try {
			ik.pay();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
	
	public void collection(View view){
		try {
			ik.collection();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

}























Android AIDL跨进程通信指南 本文还有配套的精品资源,点击获取 简介:在Android开发中,跨进程通信(IPC)是实现应用间共享数据和服务的关键技术。AIDL(Android Interface Definition Language)提供了一种机制,允许不同进程通过定义接口进行通信。本篇将引导你通过创建一个AIDL服务来掌握跨进程通信的核心概念和实现步骤。首先介绍AIDL的定义和作用,随后详细说明创... 阅读详情

相关推荐

Android 车载应用开发与优化(1) - CarLauncher 核心功能与动态集成探秘

本文深入探讨了Android车载应用开发中CarLauncher的核心功能与实现原理。作为车载系统的“脸面”,CarLauncher不仅提供应用入口,更通过动态集成技术将地图、音乐等关键信息嵌入桌面,以保障驾驶安全与体验。文章详细解析了其源码结构、权限配置、应用启动机制以及基于Activity嵌入的动态集成黑魔法,为开发者提供了从基础认识到高级优化的完整指南。

weixin_29239279的博客 284

startActivityForResult弃用,使用registerForActivityResult(Kotlin)

startActivityForResult在Android Studio中弃用了,改用registerForActivityResult进行数据传递。

Jzas_YDR的博客 886

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 121

最新android跨进程通信的库,安卓跨进程跨app通信框架

MagicMessenger安卓跨进程跨app通信框架本框架实现了安卓跨进程跨app通信的方便调用和封装使用方法:第一步:在 application 里面初始化MagicMessenger.init(this); //跨进程需要MagicMessenger.bindOtherAPP(this, "包名"); //跨app需要,不跨app可以去掉跨app需要主app初始化跨进程功能,客app初始化跨...

weixin_31445091的博客 2344

光模块MCU开发全解析:从架构原理到固件调试实战

在高速光模块中,MCU并非传统印象里的核心处理器,而是负责数字诊断、闭环控制和协议管理的嵌入式管家。随着800G、1.6T模块的普及,MCU与DSP/SoC的协同、I2C总线通信、ADC采集、APC/TEC控制等低速域任务愈发关键。理解MCU的选型规格、启动流程和固件设计,是保障光模块稳定运行的基础。本文从光模块架构切入,剖析MCU的角色定位,详细拆解I2C从机实现、电芯片配置、校准与升级等工程细节,并结合实际调试经验梳理常见故障与排查思路,为嵌入式工程师提供一份可落地的光模块MCU开发指南。

weixin_29192365的博客 366

Drools vs URule:5个真实项目场景告诉你如何选择开源规则引擎

本文通过电商风控、物流计费、会员体系、保险定价和物联网告警五个真实项目场景,深度对比了Drools与URule两款开源规则引擎。分析了两者在规则复杂度、性能表现、开发运维及适用场景上的核心差异,为技术选型提供基于实战的决策指南。

k6l7m8n9的博客 945

安卓进阶——跨进程通信

本文介绍了Android平台四种主要的跨进程通信方式: AIDL:通过定义接口实现Binder通信,支持同步/异步调用和Parcelable数据传输,适用于复杂IPC场景; Socket:基于TCP/IP的通用通信方案,需手动处理线程和JSON序列化,适合网络或非Android环境通信; Binder:Android核心IPC机制,通过内存映射实现高效数据传输,结合AIDL简化开发,系统服务广泛采用; Messenger:基于消息队列的轻量级Binder封装,支持单向/双向通信,简化Handler式开...

Meteors.的博客 1310

Python 实现 傅里叶级数 对 函数拟合 并绘图

好记性不如烂笔头 目录傅里叶级数变换原理代码实现效果图 傅里叶级数变换原理 原理:待续… 傅里叶级数变换公式: 代码实现 本次实现的是符号函数的拟合: 注:若要实现其他函数的拟合,修改程序中 fx 的表达式即可 """ 傅里叶级数""" import sympy as sym import numpy as np import matplotlib.pyplot as plt N = 8 # 拟合的阶数 L = sym.pi # 周期的一半 n, x = sym.symbols('n x')

qq_41676952的博客 1万+

Android跨进程通讯封装,安卓跨进程跨app通信框架

MagicMessenger安卓跨进程跨app通信框架本框架实现了安卓跨进程跨app通信的方便调用和封装使用方法:第一步:在 application 里面初始化MagicMessenger.init(this); //跨进程需要MagicMessenger.bindOtherAPP(this, "包名"); //跨app需要,不跨app可以去掉跨app需要主app初始化跨进程功能,客app初始化跨...

weixin_30618305的博客 608

一文掌握DrissionPage的详细使用

是一个基于 Python 的网页自动化工具,主要用于网页数据的抓取、自动化操作和测试。它结合了 Selenium 和 Requests 的优点,提供了更简洁、高效的 API,适用于各种网页自动化任务。DrissionPage 是一个功能强大且易于使用的网页自动化工具,适用于各种网页自动化任务。希望本文的 DrissionPage 的基本使用方法和一些高级功能能够帮助到你。

数据知道的博客 1万+

Easy系列PLC远程IO模块的安装配置和地址访问(EtherCAT总线)

EtherCAT分布式时钟DC(SOEM源码解析)EtherCAT分布式时钟DC(SOEM源码解析)_soem dc同步-优快云博客文章浏览阅读1.2k次。分布式时钟(DC,Dsitributed Clock)可以使所有 EtherCAT设备使用相同的系统时间,从而控制各设备任务的同步执行。_soem dc同步1200PLC连接分布式IO组态编程应用(ES200SP固件版本不同解决方法)

RXXW_Dor的博客 176

安卓跨进程通信

为什么需要多进程 ①安卓系统给单个应用可以使用的最大内存做了限制,当app想要突破限制时,需要多进程获取更多内存空间。 ②一些特殊模块需要不影响主模块的稳定性、不占用主模块的内存,并且需要与主业务生命周期剥离。 ③app保活,一些app在后台为了不被系统杀掉,可以用多线程方式进行app拉活。 多进程问题 ①Application多次重建 ②静态成员变量和单例模式失效:系统给每个进程分配独立虚拟机,导致单例等会有多个副本 ③线程同步机制失效:因为基于多进程,不同进程的锁对象都不同 ④SharedPrefere

MagicSound的博客 877

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

【Android】浅析 Android 的 IPC 跨进程通信机制

Android进程间通信(IPC)机制 核心点: 多进程实现方式:通过android:process属性声明,含:前缀表示包名前插 多进程问题:静态变量失效、线程同步失效、SharedPreferences可靠性下降、Application重建 序列化方案: Serializable:简单但性能低,需处理serialVersionUID Parcelable:Android专用,性能高,但实现复杂 Binder机制: 核心组件:客户端、服务端、ServiceManager、BinderDriver AIDL

2401_87853595的博客 1137

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android中跨进程通信传递Parcelable对象时出现android.os.BadParcelableException: ClassNotFoundException when unmarsh

Android中跨进程通信的方法用得较多的是MessengerService和AIDL,根据Google开发文档,推荐使用MessengerService,但是利用它传递Parcelable对象时出现android.os.BadParcelableException: ClassNotFoundException when unmarsh,本文分析了出现的原因以及解决方法。

Bettarwang的专栏 7056

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android-跨进程通信之Messenger

熟悉Android的开发人员应该都知道,实现不同进程之间通信的方法有5种: 1.通过Bundle/Intent传递数据; 2.通过aidl; 3.通过Messenger; 4.通过ContentProvider; 5.通过socket。 其中1,2,3,4的本质都是通过binder机制来实现的,5是通过网络套接字。 这里主要介绍下第三种方法,通过Messenger实现进程通信。 一. Messen...

songqinging的博客 488

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android 跨进程通信

Android中常用的跨进程通信方法有以下几种: Intent、Binder、AIDL、Messenger、ContentProvider。

Yimi-依米 的博客 1569

Android中跨进程通信

在上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法、Service和Activity进行通信、Service的销毁方式、Service与Thread的关系、以及如何创建前台Service。以上所提到的这些知识点,基本上涵盖了大部分日常开发工作当中可能使用到的Service技术。不过关于Service其实还有一个更加高端的使用技巧没有介绍,即远程

破晓的博客 956

【Binder】Android 跨进程通信原理解析

在Android开发的过程中,用到跨进程通信的地方非常非常多,我们所使用的Activity、Service等组件都需要和AMS进行跨进程通信,而这种跨进程的通信都是由Binder完成的。 甚至一个看似简单的startActivity操作,就有可能发生 **6** 次的跨进程通信。...

yang553566463的博客 3248

Android跨进程通信AIDL

进程间通过内核提供的机制完成数据交换,称之为进程间通信(IPC,Inter Process Communication)

qq_44054791的博客 693

Android 跨进程通信大总结

文章目录1、Android进程2、修改Android默认进程3、指定activity、Service进程 1、Android进程 android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.zhaoyanjun" minSdkVersion 16 targetSdkVersion 29 vers

赵彦军 6470

Android跨进程通信

在 Android 中,跨进程通信 (IPC, Inter-Process Communication) 方式有多种,主要用于在不同的应用或进程之间传递数据。• 描述:AIDL 是 Android 提供的一种机制,用于定义进程间的接口。• 描述:Binder 是 Android 跨进程通信的底层机制,几乎所有的 IPC 方式(如 AIDL、Messenger)都依赖于它。其底层也是基于 Binder。• 描述:SharedPreferences 可以用于在同一应用的不同进程间共享简单的键值对数据。

qq_34358193的博客 703

Android跨进程通信的四种方式

Android系统中应用程序之间不能共享内存,在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。1、其中Activity可以跨进程调用其他应用程序的Activity 2、Content Provider可以跨进程访问其他应用程序中的数据(以Cur

小北的博客 5855

【Binder】Android跨进程通信:详解 Binder机制

粘合剂,意思为粘合了两个不同的进程。

qq_30885821的博客 1879
上一篇: 数据结构---栈的定义
下一篇: Android菜鸟之listview下拉刷新
linuxMinx
博客等级 码龄15年 195粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值