Android中的有IPC有哪些
组件间使用 Intent 传递数据(Bundle);
文件共享;
Messenger;
AIDL;
ContentProvider;
Broadcast
Socket;
@[TOC]1.如何使用
创建Service
/**
* //0. 去清单文件中配置service并设置启动action
*/
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
// 1.创建接受信息的handler
@SuppressLint("HandlerLeak")
private Handler msgHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 4.接口客户端消息
Bundle data = msg.getData();
String clientMsg = data.getString("client");
Log.i(TAG, "客户端消息: "+clientMsg);
//5.获取Messenger对象发送消息
Message message = Message.obtain();
Bundle serviceBundle = new Bundle();
serviceBundle.putString("service","服务端收到消息");
message.setData(serviceBundle);
try {
Messenger clientMessenger = msg.replyTo;
clientMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
// 2.创建Messenger对象,并绑定Handler
private final Messenger mServiceMessenger = new Messenger(msgHandler);
// 3.通过Messenger获取Binder对象
@Nullable
@Override
public IBinder onBind(Intent intent) {
// IMessenger.asBinder()
return mServiceMessenger.getBinder();
}
}
2在清单文件注册
<service android:name="[你的包名].main.MessengerService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="随便写xxx.MessengerService" />
</intent-filter>
</service>
接着就去写客户端
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
public static final String SERVICE_ACTION = "之前服务端清单文件定义的action";
public static final String SERVICE_PACKED = "你的包名";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn1).setOnClickListener(this);
connectService();
}
//1. 绑定service,获得IBinder回调
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "onServiceConnected: " + name);
//3. 获取服务端的Messenger对象
Messenger serviceMessenger = new Messenger(service); // 利用Messenger的构造方法获取IMessenger.Stub.asInterface(service);是底层生成好的aidl实现类IMessenger
//4. 准备消息
Message message = Message.obtain();
Bundle b = new Bundle();
b.putString("client", "服务端你好,我是客户端");
message.setData(b);
//7.在消息中添加客户端回复入口Messenger,Optional Messenger where replies to this message can be sent.
message.replyTo = mClientMessenger;
//8.发送消息,通过IMessenger发送消息
try {
serviceMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "onServiceDisconnected: " + name);
}
};
//2. 绑定服务端服务
private void connectService() {
Intent intent = new Intent(SERVICE_ACTION);
intent.setPackage(SERVICE_PACKED);
boolean b = bindService(intent, conn, Context.BIND_AUTO_CREATE);
Log.i(TAG, "connectService: 绑定服务 " + b);
}
//5 创建客户端接受消息的handler
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
String service = bundle.getString("service");
Log.i(TAG, "服务端的回复: " + service);
}
};
//6.创建客户端Messenger,并绑定handler
private Messenger mClientMessenger = new Messenger(handler);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
connectService();
break;
default:
break;
}
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}
- 原理
Messenger底层也是通过aidl实现,不过封装了一层,aidl支持多线程并发。messenger是同步,如果没有多线程并发要求,就可以使用轻量级的Messenger - 适合什么场景