Android中的跨进程通信 - ContentProvider
发布:2024-03-29 16:03
更新:2024-03-31 09:15
作者:   0xdFFF
浏览:   1790
字数:3250

ContentProvider

顾名思义就是内容提供者,它支持不同的进程间的通信、数据传输。
ContentProvider 是 Android 中的一个组件,用于管理和提供应用程序的数据给其他应用程序。它提供了一种标准化的方式,允许应用程序通过 URI 来访问数据,而不必了解数据的具体存储方式。

工作原理

数据访问接口: ContentProvider 为其他应用程序提供了一种标准化的数据访问接口。其他应用程序可以通过 ContentResolver对象来访问 ContentProvider中的数据,而不必了解数据的存储方式。

URI 标识数据: ContentProvider 使用 URI 来标识和访问数据。每个 ContentProvider 都会定义一个或多个 URI,用于标识不同类型和不同位置的数据。其他应用程序通过这些 URI 来访问 ContentProvider 中的数据。

数据存储: ContentProvider 可以管理各种类型的数据,包括关系型数据库、文件系统、网络数据等。它通常会封装对这些数据的访问和操作,并提供统一的接口给其他应用程序使用。

权限控制: ContentProvider 可以通过权限控制来限制对数据的访问。它可以定义哪些应用程序有权访问数据,并通过 AndroidManifest.xml 文件中的权限声明来进行控制。

多进程支持: ContentProvider 支持多进程访问,可以在不同的应用程序和进程之间共享数据。它可以在不同的进程中运行,并提供线程安全的数据访问接口。

用法

1.引入 provider.class,这里面写入远程调用方法的逻辑,比如CRUD。

  1. package cn.dfx0.hooook.utils;
  2. import android.content.ContentProvider;
  3. import android.content.ContentValues;
  4. import android.database.Cursor;
  5. import android.net.Uri;
  6. import androidx.annotation.NonNull;
  7. import androidx.annotation.Nullable;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. public class MyContentProvider extends ContentProvider {
  11. public static List<ContentValues> data = new ArrayList<>();
  12. // 定义 ContentProvider 的 URI
  13. public static final Uri CONTENT_URI = Uri.parse("content://cn.dfx0.hooook.provider/data");
  14. @Override
  15. public boolean onCreate() {
  16. // 初始化 ContentProvider
  17. return true;
  18. }
  19. @Nullable
  20. @Override
  21. public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
  22. // 实现查询数据的方法
  23. // 这里可以查询数据并返回 Cursor
  24. return null;
  25. }
  26. @Nullable
  27. @Override
  28. public String getType(@NonNull Uri uri) {
  29. // 实现获取 MIME 类型的方法
  30. return null;
  31. }
  32. @Nullable
  33. @Override
  34. public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
  35. data.add(values);
  36. // 实现插入数据的方法
  37. return uri;
  38. }
  39. @Override
  40. public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
  41. // 实现删除数据的方法
  42. return 0;
  43. }
  44. @Override
  45. public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
  46. // 实现更新数据的方法
  47. return 0;
  48. }
  49. }

2.修改xml配置文件

  1. <application ...>
  2. <provider
  3. android:name=".utils.MyContentProvider"
  4. android:authorities="cn.dfx0.hooook.provider"
  5. android:exported="true" />
  6. </application>

3.在另外的进程里面调用上面的方法即可数据共享

  1. // 使用 ContentResolver 插入数据
  2. ContentResolver resolver = context[0].getContentResolver();
  3. resolver.insert("content://cn.dfx0.hooook.provider/data", values);

4.同时 在Xposed模块中获取当前应用的context可以用以下代码实现:

  1. XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
  2. @Override
  3. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  4. super.afterHookedMethod(param);
  5. context[0] = (Context) param.args[0]; //context[0]就是获取的当前窗体
  6. }
  7. });
  8. }

跨进程修改值图例:
图片

-- 完结 --