編輯:關於Android編程
前言
在計算機操作系統中,進程是進行資源分配和調度的基本單位。這對於基於Linux內核的Android系統也不例外。在Android的設計中,一個應用默認有一個(主)進程。但是我們通過配置可以實現一個應用對應多個進程。
本文將試圖對於Android中應用多進程做一些整理總結。
android:process
android:process
這個屬性一個應用 android:process
簡單示例
<activity android:name=".MusicPlayerActivity" android:process=":music"/> <activity android:name=".AnotherActivity" android:process="droidyue.com"/>
應用多進程有什麼好處
增加App可用內存
在Android中,默認情況下系統會為每個App分配一定大小的內存。比如從最早的16M到後面的32M或者48M等。具體的內存大小取決於硬件和系統版本。
這些有限的內存對於普通的App還算是夠用,但是對於展示大量圖片的應用來說,顯得實在是捉襟見肘。
仔細研究一下,你會發現原來系統的這個限制是作用於進程的(畢竟進程是作為資源分配的基本單位)。意思就是說,如果一個應用實現多個進程,那麼這個應用可以獲得更多的內存。
於是,增加App可用內存成了應用多進程的重要原因。
獨立於主進程
除了增加App可用內存之外,確保使用多進程,可以獨立於主進程,確保某些任務的執行和完成。
舉一個簡單的例子,之前的一個項目存在退出的功能,其具體實現為殺掉進程。為了保證某些統計數據上報正常,不受當前進程退出的影響,我們可以使用獨立的進程來完成。
多進程的不足與缺點
數據共享問題
SQLite容易被鎖
不必要的初始化
Application.onCreate
方法。一些簡單的代碼示例
獲取當前的進程名
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; }
基本的進程初始化類
這個類用來每個進程共用的業務初始化邏輯。
public class AppInitialization { @CallSuper public void onAppCreate(Application application) { Log.i("AppInitialization", "onAppCreate is being executed."); } }
工廠模式的應用
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."); } } }
具體的調用時的代碼
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); } } }
是否需要多進程
判斷是否需要多進程,需要視具體情況而定。
內存限制
除了內存限制之外,還需要考慮是否真的需要獨立於主進程來執行某些操作。
關於android:process的其他問題
在android:process
部分我們提到,如果這個屬性值以小寫字母開頭,那麼就是全局的進程,可以被其他應用共用。
所謂的共用,指的是不同的App的組件運行在同一個指定的進程中。
准備條件
受制於Android系統的安全機制,我們需要做到以下兩個准備條件才可以。
android:sharedUserId
的值具體示例
第一個App的Manifest文件,AnotherActivity運行在名為droidyue.com的進程中。
<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的進程中。
<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的進程中,盡管他們位於不同的App中。
但是這種共用進程的方式會引發很多問題,不太建議大家使用。
以上就是我關於Android中多進程的一些淺顯的研究,如有問題,歡迎指正。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
Android Fragment的回退棧點開之後按一次回退鍵只返回一次MainActivity 類public class MainActivity exte
實現功能:實現網絡音樂搜索功能實現網絡音樂下載功能下載好的音樂目前不在播放器內,可以通過文件浏覽器查看。後續將博文,將實現歌詞和下載音樂掃描功能。經過將近4天,才發布這一
看了前面的文章我們知道請求網絡的幾種方式:1.使用TCP協議和URL進行網絡編程 a)基於TCP協議:ServerSocket,Socket b)基於URL:
前言本文主要講解Telephony中Phone相關的知識,主要想講明白三件事情:Phone是什麼? Phone從哪裡來? Phone有什麼作用?1. Phone是什麼1.