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