前言
不同应用之间的传值可以使用以下几种方式:
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。
接收方
接收方应用(在AndroidManifest.xml中声明接收Intent的过滤器):
1 | <receiver android:name=".MyBroadcastReceiver" android:exported="true"> |
在接收方应用中的BroadcastReceiver中处理传递过来的数据:
1 | public class MyBroadcastReceiver extends BroadcastReceiver { |
打开Activity
在 BroadcastReceiver 里启动 Activity 只有一条铁律:
必须给 Intent 加
FLAG_ACTIVITY_NEW_TASK,否则在 Android 10+ 会直接抛android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
示例:
1 | class MyReceiver : BroadcastReceiver() { |
发送方
发送方应用:
1 | Intent intent = new Intent(); |
注意
兼容SDK34
如果发送方 targetSdk ≥ 34 且没有
1 | intent.setPackage("xxx") |
系统会只把广播派给“同一应用” 的 Receiver,别的 App 即使 action 相同也收不到。
想让外部 App 也能收到,需要发送方加
1 | intent.setPackage(null) |
并在接收方 App 的 manifest 里打开
1 | <receiver android:exported="true" …> |
action命名规则
必须是“合法 Java 包名风格”的字符串:
- 只能包含 A-Z a-z 0-9 _ . 这 5 种字符
- 必须以 字母 开头
- 不能出现连续的点 …
- 不能是空串
例:
- ✅
com.example.ACTION_SEND_DATA - ✅
my_action - ❌
com.example.action-send-data(含连字符) - ❌
9action(数字开头)
唯一性规则(运行期匹配)
- 全局范围内必须保证 不跟别人撞名。
- 推荐用 “反域名 + 模块 + 动作” 的写法,就像给广播起个“包名”。
例:cn.myapp.inventory.action.STOCK_CHANGED
Content Provider
Content Provider:通过Content Provider可以在不同的应用之间共享数据。
一个应用可以将数据暴露给其他应用,并提供读写权限,其他应用可以通过ContentResolver访问这些数据。
这里使用ContentProvider来作为数据的存储地方。
注意:
Content Provider 提供数据的时候,如果提供方APP没有启动,获取方也是获取不到数据的。
提供方配置
在数据提供方应用中,定义一个Content Provider并在AndroidManifest.xml中注册:
1 | import android.content.ContentProvider; |
在AndroidMenifest.xml中使用<provider>标签来设置ContentProvider
1 | <provider |
注:
android:exported="true"后才能在其他应用中访问。
AUTHORITY配置要和android:authorities保持一致即可,不一定要和项目包名一致。
提供方保存数据
1 | ZSpProvider.save(this, "myblog", "www.psvmc.cn"); |
获取方配置
获取方同样添加上面的类,不用添加到AndroidMenifest.xml
但是要在AndroidMenifest.xml中application同级添加提供方的包名
1 | <queries> |
其中com.xhkjedu.manageapp是提供方的包名,一定要添加该配置否则获取不到数据。
获取数据
1 | val vaue = ZSpProvider.getString(this, "myblog") |
文件共享
文件共享:两个应用之间可以通过文件共享的方式传递数据。一个应用可以将数据写入文件,另一个应用可以读取该文件来获取数据。
示例代码:
发送方应用:
1 | String data = "Hello, this is data to be shared"; |
接收方应用:
1 | File file = new File(getExternalFilesDir(null), "shared_data.txt"); |