Android开发-在应用之间共享数据

在Android系统中,应用之间的隔离机制(沙箱机制)保障了系统的安全性与稳定性。然而,在实际开发中,我们经常需要实现跨应用的数据共享,例如:

  • 从一个应用向另一个应用传递用户信息;
  • 多个应用之间共享文件或数据库;
  • 第三方应用访问你的应用中的某些内容(如联系人、图片等)。

本文将详细介绍Android中几种常见的跨应用数据共享方式,包括:Intent传值、ContentProvider、SharedPreferences多进程共享、以及使用AIDL进行跨进程通信等内容。

一、使用Intent实现简单数据共享

(一)基本介绍

Intent 是 Android 中最常用的组件间通信方式,也可以用于不同应用之间的数据传递。适用于传递字符串、基本类型、Parcelable 或 Serializable 对象等小量数据。

(二)发送方代码示例

Intent intent = new Intent();
intent.setAction("com.example.ACTION_SEND_DATA");
intent.putExtra("key", "Hello from App A");
startActivity(intent);

(三)接收方配置 AndroidManifest.xml

<activity android:name=".ReceiveDataActivity"><intent-filter><action android:name="com.example.ACTION_SEND_DATA" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

(四)接收方 Activity 获取数据

Intent intent = getIntent();
if (intent != null && "com.example.ACTION_SEND_DATA".equals(intent.getAction())) {String data = intent.getStringExtra("key");Log.d("ReceivedData", data);
}

优点:简单易用,适合轻量级跨应用数据传递。
缺点:仅限于一次性数据传递,不适用于复杂或持续性数据交互。

二、使用 ContentProvider 实现结构化数据共享

(一)什么是 ContentProvider?

ContentProvider 是 Android 四大组件之一,专门用于在不同应用程序之间共享数据。它提供统一的接口来访问结构化数据,如 SQLite 数据库、文件等。

(二)创建 ContentProvider

1. 定义 Contract 类(定义 URI 和列名)
public class MyDataContract {public static final String AUTHORITY = "com.example.mycontentprovider";public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/items");public static final String COLUMN_ID = "_id";public static final String COLUMN_NAME = "name";
}
2. 创建自定义 ContentProvider
public class MyDataProvider extends ContentProvider {private SQLiteDatabase database;@Overridepublic boolean onCreate() {DatabaseHelper dbHelper = new DatabaseHelper(getContext());database = dbHelper.getWritableDatabase();return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {return database.query("my_table", projection, selection, selectionArgs, null, null, sortOrder);}// 实现 insert、delete、update、getType 等方法...
}
3. 在 AndroidManifest.xml 中注册
<providerandroid:name=".MyDataProvider"android:authorities="com.example.mycontentprovider"android:exported="true" />

设置 android:exported="true" 表示允许外部应用访问。

(三)其他应用访问 ContentProvider

Uri uri = Uri.parse("content://com.example.mycontentprovider/items");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));Log.d("SharedData", name);
}

优点

  • 支持结构化数据共享;
  • 可以控制读写权限;
  • 支持监听数据变化。

缺点

  • 配置较为复杂;
  • 不适合传输大量非结构化数据(如图片、视频)。

三、使用 SharedPreferences 共享偏好设置(多进程/跨应用)

(一)通过 MODE_MULTI_PROCESS 共享

如果你的应用中有多个进程,或者希望多个应用共享同一个 SharedPreferences 文件,可以使用 MODE_MULTI_PROCESS 模式。

示例:
SharedPreferences sharedPref = getSharedPreferences("my_prefs", Context.MODE_MULTI_PROCESS);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("user", "JohnDoe");
editor.apply();

⚠️ 注意:该模式在 Android N(API 24)之后已被弃用,但仍可在部分场景下使用。

(二)通过 ContentProvider 包装 SharedPreferences

更推荐的方式是通过封装一个 ContentProvider 来暴露 SharedPreferences 的读写接口,这样可以在保证安全的同时实现跨应用访问。

四、使用 FileProvider 实现文件共享

对于图片、PDF、文本等文件类数据,推荐使用 FileProvider 进行安全地共享。

(一)步骤

  1. 定义 XML 路径配置
