Android 跨进程通信

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

Intent

可以通过Intent传递数据和消息,但是只能传递一些简单的数据类型,比如字符串、整数等。
示例:

  1. 从一个应用程序发送一个字符串到另一个应用程序,例如:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.app1", "com.example.app2.MainActivity"));
intent.putExtra("key", "value");
startActivity(intent);
  1. 从一个服务发送一个自定义类的对象到另一个服务,例如:
IMyAidlInterface myService = IMyAidlInterface.Stub.asInterface(serviceConnection);
Bundle bundle = new Bundle();
bundle.putParcelable("key", myObject);
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.app1", "com.example.app2.MyService"));
intent.putExtras(bundle);
sendBroadcast(intent);

Binder

是Android系统中的跨进程通信机制,它可以传递任意类型的对象,包括自定义类的对象。
示例:

  1. 在一个服务中创建一个对象,并将其绑定到另一个服务的Binder接口上,例如:
public class MyService extends Service {private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {@Overridepublic String getMessage() throws RemoteException {return "Hello from MyService";}};@Nullable@Overridepublic IBinder onBind(Intent intent) {return mBinder;}
}
  1. 在客户端应用程序中绑定到服务并调用其方法,例如:
IMyAidlInterface myService = IMyAidlInterface.Stub.asInterface(new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MyAidlInterface myAidlInterface = IMyAidlInterface.Stub.asInterface(service);try {String message = myAidlInterface.getMessage();} catch (RemoteException e) {e.printStackTrace();}}
});
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.app1", "com.example.app2"));
bindService(intent, connection, Context.BIND_AUTO_CREATE);

AIDL

是Android系统中的一种接口描述语言,用于定义服务端和客户端之间的接口。
示例同上。

Messenger

是一种轻量级的通信方式,可以在不同的进程之间传递消息。
示例:

  1. 在服务端创建一个Handler对象,并将其封装到一个Binder对象中,例如:
public class MyService extends Service {private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {@Overridepublic String getMessage() throws RemoteException {return "Hello from MyService";}};private final Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {Bundle bundle = msg.getData();String message = bundle.getString("message");Log.d(TAG, "Received message: " + message);}};@Nullable@Overridepublic IBinder onBind(Intent intent) {return mBinder;}
}
  1. 在客户端应用程序中绑定到服务并调用其方法,例如:
IMyAidlInterface myService = IMyAidlInterface.Stub.asInterface(new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MyAidlInterface myAidlInterface = IMyAidlInterface.Stub.asInterface(service);try {Message message = Message.obtain(null, 0, null, myAidlInterface.getMessage());myService.mHandler.sendMessage(message);} catch (RemoteException e) {e.printStackTrace();}}
});
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.app1", "com.example.app2"));
bindService(intent, connection, Context.BIND_AUTO_CREATE);

ContentProvider

是一种特殊的IContentObserver,用于在不同的应用程序之间共享数据。

以下是一个简单的示例:在主进程中创建一个ContentProvider,然后在子进程中通过ContentResolver访问这个ContentProvider来获取数据。

// 在主进程中注册ContentProvider
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();ContentProvider myContentProvider = new MyContentProvider();registerContentProvider(myContentProvider);}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubreturn null;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubreturn null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}
}
// 在子进程中通过ContentResolver访问ContentProvider获取数据
public class MyActivity extends Activity {private static final String AUTHORITY = "com.example.myapp.provider";private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + AUTHORITY);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Cursor cursor = getContentResolver().query(BASE_CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {// TODO: Do something with the data in the cursor.}cursor.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/3181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter之跨线程关联

1)_setproperty函数:将值保存成jmeter属性 2)_property函数:在其他线程组中使用property函数读取属性 一、跨线程接口引用变量 1. 法一:jmeter自带函数_setProperty和_property 1. 1线程组 01 创建登录的【HTTP请求】…

1、k8s问题pod从service中剔除

一、起因 redis原来由两服务器的集群变为三服务器的集群,通过statefulset扩展了两节点,并把redis-app-0和redis-app-3从集群中去除,但是由于service路由后端不变,导致程序连接后端仍然可能到redis-app-0和redis-app-3 二、处理 …

常用的跨平台笔记软件OneNote, GTD

keywords: OneNote, GTD 快捷键 C --> Ctrl S --> Shift M --> Alt Cmd --> Command 调整文本格式 功能WindowsMac OS X高亮选中文本C-S-h 或 C-M-h插入超链接C-kCmd-k复制选中文本的格式(格式刷)C-S-cCmd-M-c应用格式刷到选中文本C-…

分类算法——决策树(五)

认识决策树 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。 决策树分类原理详解 为了更好理解决策树具体怎么分类的,通过一个问题例子: 问题…

C++入门----内联函数auto范围fornullptr指针

1.内联函数 顾名思义,内联函数也是函数的一种,我们在C语言的学习过程里面知道了函数和宏之间的区别和各自的优缺点; 函数的使用需要建立栈帧,宏的使用需要考虑各种符号的优先级问题,很容易出错,因为宏在使…

