Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> android多apk共享私有文件

android多apk共享私有文件

編輯:高級開發

 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中的文件了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved