轉自:http://blog.csdn.net/spencer_hale/article/details/54968092android
1.怎樣用多進程數據庫
Android多進程概念:通常狀況下,一個應用程序就是一個進程,這個進程名稱就是應用程序包名。咱們知道進程是系統分配資源和調度的基本單位,因此每一個進程都有本身獨立的多線程
資源和內存空間,別的進程是不能任意訪問其餘進程的內存和資源的。架構
如何讓本身的應用擁有多個進程:併發
四大組件在AndroidManifest文件中註冊的時候,有個屬性android:process這裏能夠指定組件的所處的進程。ide
默認就是應用的主進程。指定爲別的進程以後,系統在啓動這個組件的時候,就先建立(若是還沒建立的話)這個進程,而後再建立該組件。打印出它的進程名稱:重this
載Application類的onCreate方法便可。.net
設置android:process屬性,要注意:若是是android:process=」:deamon」,以:開頭的名字,表示這是一個應用程序的私有進程,不然它是一個全局進程。私有進程的進程名稱是線程
會在冒號前自動加上包名,而全局進程則不會。通常咱們都是有私有進程,不多使用全局進程。調試
2.用多進程的好處
好處:
(1)分擔主進程的內存壓力。
當應用越作越大,內存愈來愈多,將一些獨立的組件放到不一樣的進程,它就不佔用主進程的內存空間了。固然還有其餘好處,有心人會發現
(2)使應用常駐後臺,防止主進程被殺守護進程,守護進程和主進程之間相互監視,有一方被殺就從新啓動它。
Android後臺進程裏有不少應用是多個進程的,由於它們要常駐後臺,特別是即時通信或者社交應用,不過如今多進程已經被用爛了。
典型用法是在啓動一個不可見的輕量級私有進程,在後臺收發消息,或者作一些耗時的事情,或者開機啓動這個進程,而後作監聽等。
#壞處:消耗用戶的電量。
多佔用了系統的空間,若全部應用都這樣佔用,系統內存很容易佔滿而致使卡頓。
應用程序架構會變得複雜,由於要處理多進程之間的通訊。這裏又是另一個問題了。
3.多進程的缺陷
進程間的內存空間是不可見的。開啓多進程後,會引起如下問題:
1)Application的屢次重建。
2)靜態成員的失效。
3)文件共享問題。
4)斷點調試問題。
4.解決方法
1)針對Application的屢次重建:
在Application的onCreate中獲取進程Id來判斷不一樣進程,而後作不一樣的事情。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//獲取進程Id
int pid = android.os.Process.myPid();
Log.e("m_tag", "MyApplication onCreate pid is " + pid); //根據進程id獲取進程名稱
String pName = getProcessName(this,pid);
if("com.xyy.processtest".equals(pName)){
//處理該進程的業務
}
}
}
public String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager)
cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
2)針對靜態成員的失效:
使用Intent或者aidl等進程通信方式傳遞內容,不能用靜態或單例模式。
3)針對文件共享問題:
多進程狀況下會出現兩個進程在同一時刻訪問同一個數據庫文件的狀況。這就可能形成資源的競爭訪問,致使諸如數據庫損壞、數據丟失等。在多線程的狀況下咱們有鎖機制控制資源的共享,可是在多進程中比較難,雖然有文件鎖、排隊等機制,可是在Android裏很難實現。解決辦法就是多進程的時候不併發訪問同一個文件,好比子進程涉及到操做數據庫,就能夠考慮調用主進程進行數據庫的操做。
4)針對斷點調試問題:
調試就是跟蹤程序運行過程當中的堆棧信息,因爲每一個進程都有本身獨立的內存空間和各自的堆棧,沒法實如今不一樣的進程間調試。所以要改成同一進程:調試時去掉AndroidManifest.xml中android:process標籤,這樣保證調試狀態下是在同一進程中,堆棧信息是連貫的。待調試完成後,再將標籤復原。