Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户
(Android 系统是基于Linux)的.
所以不同APK(用户)间互相访问数据默认是禁止的.
但是它也提供了2种APK间共享数据的形式:
1. Share Preference. / Content Provider
APK可以指定接口和数据给任何其他APK读取. 需要自己实现接口和Share的数据.
本文对于这个不做详细解释
2. Shared User id
通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是
可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的
数据库和文件.就像访问本程序的数据一样.
比如某个公司开发了多个Android 程序, 那么可以把数据,图片等资源集中放到APK A中去. 然后
这个公司的所有APK都使用同一个User ID, 那么所有的资源都可以从APK A中读取.
举个例子:
APK A 和APK B 都是C公司的产品,那么如果用户从APK A中登陆成功.那么打开APK B的时候就不用
再次登陆. 具体实现就是 A和B设置成同一个User ID:
* 在2个APK的AndroidManifest.xml 配置User ID:
package="com.android.demo.a1"
android:sharedUserId="com.c">
这个"com.c" 就是user id, 然后packagename APK A就是上面的内容, APK B可能
是"com.android.demo.b1" 这个没有限制
这个设定好之后, APK B就可以像打开本地数据库那样 打开APK A中的数据库了.
APK A把登陆信息存放在A的数据目录下面. APK B每次启动的时候读取APK A下面的数据库
判断是否已经登陆:
APK B中的代码:
Context friendContext = this.createPackageContext(
"com.android.demo.a1",
Context.CONTEXT_IGNORE_SECURITY);
通过A的package name 就可以得到A的 packagecontext
通过这个context就可以直接打开数据库.
例程:DealFile.apk
android:sharedUserId="com.my.test.file"
public class DealFile extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WriteSettings(this, "123");
ReadSettings(this);
}
public String ReadSettings(Context context) {
FileInputStream fIn = null;
InputStreamReader isr = null;
char[] inputBuffer = new char[255];
String data = null;
try {
fIn = openFileInput("settings.dat");
isr = new InputStreamReader(fIn);
isr.read(inputBuffer);
data = new String(inputBuffer);
Toast.makeText(context, "Settings read", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "Settings not read", Toast.LENGTH_SHORT).show();
} finally {
try {
isr.close();
fIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
public void WriteSettings(Context context, String data) {
FileOutputStream fOut = null;
OutputStreamWriter osw = null;
try {
fOut = openFileOutput("settings.dat", MODE_PRIVATE);
osw = new OutputStreamWriter(fOut);
osw.write(data);
osw.flush();
Toast.makeText(context, "Settings saved", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "Settings not saved", Toast.LENGTH_SHORT).show();
} finally {
try {
osw.close();
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
例程2
DealFile2,apk
android:sharedUserId="com.my.test.file">
public class DealFile2 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
Context ctxDealFile = this.createPackageContext(
"com.test.dealfile",
Context.CONTEXT_IGNORE_SECURITY);
String msg = ReadSettings(ctxDealFile);
Toast.makeText(this, "DealFile2 Settings read"+msg, Toast.LENGTH_SHORT).show();
WriteSettings(ctxDealFile, "deal file2 write");
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String ReadSettings(Context context) {
FileInputStream fIn = null;
InputStreamReader isr = null;
char[] inputBuffer = new char[255];
String data = null;
try {
fIn = context.openFileInput("settings.dat");
isr = new InputStreamReader(fIn);
isr.read(inputBuffer);
data = new String(inputBuffer);
Toast.makeText(context, "Settings read", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "Settings not read", Toast.LENGTH_SHORT).show();
} finally {
try {
isr.close();
fIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
public void WriteSettings(Context context, String data) {
FileOutputStream fOut = null;
OutputStreamWriter osw = null;
try {
fOut = context.openFileOutput("settings.dat", MODE_PRIVATE);
osw = new OutputStreamWriter(fOut);
osw.write(data);
osw.flush();
Toast.makeText(context, "Settings saved", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "Settings not saved", Toast.LENGTH_SHORT).show();
} finally {
try {
osw.close();
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这样DealFile2,apk
就可以读写DealFile.apk中的文件了
分享到:
相关推荐
但Android 7.0引入了一种名为"File Provider"的组件,它是一种安全的方式来分享私有文件,包括APK文件。因此,自动安装APK的过程需要进行一些调整: 1. **使用FileProvider**:首先,你需要在`AndroidManifest.xml`...
`FileProvider`是Content Provider的一个子类,它提供了一种方式来安全地共享私有文件,避免了直接暴露文件路径可能导致的安全问题。通过`FileProvider`,其他应用可以获取到一个特殊的URI,这个URI指向需要访问的...
内部存储通常用于存储私有数据,外部存储用于共享数据。例如,如果你想将文件复制到内部存储,可以使用`getFilesDir()`方法获取路径;若要复制到外部存储(SD卡),则用`getExternalFilesDir()`。确保在...
对于Android10及更高版本,由于存储权限的改变,我们不能直接将APK保存到公共外部存储目录,而应使用`getExternalFilesDir()`或`getExternalCacheDir()`等方法获取应用私有的外部存储目录。下载的APK应保存在这些...
Android APK的性能测试是复杂而细致的工作,涉及到多个层面。`procrank`等工具的使用可以帮助开发者更好地理解应用在运行过程中的资源占用情况,从而进行针对性的优化。通过结合多种工具和策略,开发者能够打造出...
`FileProvider`是一个特殊的ContentProvider,用于共享私有文件。以下是适配高版本系统的代码示例: ```java File apk = new File(...); // 指向APK文件的路径 Intent intent = new Intent(Intent.ACTION_VIEW); ...
3. **使用FileProvider:** 对于简单的文件共享,Android提供了内置的`FileProvider`类,它是ContentProvider的一个子类,专门用于处理文件共享。只需在AndroidManifest.xml中声明FileProvider,并在需要的地方使用`...
在Android系统中,`sharedUserId`是一个特殊的属性,它允许两个或多个应用共享同一用户ID。这在某些情况下非常有用,比如当您需要构建一系列相互协作的应用,它们需要访问彼此的数据或者服务时。通过设置相同的`...
本文将深入探讨如何在Android Studio中依赖远程的Gradle文件,以便于项目管理和版本控制。 首先,理解Gradle在Android开发中的作用至关重要。Gradle是一个自动化构建工具,支持多种编程语言,包括Java、Kotlin和...
"android文件管理软件源代码"提供了一个实际的案例,可以帮助学习者深入理解如何在Android环境中实现对文件和应用APK的备份与删除功能。下面将详细解释这些知识点。 首先,Android中的文件管理主要涉及以下几个方面...
在Android系统中,数据共享是应用程序之间相互交互的重要方式之一,尤其在需要多个应用协同工作时。本主题聚焦于在Android 2.3(API级别9)及以下版本中,如何利用SharedPreferences进行跨应用的数据共享。...
在Android 8.0及更高版本中,为了安装APK,你需要创建一个`FileProvider`,因为默认的文件访问方式已经受到限制。`FileProvider`是一个特殊的ContentProvider,可以安全地分享私有文件。在AndroidManifest.xml中配置...
综上所述,"Android 文件管理器.zip"可能包含一个定制的Android文件管理应用,或者是一份详细的教学文档,涵盖了Android系统中的文件结构、权限管理、外部存储、数据库管理、媒体文件、网络存储等多个方面的知识。...
内部存储的文件只对该应用可见,而外部存储则可以让多个应用共享。 - **内部存储**:位于`/data/data/<application package>/files/`目录下,文件仅限该应用访问。 - **外部存储**:通常位于SD卡上,可通过`...
总的来说,Android文件I/O涵盖了很多方面,从基础的文件操作到高级的存储策略,都需要开发者根据实际需求灵活运用。理解这些知识点,能帮助我们更好地管理和操作Android设备上的文件,提高应用的稳定性和用户体验。
Android设备有多个存储区域,包括内部存储(Internal Storage)、外部存储(External Storage,也称为SD卡)和外部可读存储(External Readable Storage)。对于不同的文件类型和隐私需求,开发者需要选择合适的存储...
在Android平台上,文件传输是一个常见的任务,涉及到数据的共享、备份和移动。本文将深入探讨Android文件传输的相关知识点,以帮助开发者理解和实现高效、安全的文件操作。 首先,Android系统提供多种方式进行文件...
在Android开发中,`FileProvider`是一个非常重要的组件,它扩展了`ContentProvider`,用于安全地分享应用内的私有文件。本示例基于Android Training课程,旨在教授开发者如何使用`FileProvider`来共享文件。下面我们...
综上所述,Android Content Provider是Android系统中数据共享的核心机制,配合其他组件,可以构建出丰富的多应用协作场景。同时,理解并熟练掌握ProGuard配置,能有效优化和保护你的应用。每个Android项目都有其特定...
3.3 APK文件结构 3.4 Android应用程序权限 3.5 Activity及其生命周期 3.5.1 什么是Activity 3.5.2 Activity生命周期 3.6 Intent简介 3.6.1 Intent属性与过滤器 3.6.2 Intent启动系统Activity 3.7 ...