最近在了解Service时接触到Android IPC,IPC全称是Inter-Process Communication,意思是进程间通信,当然也包括了跨进程通信。要了解IPC,首先需要知道的是Android中开启多进程模式的方式。
开启多进程
想要在一个应用程序中开启多个进程,在Android中有这一种方法:即在AndroidMenifest.xml中给四大组件指定一个android:process的属性,以下为示例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ipc">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/app_name"
android:process=":remote"
>
</activity>
</application>
</manifest>
程序运行后打开DDMS会发现出现了两个进程,如图:
一个是com.ipc即包名,另外一个则是添加了上述配置文件 :remote后缀,当然 android:process这个属性也可以自己命名,如 android:process=”com.ipc.remote”。其中的区别是前者是私有进程,其他应用不可以和它跑在同一个线程,后者为全局进程,功能相反。
多进程的问题
经过上面的测试,会发现原来在一个程序中开启多进程那么简单。其实,看似简单,却有着许多进程间数据共享的问题。举个例子,我们再创建一个类Manager,里面存在一个全局变量:
public class Manager {
public static int mId = 1;
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("TAG", "Id = " + Manager.mId + "");
//在进程1中修改mId
Manager.mId = 2;
startActivity(new Intent(this, SecondActivity.class));
}
}