IPC:Intent-process Communication,跨进程通信。
在一个应用程序中,可以很方便的开启多进程。开启进程的方式只有一种,只能在AndroidMenifest中为四大组件指定 Android:process属性。
在非常规情况下,也可以通过JNI在native层去fork一个新的进程。
<activity android:name=".MainActivity" android:label="@string/app_name" android:process=":process" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
如上,便可开启一个进程。也可以这样,
android:process="hang.myapplication.process"
这两张方案有什么区别那?
第一种方式,“:”的含义是指要在当前的进程名上添加当前的包名,属于当前应用的私有进程,其他应用的组件不会和它在一个进程中。
第二种方式,它是一个完整的命名方式,不会附件包名信息,该进程是全局进程,其他应用可以通过ShareUid方式和他在同一进程。
android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。
虽然开启进程很方便,但是多进程会造成很多的问题出现,比如,内存无法共享数据。
开启进程后,SecondActity无法正确MainActivity修改的值。这是因为正常情况下,两者共享同一内存,由于系统在创建新的进程同时分配独立的虚拟机,那么两者连统一虚拟都不在,何况内存。原理如下:user类在两个进程中是独立存在的,并且这两个类互不干扰。
一般来说,使用多进程会造成如下几个方面影响:
1.静态成员和单例模式完全失效。
2.线程同步机制完全失效。
3.SharedPreferences的可靠性下降。
4.Application会多次创建。
由于会分配信的虚拟机,那么也就是重新启动一个应用,自然会创建新的Application。实现跨进程通信的方法有很多,比如Intent,SharedPreference,Binder,以及Socket 通信。