Android中的多進程模式
給四大組件指定android:process屬性,即可開啓多進程模式。
創建OneActivity和TwoActivity,並給OneActivity設置 android:process=":OneActivityProcess",給
TwoActivity設置 android:process=“com.example.test.TwoActivityProcess”。
<activity android:name=".process.OneActivity"
android:screenOrientation="portrait"
android:process=":OneActivityProcess">
</activity>
<activity android:name=".process.TwoActivity"
android:screenOrientation="portrait"
android:process="com.example.test.TwoActivityProcess">
</activity>
然後通過MainHomeActivity 啓動OneActivity,然後從OneActivity啓動TwoActivity。
通過Android Studio 的DDMS查看如圖:
進程名以":"開頭代表當前的進程名前附加當前的包名。代表該進程屬於當前應用的私有進程。
android:process=“com.example.test.TwoActivityProcess” 這個則是一個完整的進程名,不會附加包名信息。代表該進程屬於全局進程。
多進程中的數據共享問題
創建User類,給其mUserName賦值爲大傻瓜
public class User {
public static String mUserName = "大傻瓜";
}
MainHomeActivity中 onCreate()方法中修改它的值並打印。
User.mUserName = "聰明鬼";
Log.e(TAG,User.mUserName);
在OneActivity中 onCreate()方法中打印它的值
Log.e(TAG,User.mUserName);
然後運行,效果如下:
跳轉到OneActivity數據如圖。
發現在MainHomeActivity中修改mUserName的值並沒有在OneActivity中生效,而是保持了原有值。這兩個進程是互不干擾的。
每創建一個進程,都會執行一次application的 onCreate()方法。
如下:創建MyApplication 繼承Application,在onCreate()方法中打印進程名。當然註冊時少不了的。
public class MyApplication extends Application{
private static final String TAG = "MyApplication";
@Override
public void onCreate() {
super.onCreate();
String processName = ProcessUtils.getProcessName(getApplicationContext(), Process.myPid());
Log.e(TAG, "onCreate: "+processName);
}
}
public class ProcessUtils {
public static String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager) cxt
.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
}
運行程序
跳轉到OneActivity
再跳轉到TwoActivity