<!-- res/xml/file_paths.xml -->
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-path name="my_images" path="Pictures/" />
</paths>
  1. 在 AndroidManifest.xml 中注册 FileProvider
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>
  1. 生成文件 Uri 并传递给其他应用
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "image.jpg");
Uri contentUri = FileProvider.getUriForFile(this, "com.example.fileprovider", file);Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(contentUri, "image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

优点

  • 安全性强,避免直接暴露文件路径;
  • 支持跨应用打开文件(如 PDF、图片等)。

五、使用 AIDL 实现跨进程通信(IPC)

当两个应用之间需要频繁、实时地交换数据时,可以使用 Android Interface Definition Language(AIDL)实现跨进程通信(IPC)。

(一)定义 AIDL 接口

// IRemoteService.aidl
package com.example.aidl;interface IRemoteService {String getData(int id);
}

(二)服务端实现 Service

public class RemoteService extends Service {private final IRemoteService.Stub binder = new IRemoteService.Stub() {@Overridepublic String getData(int id) {return "Data for ID: " + id;}};@Overridepublic IBinder onBind(Intent intent) {return binder;}
}

(三)客户端绑定服务并调用

IBinder service = serviceConnection.asBinder();
IRemoteService remoteService = IRemoteService.Stub.asInterface(service);
String result = remoteService.getData(1);
Log.d("AIDL", result);

优点

  • 支持远程调用;
  • 可实现双向通信;
  • 适用于长期运行的服务交互。

缺点

  • 使用复杂,学习成本较高;
  • 仅适用于需要深度集成的场景。

六、总结

方式适用场景是否安全是否支持结构化数据
Intent简单数据传递
ContentProvider结构化数据共享
SharedPreferences偏好设置共享
FileProvider文件共享
AIDL远程服务调用

七、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

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

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

相关文章

深度解析 JWT:从原理到实战的全场景解决方案(附永久 Token 设计与集成系统实践)

摘要 本文结合 JWT 官方标准&#xff08;RFC 7519&#xff09;与生产级实践&#xff0c;全面解析 JSON Web Token 的核心机制、安全规范及 Java 生态最佳实现。涵盖 JJWT 工具类优化、Auth0/Nimbus 替代方案对比、永久 Token 设计&#xff08;满足集成系统长期调用需求&#x…

[特殊字符]Meilisearch:AI驱动的现代搜索引擎

前言 大家好&#xff0c;我是MAI麦造&#xff01; 上文介绍一了Manticore Search 这款轻量级的搜索引擎&#xff0c;这次又有了新的发现&#xff01;传送门&#xff1a; Elasticsearch太重&#xff1f;它的超轻量的替代品找到了&#xff01; 这是一个让我超级兴奋的AI搜索引…

【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)

前言 之前的文件分享过基于内存的STL缓存、环形缓冲区&#xff0c;以及基于文件的队列缓存mqueue、hash存储、向量库annoy存储&#xff0c;这两种属于比较原始且高效的方式。 那么&#xff0c;有没有高级且高效的方式呢。有的&#xff0c;从数据角度上看&#xff0c;&#xff0…

首个专业AI设计Agent发布-Lovart

Lovart是什么 Lovart 是为设计师打造的世界上首个专业设计 Agent。Lovart 能像专业设计师一样思考和执行设计任务&#xff0c;提供高水平的设计方案。基于自然语言交互&#xff0c;用户能快速调整布局、颜色和构图。Lovart 支持从创意拆解到专业交付的全链路设计&#xff0c;单…

关于Python 实现接口安全防护:限流、熔断降级与认证授权的深度实践

作为一名IT从业者&#xff0c;就自己的职业经历&#xff0c;我一直很注重系统安全的。从桌面时代就对此很感兴趣&#xff0c;后来随着技术的更新迭代&#xff0c;系统安全衍生出来了网络安全。维度更大&#xff0c;范围更广。尤其在数字化浪潮席卷全球的今天&#xff0c;互联网…

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU&#xff1a;简化的生成式 AI UI界面开源程序&#xff0c;一个非常简单的 AI 图像生成器 UI 界面&#xff0c;使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…

南方科技大学Science! 自由基不对称催化新突破 | 乐研试剂

近日&#xff0c;南方科技大学刘心元教授团队联合浙江大学洪鑫教授团队在自由基不对称催化领域取得新进展。课题组开发了一系列大位阻阴离子 N,N,P-配体&#xff0c;用于铜催化未活化外消旋仲烷基碘与亚砜亚胺的不对称胺化反应。该反应表现出广泛的底物兼容性&#xff0c;涵盖具…

Milvus 视角看主流嵌入式模型(Embeddings)

嵌入是一种机器学习概念&#xff0c;用于将数据映射到高维空间&#xff0c;其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络&#xff0c;它能够有效地用一系列数字&#xff08;称为向量&#xff09;来表示文本、图像和其他数据…

【MySQL】牛客网sql语句简单例题,sql入门

目录 一、基础查询 1、查询所有列 2、 查询多列 二、简单处理查询结果 1、查询结果去重 2、查询结果限制返回列数 3、将查询后的列重新命名 三、条件查询之基础排序 1、查找后排序 2、 查找后多列排序 3、查找后降序排列 四、条件查询之基础操作符 1、查找学校是北…

