前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android不同应用之间的数据传值

Android不同应用之间的数据传值

作者头像
码客说
发布2024-04-10 09:18:10
1040
发布2024-04-10 09:18:10
举报
文章被收录于专栏:码客码客

前言

不同应用之间的传值可以使用以下几种方式:

  • Intent传值:使用隐式Intent,但需要确保接收方应用可以响应该Intent。
  • Content Provider 通过Content Provider可以在不同的应用之间共享数据。 一个应用可以将数据暴露给其他应用,并提供读写权限,其他应用可以通过ContentResolver访问这些数据。
  • 文件共享:两个应用之间可以通过文件共享的方式传递数据。 一个应用可以将数据写入文件,另一个应用可以读取该文件来获取数据。

怎样选择:

假如A是数据的提供方,B是数据的接收方, 如果B一定是A唤起的并且传值的可以使用Intent传值方式 如果B也能自己打开,还要获取A的值,就使用Content Provider方式。 最后再考虑文件共享的方式。

Intent传值

使用Intent在不同的应用之间传递数据,可以通过Intent的putExtra()方法添加数据,并通过startActivity()或startActivityForResult()方法启动另一个应用。对于跨应用传值,可以使用隐式Intent,但需要确保接收方应用可以响应该Intent。

示例代码:

发送方应用:

代码语言:javascript
复制
Intent intent = new Intent();
intent.setAction("com.example.ACTION_SEND_DATA");
intent.putExtra("key", "value");
startActivity(intent);

接收方应用(在AndroidManifest.xml中声明接收Intent的过滤器):

代码语言:javascript
复制
<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.example.ACTION_SEND_DATA" />
    </intent-filter>
</receiver>

在接收方应用中的BroadcastReceiver中处理传递过来的数据:

代码语言:javascript
复制
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String value = intent.getStringExtra("key");
        // 处理传递过来的数据
    }
}

Content Provider

Content Provider:通过Content Provider可以在不同的应用之间共享数据。

一个应用可以将数据暴露给其他应用,并提供读写权限,其他应用可以通过ContentResolver访问这些数据。

这里使用ContentProvider来作为数据的存储地方。

提供方配置

在数据提供方应用中,定义一个Content Provider并在AndroidManifest.xml中注册:

代码语言:javascript
复制
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Iterator;
import java.util.Objects;

public class ZSpProvider extends ContentProvider {
    private static final String AUTHORITY = "cn.psvmc.myapp.sharedpreferencesprovider";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/spData");

    public static final String PARAM_KEY = "key";

    public static final String PARAM_VALUE = "value";

    private SharedPreferences mStore;

    public static Cursor query(Context context, String... keys) {
        return context.getContentResolver().query(CONTENT_URI, keys, null, null, null);
    }

    public static String getString(Context context, String key) {
        return getString(context, key, null);
    }

    public static String getString(Context context, String key, String defValue) {
        Cursor cursor = query(context, key);
        String ret = defValue;
        if (cursor.moveToNext()) {
            ret = cursor.getString(0);
            if (TextUtils.isEmpty(ret)) {
                ret = defValue;
            }
        }
        cursor.close();
        return ret;
    }

    public static int getInt(Context context, String key, int defValue) {
        Cursor cursor = query(context, key);
        int ret = defValue;
        if (cursor.moveToNext()) {
            try {
                ret = cursor.getInt(0);
            } catch (Exception ignored) {

            }
        }
        cursor.close();
        return ret;
    }

    public static Uri save(Context context, ContentValues values) {
        return context.getContentResolver().insert(CONTENT_URI, values);
    }

    public static Uri save(Context context, String key, String value) {
        ContentValues values = new ContentValues(1);
        values.put(key, value);
        return save(context, values);
    }

    public static Uri save(Context context, String key, int value) {
        ContentValues values = new ContentValues(1);
        values.put(key, value);
        return save(context, values);
    }

    public static Uri remove(Context context, String key) {
        return save(context, key, null);
    }

    private Cursor createSingleCursor(String key, String value) {
        MatrixCursor cursor = new MatrixCursor(new String[]{key}, 1);
        if (!TextUtils.isEmpty(value)) {
            cursor.addRow(new Object[]{value});
        }
        return cursor;
    }

    private Cursor createCursor(String[] keys, String[] values) {
        MatrixCursor cursor = new MatrixCursor(keys, 1);
        cursor.addRow(values);
        return cursor;
    }


