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