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.pswp.cn/diannao/83119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83119.shtml
英文地址,請注明出處:http://en.pswp.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 系統…