1. 程式人生 > >IPC機制簡介及簡單使用

IPC機制簡介及簡單使用

1. Android 中 IPC 簡介

1.1 IPC含義

IPC就是 Inter-Process Communication 的縮寫,含義為程序間通訊或者跨程序通訊,是指兩個程序之間進行資料交換的過程。

1.2 程序與執行緒

執行緒:是 CPU 排程的最小單元,同時執行緒是一種有限的系統資源。

程序:一般指一個執行單元,在 PC 和移動裝置上指的是一個程式或者一個應用。

兩者之間的關係:一個程序可以包含多個執行緒,一次程序和執行緒是包含和被包含的關係。最簡單情況下,一個程序可以只有一個執行緒,即主執行緒,在 Android 中主執行緒也叫做 UI 執行緒。

2. Android 中開啟多程序模式以及遇到的問題

2.1開啟多程序模式

Android 中多程序模式是指一個應用中存在多個程序的情況,因此這裡不討論兩個應用之間的多程序情況。在 Android 中使用多程序只有一種方法,那就是給四大元件(Activity、Service、Receiver、ContentProvider)在 AndroidMenifest 中指定 android:process 屬性。下面是一個在 Android 中建立多程序的示例:

        <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=".TwoActivity"
            android:process=":remote"/>
        <activity android:name=".ThreeActivity"
            android:process="com.example.user.myipc.remote"/>

上面示例分別為 TwoActivity 和ThreeActivity 指定了 process 屬性,並且屬性值不同,這就意味著當前應用又增加了兩個新程序。上面兩個 Activity 分別指定的是":remote" 和 "com.example.user.myipc.remote" ,這兩個有什麼不同呢?

":" 是一種簡單的寫法,含義是在當前的程序名前面附加上當前的包名,它的完整寫法就是 ThreeActivity 的 process 屬性。

到此為止,你已經學會了如何開啟多程序模式。

2.2 多程序模式的執行機制

上面講解了如何開啟多程序模式,下面來看開啟多程序模式後的小問題;我們新建一個類,名字為 UerManager,這個類裡面的內容為一個公共的靜態變數:

/**
 * Name:Wu.
 * Date:2018/10/28.
 * Describe:靜態成員變數
 */

public class UserManager {
    public static String userId = "1";
}

我們在 MainActivity 中將這個變數重新賦值為 “2” ,列印並啟動TwoActivity,MainActivity 中程式碼為:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        UserManager.userId = "2";
        Log.e("=MainActivity", UserManager.userId);

        //啟動TwoActivity
        Intent intent = new Intent(this,TwoActivity.class);
        startActivity(intent);
    }

接著在 TwoActivity 中打印出來這個變數,TwoActivity 中程式碼為:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Log.e("=TwoActivity", UserManager.userId);
    }

下面是列印結果:

可以看出,我們已經將靜態變數的值改變了,但它在 TwoActivity 中列印結果仍然是 "1",這就是多程序所帶來的問題。並不是指定完 android:process 屬性那麼簡單。

Android 會為每一個應用分配一個獨立的虛擬機器,在我們上面的例子中也是這樣,分配了兩個虛擬機器,它們都存在 UserManager 類並且兩個類是互不干擾的;所以出現了上面的情況。一般來說,使用多程序會造成如下幾方面的問題:

  • 靜態變數和單例模式失效
  • 執行緒同步機制失效
  • SharedPreferences 的可靠性下降
  • Application 會多次建立

第一個問題已經分析過了,第二個和第一個問題是類似的。第三個問題是因為 SharedPreferences 不支援兩個程序同時執行寫操作,否則會導致有一定概率的資料丟失,這是因為 SharePreferences 底層是通過讀寫 XML 檔案來實現的,併發寫是可能出現問題的。最後一個問題,也是顯然的,每啟動一個程序就相當於分配了一個獨立的虛擬機器,因此會把應用重新啟動一遍。所以不同的程序會擁有獨立的虛擬機器、Application 以及記憶體空間。

由此看來,開啟多程序雖然簡單,但是實現多程序通訊去傳遞資料卻不怎麼容易。