安卓基础知识-跨进程通信IPC篇

news/2024/9/24 13:25:44/

目录

  • 1. Intent
    • 简介和作用
    • 分类
    • 常见操作
      • 创建intent
      • 设置component目的组件(显式intent)
      • 设置action动作
      • 添加category类别
      • 设置data数据和type类型
      • 设置和读取扩展数据extras
      • 设置flags标志位
      • 常见用法
  • 2. Messenger
  • 3. Binder
    • binder机制介绍
    • binder面试题
    • AIDL
  • 4. ContentProvider
  • 5. Files文件系统
  • 6. Socket
  • 7. 管道
  • 8. 共享内存
  • 9. 消息队列

1. Intent

参考:安卓Intent 详解

简介和作用

intent本意是“目的、意向、意图”。Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
安卓 Intent 是一种在 Android应用程序之间或者应用内部传递信息的机制。它可以用于启动活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver),以及传递数据和操作等。

分类

  • 显式intent:通过在intent中明确设置想要启动组件的类名,来显式地向安卓系统表达本次启动的目的。

  • 隐式intent:在intent中不会显式设置欲启动的组件类名,而是通过设置action、category等信息,安卓系统会自动根据各个组件在AM文件中设置的intent-filter来进行过滤和匹配,匹配成功的组件将会被启动。如果匹配到不止一个组件,将会通过弹窗的方式让用户选择处理该intent的组件。

安卓系统匹配隐式intent的过程:

  1. 加载安装所有的intent-filter的组件
  2. 剔除action匹配失败的组件
  3. 剔除URI数据匹配失败的组件
  4. 剔除category匹配失败的组件
  5. 如果匹配到的组件数量大于1,按照优先级返回最高优先级的组件。

常见操作

创建intent

import android.content.Intent;Intent intent = new Intent(); // 空构造
Intent intent = new Intent(String action); // 隐式intent,传入action
Intent intent = new Intent(String action, Uri uri); // 隐式intent
Intent intent = new Intent(Context packageContext, Class<?> cls); // 显式intent,参数1是当前组件的context,参数2是目标组件的类名
Intent intent = new Intent(String action, Uri uri, Context packageContext, Class<?> cls); // 显式intent

设置component目的组件(显式intent)

Component属性明确指定Intent的目标组件的类名称。(属于显示Intent)
如果component这个属性有指定的话,将直接使用它指定的组件。指定了这个属性以后,Intent的其它所有属性都是可选的。

Intent intent = new Intent();
ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);
intent.setComponent(component);
startActivity(intent);// 简写成
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);

设置action动作

action表示intent欲要完成的动作,在Intent类中,定义了一批量的动作,比如ACTION_VIEW,ACTION_PICK等, 基本涵盖了常用动作。
action也可以是一个用户定义的字符串,用于标识一个用户自定义的 Android 应用程序组件。
一个 Intent Filter 可以包含多个 Action,但是一个intent对象只可以设置一个action。
在 AndroidManifest.xml 的Activity 定义时,可以在其intent-filter节点指定一个Action列表用于标识 Activity所能接受的“动作”。

添加category类别

只有action和category中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应intent。
用户在AM中声明安卓组件时,如果这个组件没有特别的category,则需要显式地将DEFAULT类型的category添加到category列表中,因为当调用startActivity()方法的时候会自动将这个DEFAULT 类型的category添加到Intent中。
自定义类别: 在Intent添加类别可以添加多个类别,那就要求这些类别能同时被匹配上,才算该intent被组件匹配成功。
操作Activity的时候,如果没有类别,须加上默认类别。

<activity android:name=".SecondActivity"><intent-filter><action android:name="com.example.XXXX.MY_ACTION1"/> // action1<action android:name="com.example.XXXX.MY_ACTION2"/> // action2,intent-filter中可以设置多个action<category android:name="com.example.XXXX.MY_CATEGORY" /> // 声明自定义类别<category android:name="android.intent.category.DEFAULT" /> // 需要显式地声明DEFAULT category</intent-filter>            
</activity>
Intent intent = new Intent();
intent.setAction("com.example.XXXX.MY_ACTION1");
intent.addCategory("com.example.XXXX.MY_CATEGORY");
startActivity(intent);// 简写成
Intent intent = new Intent("com.example.XXXX.MY_ACTION1"); // 隐式intent,调用Intent(String action)构造函数。
startActivity(intent);

设置data数据和type类型

Data属性是Android要访问的数据,和action和category声明方式相同,也是在intent-filter中。
多个组件匹配成功显示优先级高的; 相同显示列表。
Data是用一个uri对象来表示的,uri代表数据的地址,属于一种标识符。通常情况下,我们使用action+data属性的组合来描述一个意图:做什么
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如应用程序中需要展示一个网页,没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了。
android:scheme、android:path、android:port、android:mimeType、android:host等,通过这些属性来对应一个典型的Uri格式scheme://host:port/path。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));                
startActivity(intent); 

在自定义的安卓组件中也可以通过声明data来匹配这个intent:

<activity android:name=".SecondActivity"><intent-filter android:priority="-1"> // 设置intent-filter的优先级<action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="http" android:host="www.baidu.com"/>                 </intent-filter>            
</activity>

