Android學習筆記30——多程序模式
阿新 • • 發佈:2018-12-01
前言
之前的學習中,我們有提到Android的IPC機制。但是在深入IPC機制之前,我們要先理解Android的多程序模式。
Android多程序
正常情況下,在Android中多程序是指一個應用存在多個程序的情況。
多程序模式的開啟
使用Android多程序只有一種方法,通過給四大元件(Activity
、Service
、Receiver
、ContentProvider
)在AndroidMenifest
中指定android:process
屬性,我們就可以輕易開啟多程序模式。
多程序舉例
<activity android:name="com.ryg.chapter_2.MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" android:launchMode="standard"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.ryg.chapter_2.SecondActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process=":remote"/> <activity android:name="com.ryg.chapter_2.ThirdActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process="com.ryg.chapter_2.remote"/>
上面的示例分別為SecondActivity
、ThirdActivity
指定了process
屬性,並且它們的屬性值不同,這意味著當前應用又增加了兩個程序。同樣入口的Activity是MAinActivity,我們沒有為它指定process
屬性,那麼它就會執行在預設執行緒中,預設程序的程序名就是包名。
檢視程序命令
我們除了可以通過DDMS檢視中可以檢視程序資訊,我們還可以通過shell來檢視,命令是:adb shell ps
或者adb shell ps|grep 包名
。
多程序的命名方式
我們上面的例子中兩個Activity中的android:process
屬性分別是:remote
com.ryg.chapter_2.remote
,兩種命名方式是有區別的。它們的區別是“:”的含義是指在當前程序名前面附上當前的包名,這是一個簡寫的方法。com.ryg.chapter_2.remote
,它是一種完整的命名方法,不會附加包名。
私有程序
程序名以“:”開頭的程序屬於當前應用的私有程序,其他應用的元件不可以和它跑在同一個程序中。
全域性程序
程序名不以“:”開頭的程序屬於全域性程序,其他應用通過ShareUID方式可以和它跑在同一程序中。
多程序模式可能會出現的問題
開啟多程序的方法很容易,如上面所說的那樣。但是在實際使用的過程中開啟多程序模式會產生很多問題。問題如下:
- 靜態成員和單例模式完全失效;
- 執行緒同步機制完全失效;
- SharedPreferences的可靠性下降;
- Application會多次建立。