Android多进程通信机制
更多面试题请看这里:https://interview.raoyunsoft.com/
面试题专栏会持续更新欢迎关注订阅
1. Messenger跨进程通信
核心原理:基于Handler的消息机制封装,通过Binder实现跨进程通信。适合简单消息传递场景。
服务端实现:
public class MessengerService extends Service {private Messenger serviceMessenger = new Messenger(new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0x01: // 处理客户端消息// 业务逻辑break;}}});@Overridepublic IBinder onBind(Intent intent) {return serviceMessenger.getBinder(); // 返回Binder对象}
}
关键配置:在AndroidManifest.xml中声明独立进程
<service android:name=".MessengerService"android:process=":remote_process"/>
客户端绑定:
private Messenger mService;
private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mService = new Messenger(service);try {// 发送消息到服务端Message msg = Message.obtain();msg.what = 0x01;mService.send(msg);} catch (RemoteException e) {e.printStackTrace();}}
};@Override
protected void onCreate(Bundle savedInstanceState) {bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
双向通信:客户端设置replyTo
接收回调
Message msg = Message.obtain();
msg.replyTo = new Messenger(new Handler() {@Overridepublic void handleMessage(Message serverMsg) {// 处理服务端响应}
});
2. AIDL跨进程通信
适用于复杂接口调用场景,支持自定义对象传输。
AIDL接口定义:
// Book.aidl
parcelable Book;// IBookManager.aidl
interface IBookManager {List<Book> getBookList();void addBook(in Book book); // in表示输入参数
}
支持数据类型:
- 基本类型(int/long等)
- String/CharSequence
- Parcelable对象
- List/Map(需泛型参数支持AIDL类型)
服务端实现:
public class BookManagerService extends Service {private CopyOnWriteArrayList<Book> mBookList = new CopyOnWriteArrayList<>();private IBinder mBinder = new IBookManager.Stub() {@Overridepublic List<Book> getBookList() {return mBookList;}@Overridepublic void addBook(Book book) {mBookList.add(book);}};@Overridepublic IBinder onBind(Intent intent) {return mBinder;}
}
客户端调用:
private IBookManager mBookManager;
private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mBookManager = IBookManager.Stub.asInterface(service);try {mBookManager.addBook(new Book("Android进阶"));} catch (RemoteException e) {e.printStackTrace();}}
};
高级特性:
- 回调监听:使用
RemoteCallbackList
管理跨进程监听器
private RemoteCallbackList<IOnNewBookListener> mListeners = new RemoteCallbackList<>();// 触发回调
void notifyNewBook(Book book) {int N = mListeners.beginBroadcast();for (int i=0; i<N; i++) {mListeners.getBroadcastItem(i).onNewBook(book);}mListeners.finishBroadcast();
}
- 权限验证:
<!-- 声明自定义权限 -->
<permission android:name="com.example.PERMISSION_ACCESS_BOOK_SERVICE"android:protectionLevel="normal"/>
服务端验证:
public IBinder onBind(Intent intent) {int check = checkCallingPermission("com.example.PERMISSION_ACCESS_BOOK_SERVICE");return (check == PERMISSION_GRANTED) ? mBinder : null;
}
3. ContentProvider跨进程
专用于应用间数据共享,通过URI机制访问:
// 客户端查询数据
Cursor cursor = getContentResolver().query(Uri.parse("content://com.example.provider/books"),null, null, null, null
);
技术选型建议:
- 简单消息传递 → Messenger
- 复杂接口调用 → AIDL
- 数据共享场景 → ContentProvider
注意跨进程调用默认非线程安全,需做好同步处理!