您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)深入淺析Android應(yīng)用中的多進(jìn)程,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
android:process
android:process
這個屬性一個應(yīng)用 android:process
簡單示例
<activity android:name=".MusicPlayerActivity" android:process=":music"/> <activity android:name=".AnotherActivity" android:process="droidyue.com"/>
應(yīng)用多進(jìn)程有什么好處
增加App可用內(nèi)存
在Android中,默認(rèn)情況下系統(tǒng)會為每個App分配一定大小的內(nèi)存。比如從最早的16M到后面的32M或者48M等。具體的內(nèi)存大小取決于硬件和系統(tǒng)版本。
這些有限的內(nèi)存對于普通的App還算是夠用,但是對于展示大量圖片的應(yīng)用來說,顯得實在是捉襟見肘。
仔細(xì)研究一下,你會發(fā)現(xiàn)原來系統(tǒng)的這個限制是作用于進(jìn)程的(畢竟進(jìn)程是作為資源分配的基本單位)。意思就是說,如果一個應(yīng)用實現(xiàn)多個進(jìn)程,那么這個應(yīng)用可以獲得更多的內(nèi)存。
于是,增加App可用內(nèi)存成了應(yīng)用多進(jìn)程的重要原因。
獨立于主進(jìn)程
除了增加App可用內(nèi)存之外,確保使用多進(jìn)程,可以獨立于主進(jìn)程,確保某些任務(wù)的執(zhí)行和完成。
舉一個簡單的例子,之前的一個項目存在退出的功能,其具體實現(xiàn)為殺掉進(jìn)程。為了保證某些統(tǒng)計數(shù)據(jù)上報正常,不受當(dāng)前進(jìn)程退出的影響,我們可以使用獨立的進(jìn)程來完成。
多進(jìn)程的不足與缺點
數(shù)據(jù)共享問題
SQLite容易被鎖
不必要的初始化
Application.onCreate
方法。一些簡單的代碼示例
獲取當(dāng)前的進(jìn)程名
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; }
基本的進(jìn)程初始化類
這個類用來每個進(jìn)程共用的業(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); } } }
是否需要多進(jìn)程
判斷是否需要多進(jìn)程,需要視具體情況而定。
內(nèi)存限制
除了內(nèi)存限制之外,還需要考慮是否真的需要獨立于主進(jìn)程來執(zhí)行某些操作。
關(guān)于android:process的其他問題
在android:process
部分我們提到,如果這個屬性值以小寫字母開頭,那么就是全局的進(jìn)程,可以被其他應(yīng)用共用。
所謂的共用,指的是不同的App的組件運行在同一個指定的進(jìn)程中。
準(zhǔn)備條件
受制于Android系統(tǒng)的安全機(jī)制,我們需要做到以下兩個準(zhǔn)備條件才可以。
android:sharedUserId
的值具體示例
第一個App的Manifest文件,AnotherActivity運行在名為droidyue.com的進(jìn)程中。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.droidyue.androidmutipleprocesssample" android:sharedUserId="droidyue.com" > <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".AnotherActivity" android:process="droidyue.com"/> </application> </manifest>
第二個App的Manifest文件,SecondActivity運行在名為droidyue.com的進(jìn)程中。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.jishuxiaoheiwu.accessfromanotherprocess" android:sharedUserId="droidyue.com" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".SecondActivity" android:process="droidyue.com" /> </application> </manifest>
上面的AnotherActivity和SecondActivity會運行在一個名為droidyue.com的進(jìn)程中,盡管他們位于不同的App中。
關(guān)于深入淺析Android應(yīng)用中的多進(jìn)程就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。