Type属性用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。
data和type属性一般只需要一个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,如果想要两个属性同时设置,要使用Intent.setDataAndType()方法。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");
intent.setDataAndType(data, "audio/mp3"); // 打开指定路径的指定类型的文件
startActivity(intent);

设置和读取扩展数据extras

通过intent.putExtra(String,XXX)方法以键值对的方式传递数据,其中XXX可代表基本数据类型、数组等。
获取数据通过intent.getXXXExtra(String)方法,其中XXX可代表基本数据类型、数组等。
Intent传递Serializable对象:

intent.putExtra("person",person); //  其中person是实现了Serializable接口的可序列化对象
Person person = (Person) getIntent().getSerializableExtra("person");
···
Intent传递Parcelable对象:

intent.putExtra(“person”,person); // 其中person是实现了Parcelable接口的可序列化对象
Person person = (Person) getIntent().getParcelableExtra(“person”);
···

设置flags标志位

一个程序启动后系统会为这个程序分配一个task供其使用,另外同一个task里面可以拥有不同应用程序的activity。那么,同一个程序能不能拥有多个task?这就涉及到加载activity的启动模式,这个需要单独讲一下。
注:android中一组逻辑上在一起的activity被叫做task,自己认为可以理解成一个activity堆栈。

常见用法

  • 启动活动:使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。
  • 启动服务或者绑定服务:将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给 Context.bindService()来绑定一个service。
  • 给广播接收器发送广播:将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。

2. Messenger

使用方法介绍:Android IPC机制(五):详解Bundle与“信使”——Messenger
底层原理介绍:Android IPC 之Messenger 原理及应用
Android夸进程通信机制三:Messenger与Message

3. Binder

binder机制介绍

夯实基础之超详解Android Binder的工作方式与原理以及aidl示例代码
比较详细的介绍:Android跨进程通信:图文详解 Binder机制 原理
操作系统:图文详解 内存映射
一篇短的介绍:Binder原理解析
很详细的介绍:Android之Binder原理剖析

binder面试题

【干货满满】关于Binder的一些面试问题

AIDL

Android:学习AIDL,这一篇文章就够了(上)
你真的理解AIDL中的in,out,inout么?

4. ContentProvider

5. Files文件系统

6. Socket

7. 管道

8. 共享内存

9. 消息队列


http://www.ppmy.cn/news/1431429.html

相关文章

C语言进阶课程学习记录- 函数与宏分析

C语言进阶课程学习记录- 函数与宏分析 实验-宏和函数实验-宏的副作用实验-宏的妙用小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-宏和函数 #include <stdio.h>#define RESET(p, len) …

数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景

随着科技的飞速发展和环境保护意识的日益增强&#xff0c;制造印刷电路板&#xff08;PCB&#xff09;行业正面临着提升生产效率、降低资源消耗和推动绿色制造的迫切需求。 问题&#xff1a; PCB生产过程对洁净度要求高&#xff0c;传统打印的纸张会有粉尘&#xff0c;纸屑&am…

VMware虚拟机安装CentOS详细教程

前言 最近小白发现&#xff0c;有很多小伙伴在学习过程中都需要配置CentOS的系统&#xff0c;因此决定更新一篇在VMware虚拟机上安装CentOS的教程。 小白最近也去看了一下各种云的服务商出租的服务器&#xff0c;其中可选的系统中也有包括CentOS&#xff0c;所以在VMware配置…

220个常见的金融术语名词解释

标的&#xff08;Underlying&#xff09; 标的代表交易产品或交易工具所基于的单位证券。例如&#xff0c;IBM期权&#xff0c;该期权的标的即为IBM股权。 英文释义&#xff1a; Underlying refers to the security that is the base unit of a product or trading vehicle.…

电脑便签记事本字体如何放大 便签记事本放大字体的方法

在日常工作中&#xff0c;电脑便签记事本已成为我记录琐事、安排日程的得力助手。然而&#xff0c;长时间盯着电脑屏幕&#xff0c;眼睛难免会感到疲劳。尤其是那些密密麻麻的小字&#xff0c;看久了真让人头疼。幸好&#xff0c;我发现了一个简单易行的方法&#xff0c;能轻松…

如何用idm下载迅雷文件 idm怎么安装到浏览器 idm怎么设置中文

如果不是vip用户使用迅雷下载数据文件&#xff0c;其下载速度是很慢的&#xff0c;有的时候还会被限速&#xff0c;所以很多小伙们就开始使用idm下载迅雷文件&#xff0c;idm这款软件最大的优势就是下载速度快&#xff0c;还有就是具备网页捕获功能&#xff0c;能够下载网页上的…

融合麻雀追随机制扰动与柯西变异的蜣螂优化算法,历史位置图,平均适应度收敛图一次性全部搞定,MATLAB代码...

本期文章复现一篇论文&#xff1a;《多策略改进的蜣螂优化算法及其应用》&#xff0c;该成果于2023年12月15日发表于中文核心期刊《计算机科学与探索》&#xff0c;参考文献如下&#xff1a; [1]郭琴,郑巧仙.多策略改进的蜣螂优化算法及其应用[J/OL].计算机科学与探索,1-22[202…

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的&#xff1a;定义一个用于创建对象的接口。实质&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…