IPC__ALL
IPC機制的使用場景:
- Android對單個應用使用的最大記憶體做了限制,需要獲取更多的記憶體
- 當前應用需要向其他應用獲取資料
開啟多程式
開啟多程式模式的唯一方法是在清單檔案中設定 process 屬性。
- 私有程式的開啟
android:process=":remote"
- 全域性程式的開啟
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日誌