夜の魅 阅读(232) 评论(0)

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 通信。