IPC__ALL

weixin_34402408發表於2016-06-16

IPC機制的使用場景:

  • Android對單個應用使用的最大記憶體做了限制,需要獲取更多的記憶體
  • 當前應用需要向其他應用獲取資料

開啟多程式

開啟多程式模式的唯一方法是在清單檔案中設定 process 屬性。

  1. 私有程式的開啟
android:process=":remote"
  1. 全域性程式的開啟
android:process="com.lzx.app.remote"

其他應用可以通過 ShareUID 方式和它跑在同一程式中。


多執行緒示例

開啟多執行緒。

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize"
            android:label="@string/app_name"
            android:launchMode="standard" >
             <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- 當SecondActivity啟動的時候,系統會為它建立一個單獨私有的程式 -->
        <activity
            android:name=".SecondActivity"
            android:configChanges="screenLayout"
            android:label="@string/app_name"
            android:process=":remote" />
            
        <!-- 當ThirdActivity啟動的時候,系統會為它建立一個全域性的程式 -->
        <activity
            android:name=".ThirdActivity"
            android:configChanges="screenLayout"
            android:label="@string/app_name"
            android:process="com.ryg.chapter_2.remote" />
</application>

在MyApplication中

public class MyApplication extends Application {

    private static final String TAG = "MyApplication";

    @Override
    public void onCreate() {
        super.onCreate();
        String processName = MyUtils.getProcessName(getApplicationContext(),
                Process.myPid());
        Log.d(TAG, "application start, process name:" + processName);
    }
}

public class MyUtils {

    public static String getProcessName(Context cxt, int pid) {
        ActivityManager am = (ActivityManager) cxt
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
        if (runningApps == null) {
            return null;
        }
        for (RunningAppProcessInfo procInfo : runningApps) {
            if (procInfo.pid == pid) {
                return procInfo.processName;
            }
        }
        return null;
    }
}

啟動Application,然後依次手動點選啟動SecondActivity,ThirdActivity。我們可以看到log日誌

2200129-819fbbbd7bdceebe.png
Paste_Image.png

Binder 和 AIDL

ContentProvider