一 Android IPC简介
IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,指两个进程之间进行数据交换的过程.
1.1 为什么要开启多进程
- 单进程分配的内存不足,早期android系统只为一个单进程的应用分配16M的可用进程;
- 独立运行的组件,它的服务会另开一个进程;
- 运行一些"不可见人"的操作,比如获取用户隐私数据,比如双守护进程防止被用户杀掉
1.2 开启多进程
开启多进程的方法:给四大组件(Activity,Service,Receiver,ContentProvider)在AndroidMenifest中指定android:process属性.
a)在一个Activity中启动一个Service
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent mServiceIntent = new Intent(this,MyService.class);
startService(mServiceIntent);
}
}
b)MyService代码
public class MyService extends Service {
private static final String TAG = "aliang";
@Override
public void onCreate() {
Log.e(TAG,"MyService is onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG,"MyService is onStartCommand");
return START_STICKY;
}
@Override
public void onDestroy() {
Log.e(TAG,"MyService is onDestroy");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
c)在AndroidManifest.xml中的配置 android:process
<service
android:name=".MyService"
android:label="@string/app_name"
android:process=":remote" />
d)冒号":"代替当前应用的包名,所以MyService跑在进程名为"com.boxing.jnidemo:remote"的进程中,我们也可以设置为android:process="com.boxing.jnidemo.remote",这两个命名的区别在于:
冒号开头的,这个新的进程对于应用来说是私有的,要在当前的进程名前面附加上当前的包名,其他应用的组件不可以和它泡在同一个进程中;
包名.remote,他是一种完整的命名方式,属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中.
1.3 多进程引出的问题
一般来说,使用多进程会造成以下几个方面的问题:
- 静态成员和单例模式完全失效;
- 线程同步机制完全失效;
- SharedPreferences的可靠性能下降;
- Application会多次创建
虽然多进程带来了一系列问题,但是我们不能因为多进程有很多问题就不正视它,为了解决这个问题,系统提供了很多跨进程通信方法,比如通过Intent来传递数据,共享文件和SharedPreferences,基于Binder的Messenger,AIDL以及Socket.
二 IPC基础概念介绍
2.1 Serializable接口
它是一个序列化接口,是一个空接口,为对象提供标准的序列化和反序列化操作.
注意:
①静态成员变量属于类不属于对象,所以不会参与序列化过程;
②用transient关键字标记的成员变量不参与序列化过程;
③系统默认序列化过程也是可以改变的.
2.2 Parceable接口
Parcel内部包装了可序列化的数据,可以在Binder中自由传输,序列化功能由writeToParcel方法来完成,反序列化功能由CREATOR来完成,内容描述功能由describeContents方法来完成,几乎所有情况下这个方法都应该返回0.
2.3 Binder
直观来说:Binder是Android中的一个类,实现了IBinder接口,是Android中的一种跨进程通信方式;
从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager等等)和相应ManagerService的桥梁;
从Android应用层来讲:Binder是客户端和服务端进行通信的媒介.
未完待续...