Linux云计算训练营笔记day06(Windows DOS下的常用命令 及 HTML)

windows dos命令行 切换盘符 d: 查看文件夹下的内容 dir 创建文件夹 md/mkdir gongli 进入文件夹 cd gongli 往回退一层 cd .. 清屏 cls 历史命令(用键盘的上下键) 创建一个空的文件 echo.>a.txt 写入内容到文件中 echo hello world > b.txt 删除文件 del a.txt 查…

如何开启或关闭WordPress的自动更新功能

WordPress是一个开源软件&#xff0c;您可以从他们的官方网站免费下载。但是&#xff0c;要启动WordPress站点&#xff0c;您需要安装一个主题&#xff0c;以帮助为您的内容创建特定布局。此外&#xff0c;您可能还需要安装一些插件来添加其他功能。 当您必须管理所有这些东西…

SpringSecurity当中的CSRF防范详解

CSRF防范 什么是CSER 以下是基于 CSRF 攻击过程的 顺序图 及详细解释&#xff0c;结合多个技术文档中的攻击流程&#xff1a; CSRF 攻击顺序图 #mermaid-svg-FqfMBQr8DsGRoY2C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…

给 DBGridEh 增加勾选用的检查框 CheckBox

需求 Delphi 的 DBGrid 通过 DataSource 绑定到一个 DataSet 显示数据表里面的 N 多条记录。如果我想给每条记录加一个 CheckBox 让用户去勾选&#xff0c;该怎么做&#xff1f; 以下描述&#xff0c;使用的 DBGrid 是 DBGrieEh。 Delphi 自带的 DBGrid 要加 CheckBox 比较麻…

WordPress 和 GPL – 您需要了解的一切

如果您使用 WordPress&#xff0c;GPL 对您来说应该很重要&#xff0c;您也应该了解它。查看有关 WordPress 和 GPL 的最全面指南。 您可能听说过 GPL&#xff08;通常被称为 WordPress 的权利法案&#xff09;&#xff0c;但很可能并不完全了解它。这是有道理的–这是一个复杂…

力扣144题:二叉树的前序遍历(递归)

小学生一枚&#xff0c;自学信奥中&#xff0c;没参加培训机构&#xff0c;所以命名不规范、代码不优美是在所难免的&#xff0c;欢迎指正。 标签&#xff1a; 二叉树、前序遍历、递归 语言&#xff1a; C 题目&#xff1a; 给你二叉树的根节点root&#xff0c;返回它节点值…

python:一个代理流量监控的媒体文件下载脚本

前言 一个mitmproxy代理服务应用&#xff0c;作用是监听系统流量&#xff0c;并自动下载可能的video媒体文件到本地。 如果你没有安装mitmproxy或没有做完准备工作&#xff0c;请参考我的这篇文章&#xff1a; python&#xff1a;mitmproxy代理服务搭建-CSDN博客 文件架构目录…

SAP Business One(B1)打开自定义对象报错【Failed to initialize document numbering:】

业务场景&#xff1a; 新版本的客户端&#xff0c;打开已经注册的自定义单据类型的表的时候&#xff0c;报错【Failed to initialize document numbering:】。 但是注册的自定义主数据类型的表&#xff0c;不会有问题。 解决方案&#xff1a; 打开【管理-系统初始化-常规设置…

计算机网络:WiFi路由器发射的电磁波在空气中的状态是什么样的?

WiFi路由器发射的电磁波是高频无线电波,属于微波频段(2.4GHz或5GHz),在空气中以光速传播(约310⁸米/秒),其传播状态和特性可通过以下维度详细解析: 一、电磁波的物理特性 频率与波长 2.4GHz频段:波长约12.5厘米,穿透力较强但易受干扰(微波炉、蓝牙等共用频段)。5GH…

腾讯云-人脸核身+人脸识别教程

一。产品概述 慧眼人脸核身特惠活动 腾讯云慧眼人脸核身是一组对用户身份信息真实性进行验证审核的服务套件&#xff0c;提供人脸核身、身份信息核验、银行卡要素核验和运营商类要素核验等各类实名信息认证能力&#xff0c;以解决行业内大量对用户身份信息真实性核实的需求&a…

tocmat 启动怎么设置 jvm和gc

在生产环境中部署 Java Web 应用时&#xff0c;我们经常需要给 Tomcat 设置 JVM 参数和 GC 策略&#xff0c;以提高性能、稳定性和可观察性。以下是完整教程&#xff1a; 一、Tomcat 设置 JVM 启动参数的方式 1. 修改 startup 脚本&#xff08;推荐&#xff09; 以 Linux 系统…