最近我接受了一次采访,其中的问题被问为“您如何能够在两个已安装的应用程序或apk之间共享数据?”
我对这个问题没有任何答案。任何人都可以帮我确定一种方法......
答案 0 :(得分:26)
ContentProviders是在应用程序之间共享数据的好方法。
答案 1 :(得分:23)
从应用程序1发送数据(例如:应用程序1程序包名称为“com.sharedpref1”)。
SharedPreferences prefs = getSharedPreferences("demopref",
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("demostring", strShareValue);
editor.commit();
接收应用程序2中的数据(从应用程序1的共享首选项中获取数据)。
try {
con = createPackageContext("com.sharedpref1", 0);//first app package name is "com.sharedpref1"
SharedPreferences pref = con.getSharedPreferences(
"demopref", Context.MODE_PRIVATE);
String your_data = pref.getString("demostring", "No Value");
}
catch (NameNotFoundException e) {
Log.e("Not data shared", e.toString());
}
在两个应用程序清单文件中添加相同的共享用户ID&标签,强>
android:sharedUserId="any string"
android:sharedUserLabel="@string/any_string"
两者都相同......共享用户标签必须来自string.xml
就像这个例子一样。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxxx"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="any string"
android:sharedUserLabel="@string/any_string">
答案 2 :(得分:4)
我怀疑他们可能正在寻找Android特定的方法,例如内容提供商的答案。
其他替代方案...... Android特定 - 远程服务 常规 - TCP / IP连接 一般 - 写入SD卡上的某个位置
关注更多有关特定方法的信息?
今天也在面试这个问题:)
答案 3 :(得分:4)
如果要在应用程序之间共享数据,请确保使用相同的密钥签名:
通过权限进行代码/数据共享 - Android系统提供 基于签名的权限实施,以便应用程序可以 将功能公开给另一个用a签名的应用程序 指定证书。通过签署多个相同的应用程序 证书和使用基于签名的权限检查,您的 应用程序可以安全的方式共享代码和数据。
引自:android developer page about signing
如果是少量数据,您可以通过意图发送它。
答案 4 :(得分:1)
内容提供程序是android组件,如果一个应用程序想要与其他应用程序共享其数据,则必须使用该组件。
注意:应用程序创建的文件,SqliteDatabases,Sharedpreference文件仅对该应用程序是私有的。其他应用程序无法直接访问它。如果程序员使用内容提供程序公开数据库,那么其他应用程序只能访问该数据。与内容提供商通信使用内容解析器。
答案 5 :(得分:0)
我的要求是将一个简单的字符串从一个应用程序发送到另一个应用程序,然后取回一个字符串。像从App1到App2的“用户ID”一样,将“用户名”返回给App1。我能够使用隐式意图和 startActivityForResult 来实现这一目标。如果有人正在寻找完整的流程,我会在How to send data between one application to other application in android?上发布我的答案。
App1> MainActivity.java
//Need to register your intent filter in App2 in manifest file with same action.
intent.setAction("com.example.sender.login"); // <packagename.login>
intent.setType("text/plain");
startActivityForResult(intent, REQUEST_CODE);
onActivityResult(...) {
...
// Handle received data from App2 here
}
我在App2中有两项活动,即。 MainActivity和LoginActivity。
App2> AndroidManifest.xml
<intent-filter>
<!--The action has to be same as App1-->
<action android:name="com.example.sender.login" />
...
</intent-filter>
App2> LoginActivity.java
override fun onResume() {
...
// Handle data from App1 here
}
fun onClickBack(view: View) {
val intent = intent
...
// Set data in bundle here for App1
setResult(Activity.RESULT_OK, intent)
finish()
}