Android多進程整理

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
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章