真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

深入淺析Android應(yīng)用中的多進程

這篇文章將為大家詳細講解有關(guān)深入淺析Android應(yīng)用中的多進程,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)是專業(yè)的密云網(wǎng)站建設(shè)公司,密云接單;提供網(wǎng)站制作、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行密云網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

android:process

  • 應(yīng)用實現(xiàn)多進程需要依賴于android:process這個屬性
  • 適用元素:Application, Activity, BroadcastReceiver, Service, ContentProvider。
  • 通常情況下,這個屬性的值應(yīng)該是”:“開頭。表示這個進程是應(yīng)用私有的。無法在在跨應(yīng)用之間共用。
  • 如果該屬性值以小寫字母開頭,表示這個進程為全局進程??梢员欢鄠€應(yīng)用共用。(文章結(jié)尾會探討這個問題)

一個應(yīng)用 android:process 簡單示例



應(yīng)用多進程有什么好處

增加App可用內(nèi)存

在Android中,默認情況下系統(tǒng)會為每個App分配一定大小的內(nèi)存。比如從最早的16M到后面的32M或者48M等。具體的內(nèi)存大小取決于硬件和系統(tǒng)版本。

這些有限的內(nèi)存對于普通的App還算是夠用,但是對于展示大量圖片的應(yīng)用來說,顯得實在是捉襟見肘。

仔細研究一下,你會發(fā)現(xiàn)原來系統(tǒng)的這個限制是作用于進程的(畢竟進程是作為資源分配的基本單位)。意思就是說,如果一個應(yīng)用實現(xiàn)多個進程,那么這個應(yīng)用可以獲得更多的內(nèi)存。

于是,增加App可用內(nèi)存成了應(yīng)用多進程的重要原因。

獨立于主進程

除了增加App可用內(nèi)存之外,確保使用多進程,可以獨立于主進程,確保某些任務(wù)的執(zhí)行和完成。

舉一個簡單的例子,之前的一個項目存在退出的功能,其具體實現(xiàn)為殺掉進程。為了保證某些統(tǒng)計數(shù)據(jù)上報正常,不受當前進程退出的影響,我們可以使用獨立的進程來完成。

多進程的不足與缺點

數(shù)據(jù)共享問題

  • 由于處于不同的進程導(dǎo)致了數(shù)據(jù)無法共享內(nèi)容,無論是static變量還是單例模式的實現(xiàn)。
  • SharedPreferences 還沒有增加對多進程的支持。
  • 跨進程共享數(shù)據(jù)可以通過Intent,Messenger,AIDL等。

SQLite容易被鎖

  • 由于每個進程可能會使用各自的SQLOpenHelper實例,如果兩個進程同時對數(shù)據(jù)庫操作,則會發(fā)生SQLiteDatabaseLockedException等異常。
  • 解決方法:可以使用ContentProvider來實現(xiàn)或者使用其他存儲方式。
     

不必要的初始化

  • 多進程之后,每個進程在創(chuàng)建的時候,都會執(zhí)行自己的Application.onCreate方法。
  • 通常情況下,onCreate中包含了我們很多業(yè)務(wù)相關(guān)的初始化,更重要的這其中沒有做按照進程按需初始化,即每個進程都會執(zhí)行全部的初始化。
  • 按需初始化需要根據(jù)當前進程名稱,進行最小需要的業(yè)務(wù)初始化。
  • 按需初始化可以選擇簡單的if else判斷,也可以結(jié)合工廠模式
     

一些簡單的代碼示例

獲取當前的進程名

private String getCurrentProcessName() {
 String currentProcName = "";
 int pid = android.os.Process.myPid();
 ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
 for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
  if (processInfo.pid == pid) {
   currentProcName = processInfo.processName;
   break;
  }
 }
 return currentProcName;
}

基本的進程初始化類

這個類用來每個進程共用的業(yè)務(wù)初始化邏輯。

public class AppInitialization {
 @CallSuper
 public void onAppCreate(Application application) {
  Log.i("AppInitialization", "onAppCreate is being executed.");
 }
}

工廠模式的應(yīng)用

public class AppInitFactory {
 public static AppInitialization getAppInitialization(String processName) {
  AppInitialization appInitialization;
  if (processName.endsWith(":game")) {
   appInitialization = new GameAppInitialization();
  } else if (processName.endsWith(":music")) {
   appInitialization = new MusicAppInitialization();
  } else {
   appInitialization = new AppInitialization();
  }
  return appInitialization;
 }

 static class GameAppInitialization extends AppInitialization {
  @Override
  public void onAppCreate(Application application) {
   super.onAppCreate(application);
   Log.i("GameAppInitialization", "onAppCreate is being executed.");
  }
 }

 static class MusicAppInitialization extends AppInitialization {
  @Override
  public void onAppCreate(Application application) {
   super.onAppCreate(application);
   Log.i("MusicAppInitialization", "onAppCreate is being executed.");
  }
 }
}

具體的調(diào)用時的代碼

public class MyApplication extends Application{
 private static final String LOGTAG = "MyApplication";

 @Override
 public void onCreate() {
  super.onCreate();
  String currentProcessName = getCurrentProcessName();
  Log.i(LOGTAG, "onCreate currentProcessName=" + currentProcessName);
  AppInitialization appInitialization = AppInitFactory.getAppInitialization(currentProcessName);
  if (appInitialization != null) {
   appInitialization.onAppCreate(this);
  }
 }
}

是否需要多進程

判斷是否需要多進程,需要視具體情況而定。

內(nèi)存限制

  • 研究內(nèi)存占用居高不下的原因
  • 如果是由內(nèi)存泄漏導(dǎo)致,嘗試解決來降低內(nèi)存占用
  • 如有必要,可以通過配置largeHeap嘗試解決
     

除了內(nèi)存限制之外,還需要考慮是否真的需要獨立于主進程來執(zhí)行某些操作。

關(guān)于android:process的其他問題

android:process部分我們提到,如果這個屬性值以小寫字母開頭,那么就是全局的進程,可以被其他應(yīng)用共用。

所謂的共用,指的是不同的App的組件運行在同一個指定的進程中。

準備條件

受制于Android系統(tǒng)的安全機制,我們需要做到以下兩個準備條件才可以。

  1. 這個應(yīng)用使用同樣的簽名
  2. 兩個應(yīng)用指定同一個android:sharedUserId的值
     

具體示例

第一個App的Manifest文件,AnotherActivity運行在名為droidyue.com的進程中。



 

  
 

第二個App的Manifest文件,SecondActivity運行在名為droidyue.com的進程中。



 
  
 

上面的AnotherActivity和SecondActivity會運行在一個名為droidyue.com的進程中,盡管他們位于不同的App中。

關(guān)于深入淺析Android應(yīng)用中的多進程就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


網(wǎng)站題目:深入淺析Android應(yīng)用中的多進程
URL標題:http://weahome.cn/article/jgcido.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部