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
在这里插入图片描述

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