【android】Android(安卓)多个APK共享数据(Shared User ID)
16lz
2021-01-24
转自:http://mobile.51cto.com/aprogram-387596.htm
android会为每个apk进程分配一个单独的空间(比如只能访问/data/data/自己包名下面的文件),一般情况下apk之间是禁止相互访问数据的。通 过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样(使用IPC机制,不同进程之间,比如AIDL)。
一、使用同一个shareuserid,多个apk运行到同一个进程,实现多个apk之间的数据访问
实现效果:把A.apk assets目录下的session.log拷贝到/data/data/A包名/目录下面
A.apk
AndroidManifest.xml
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.demo1"
- android:sharedUserId="com.example"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="15"/>
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme">
- <activity
- android:name=".MainActivity"
- android:label="@string/title_activity_main">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
B.apk(实现访问资源并且拷贝)
MainActivity.java(如何访问assets资源文件请看另一篇http://mobile.51cto.com/aprogram-387591.htm)
- packagecom.example.demo2;
- importjava.io.File;
- importjava.io.FileOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importandroid.os.Bundle;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.content.pm.PackageManager.NameNotFoundException;
- importandroid.view.Menu;
- importandroid.view.MenuItem;
- importandroid.support.v4.app.NavUtils;
- publicclassMainActivityextendsActivity{
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Contextcontext=null;
- InputStreaminput=null;
- OutputStreamoutput=null;
- try{
- context=this.createPackageContext("com.example.demo1",
- Context.CONTEXT_IGNORE_SECURITY);
- Filefile=newFile("/data/data/com.example.demo1/session.log");
- if(!file.exists()){
- file.createNewFile();
- }
- input=context.getAssets().open("session.log");
- output=newFileOutputStream(file);
- byte[]buffer=newbyte[1024];
- intreadLength=0;
- while((readLength=input.read(buffer))!=-1){
- output.write(buffer,0,readLength);
- }
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- finally{
- try{
- if(input!=null||output!=null){
- input.close();
- output.close();
- input=null;
- output=null;
- }
- }catch(Exceptione2){
- //TODO:handleexception
- }
- }
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- getMenuInflater().inflate(R.menu.activity_main,menu);
- returntrue;
- }
- }
AndroidManifest.xml
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.demo2"
- android:versionCode="1"
- android:versionName="1.0"
- android:sharedUserId="com.example">
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="15"/>
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme">
- <activity
- android:name=".MainActivity"
- android:label="@string/title_activity_main">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
A.apk,B.apk使用同一个shareduserid:com.example
实现效果:
z
更多相关文章
- Android系统启动顺序(按下power键后所做的的工作)
- 零碎知识点回顾——常用数据结构
- Android中hybrid开发的基础知识
- Android适配器Adapter的学习(转载)
- Android(安卓)Studio配置文件修改
- Android中保存数据常用的方法
- 3G应用开发之Android(安卓)传智播客 基础知识总结
- Android(安卓)Gradle系列-入门篇
- Android使用KeyStore对数据进行加密