一、基礎知識
1.一些概念
IPC : Inter-process Communication 跨進程通信,是指兩個進程之間進行數據交換的過程。
線程:線程是 CPU 調度的最小單元,同時線程是一種有限的系統資源。
進程:一般是指一個執行單元, 在 PC 和移動設備上指一個程序或者一個應用。 進程可以包含多個線程。
2. Android 中的多進程模式
(1).開啓多進程模式
給四大組件在 AndroidManifest 中指定 android:process 屬性,即可開啓。
通過命令行 adb shell ps 可以看見進程信息。
(2).多進程模式的運行機制
系統會爲每一個進程分配一個獨立的虛擬機,不同的虛擬機在內存分配不同的地址空間。
使用多進程會造成的問題:
.靜態成員和單例模式完成失效;
.線程同步機制完成失效;
.SharedPreferences 的可靠性下降;
.Application 會多次創建(因爲運行同一個進程中的組件是屬於同一個虛擬機和同一個 Application 的)
二、IPC 基礎概念介紹
1、Serializable 接口
2、Parcelable 接口
Serializable 與 Parcelable 的區別與選用
Serializable 開銷大,序列化和反序列化過程需要大量的 I/O 操作,如果是存儲在設備中,網絡傳輸,一般使用 Serializable;
Parcelable 主要用在內存序列化上,是 Android 中的方法。
3、Binder
三、 Android 中的 IPC 方式
1、使用 Bundle
2、使用文件共享
3、使用 Messenger
public class MessengerService extends Service {
private static final String TAG = "message";
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case Constants.MSG_FROM_CLIENT:
Log.i(TAG, "receive msg from Client : " + msg.getData().getString("msg"));
// 回覆客服端
Messenger client = msg.replyTo;
Message replyMessage = Message.obtain(null, Constants.MSG_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("reply", "你的消息已收到");
replyMessage.setData(bundle);
try {
client.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
private final Messenger mMessenger = new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
public class MessengerActivity extends Activity {
private static final String TAG = "message";
private Messenger mMessenger;
private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger = new Messenger(service);
Message msg = Message.obtain(null, Constants.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "Hello, this is client.");
msg.setData(data);
msg.replyTo = mGetReplyMessenger;
try {
mMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
Intent intent = new Intent(this, MessengerService.class);
bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(mConnection);
super.onDestroy();
}
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case Constants.MSG_FROM_SERVICE:
Log.i(TAG, "receive msg from Service : " + msg.getData().getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
}
}
4、使用 AIDL
使用 AIDL 比較複雜,這裏掠過
5、使用 Socket
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>