HarmonyOS开发案例:【闹钟】

介绍 使用后台代理提醒,实现一个简易闹钟。要求完成以下功能: 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表,并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 相关概念 [Canva…

MySQL创建表时添加约束

创建表时添加约束 ①列级约束 演示: CREATE TABLE students( id INT PRIMARY KEY,#主建约束(唯一性,非空) s_name VARCHAR(10) NOT NULL, #非空 s_sex CHAR(1) CHECK(s_sex男 OR s_sex女),#检查约束(Mysql无效) s_seat INT UNI…

数学建模完整版

模型与适用题型 微分方程传染病预测模型 神经网络 层次分析法 粒子群算法 matlab 优劣解距离法

如何为Postgres数据库设置安全的访问控制和权限管理

文章目录 解决方案1. 使用角色和权限管理2. 配置认证方法3. 使用网络访问控制4. 定期审查和更新权限 示例代码1. 创建角色并分配权限2. 配置密码认证3. 配置网络访问控制 总结 PostgreSQL是一个功能强大的开源关系型数据库系统,提供了丰富的权限和访问控制机制&…

前端表单滑块验证码开发

Jsp页面用javascript加 滑动验证条_jsp验证码滑动实现-CSDN博客 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&quo…

云原生技术助力某制造业巨头构建面向未来的统一技术中台

制造帝国的数字化绮梦 在全球经济一体化和信息化快速发展的今天&#xff0c;制造业的数字化转型已经成为推动产业高质量发展的关键趋势。中国政府高度重视制造业的数字化转型&#xff0c;将其视为实现制造强国战略的核心内容&#xff0c;并出台了一系列政策支持推动发展进程。…

LLM大语言模型(十二):关于ChatGLM3-6B不兼容Langchain 的Function Call

背景 基于本地的ChatGLM3-6B直接开发LangChain Function Call应用&#xff0c;发现其输出的action和action_input非常不稳定。 表现为生成的JSON格式回答非常容易出现不规范的情况&#xff0c;导致LangChain的Agent执行报错&#xff0c;或者进入死循环。 ChatGLM3-6B不兼容La…

基于北京迅为iTOP-RK3588大语言模型部署测试

人工智能&#xff08;AI&#xff09;领域中的大模型&#xff08;Large Model&#xff09;逐渐成为研究的热点。大模型&#xff0c;顾名思义&#xff0c;是指拥有海量参数和高度复杂结构的深度学习模型。它的出现&#xff0c;不仅推动了AI技术的突破&#xff0c;更为各行各业带来…

简单仓库管理系统(增删改查功能)

前端 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> …

职场受挫,没有晋升机会怎么办?

和其他人比较没有意义。 每个人的基础不一样&#xff0c;经历不一样&#xff0c;学习方法不一样&#xff0c;无谓的比较只会徒增烦恼。 我们能做的就是&#xff0c;深入了解自己&#xff0c;做自己&#xff0c;找到适合自己的方法&#xff0c;从而快速提升自己。做自己&#…

Pow(x,n)——力扣

python&#xff08;快速幂&#xff09; 50. Pow(x, n) 已解答 中等 相关标签 相关企业 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;10…

若依ruoyi-vue部署在域名的子目录下应该如何配置

本文相关视频教程&#xff1a;https://www.bilibili.com/video/BV1Fi4y1q74p?p46&vd_source2894aa0e46c09ba98269f266128b6c6e 有些特殊情况需要部署到子路径下&#xff0c;例如&#xff1a;https://www.ruoyi.vip/admin&#xff0c;以下是若依ruoyi-vue部署在域名的子目…

【C++】——类和对象(构造函数,析构函数,拷贝构造函数,赋值运算符重载)

创作不易&#xff0c;多多支持&#xff01; 前言 相信你对这几个知识点有点混淆&#xff0c;相信看完以后&#xff0c;你会对此有一个清晰的认识。 一 类的6个默认成员函数 如果我们写一个类&#xff0c;但是类里面什么都没有&#xff0c;我们称之为空类。 其实这个类也不…

Xtrabackup导致主从延时问题

背景问题 公司数据库备份采用Xtrabackup&#xff0c; 备份期间会导致数据库实例产生主从延时&#xff0c;增加数据库告警数量。而且数据库主从延时会影响数据访问的准确性&#xff0c;延时期间如果主库发生故障&#xff0c;会有数据丢失的风险&#xff1b;延时也可能影响抽数等…

DC-DC电源芯片规格书上的各种参数详解

1.输出电压精确度 输出电压的精确度,也被称为设定点精度,它描述了输出电压的允许误差。该参数通常是在常温,满载和额定输入电压的条件下测得的,它是这样定义的: 输出电压之所以产生误差,是因为元器件本身存在误差,特别是输出端的分压电阻,它将输出电压降低后比PWM比较…