    private String getValue(String key, String defValue) {
        return mStore.getString(key, defValue);
    }

    private void save(ContentValues values) {
        String key;
        String value;
        Iterator<String> iterator = values.keySet().iterator();
        SharedPreferences.Editor editor = mStore.edit();
        while (iterator.hasNext()) {
            key = iterator.next();
            value = values.getAsString(key);
            if (!TextUtils.isEmpty(key)) {
                if (value != null) {
                    editor.putString(key, value);
                } else {
                    editor.remove(key);
                }
            }
        }
        editor.apply();
    }

    private void save(String key, String value) {
        SharedPreferences.Editor editor = mStore.edit();
        if (value != null) {
            editor.putString(key, value);
        } else {
            editor.remove(key);
        }
        editor.apply();
    }

    private void remove(String key) {
        SharedPreferences.Editor editor = mStore.edit();
        editor.remove(key);
        editor.apply();
    }

    @Override
    public boolean onCreate() {
        String DB_NAME = "SPData";
        mStore = Objects.requireNonNull(getContext()).getSharedPreferences(DB_NAME, Context.MODE_PRIVATE);
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        int size = projection == null ? 0 : projection.length;
        if (size > 0) {
            String[] values = new String[size];
            for (int i = 0; i < size; i++) {
                values[i] = getValue(projection[i], null);
            }
            return createCursor(projection, values);
        }
        String key = uri.getQueryParameter(PARAM_KEY);
        String value = null;
        if (!TextUtils.isEmpty(key)) {
            value = getValue(key, null);
        }
        return createSingleCursor(key, value);
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return "";
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        if (values != null && values.size() > 0) {
            save(values);
        } else {
            String key = uri.getQueryParameter(PARAM_KEY);
            String value = uri.getQueryParameter(PARAM_VALUE);
            if (!TextUtils.isEmpty(key)) {
                save(key, value);
            }
        }
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        String key = selection != null ? selection : uri.getQueryParameter(PARAM_KEY);
        if (!TextUtils.isEmpty(key)) {
            remove(key);
            return 1;
        }
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        if (values != null && values.size() > 0) {
            save(values);
            return values.size();
        }
        String key = uri.getQueryParameter(PARAM_KEY);
        String value = uri.getQueryParameter(PARAM_VALUE);
        if (!TextUtils.isEmpty(key)) {
            save(key, value);
            return 1;
        }
        return 0;
    }
}

在AndroidMenifest.xml中使用<provider>标签来设置ContentProvider

代码语言:javascript
复制
<provider
    android:exported="true"
    android:name="com.xhkjedu.xh_control_appstore.provider.ZSpProvider"
    android:authorities="cn.psvmc.myapp.sharedpreferencesprovider">
</provider>

注:

android:exported="true"后才能在其他应用中访问。 AUTHORITY配置要和android:authorities保持一致即可,不一定要和项目包名一致。

提供方保存数据

代码语言:javascript
复制
ZSpProvider.save(this, "myblog", "www.psvmc.cn");

获取方配置

获取方同样添加上面的类,不用添加到AndroidMenifest.xml

但是要在AndroidMenifest.xmlapplication同级添加提供方的包名

代码语言:javascript
复制
<queries>
	<package android:name="com.xhkjedu.xh_control_appstore"/>
</queries>

获取数据

代码语言:javascript
复制
val vaue = ZSpProvider.getString(this, "myblog")
Log.i(TAG, "onCreate: $vaue")

文件共享

文件共享:两个应用之间可以通过文件共享的方式传递数据。一个应用可以将数据写入文件,另一个应用可以读取该文件来获取数据。

示例代码:

发送方应用:

代码语言:javascript
复制
String data = "Hello, this is data to be shared";
File file = new File(getExternalFilesDir(null), "shared_data.txt");
try {
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(data.getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

接收方应用:

代码语言:javascript
复制
File file = new File(getExternalFilesDir(null), "shared_data.txt");
try {
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[(int) file.length()];
    fis.read(buffer);
    fis.close();
    String data = new String(buffer);
    // 处理读取到的数据
} catch (IOException e) {
    e.printStackTrace();
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Intent传值
  • Content Provider
    • 提供方配置
      • 获取方配置
      • 文件共享
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档