Android多进程通信机制

更多面试题请看这里: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();
        }
    }
};

高级特性

  1. 回调监听 :使用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();
}
  1. 权限验证
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
    注意跨进程调用默认非线程安全,需做好同步处理!
相关推荐
兰令水1 小时前
leecodecode【面试150】【2026.6.14打卡-java版本】
java·算法·面试
kyriewen9 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
程序员二叉9 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉9 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
-SOLO-11 小时前
备份apk 工具
android
IT龟苓膏13 小时前
并发深度解析】硬核手撕 ForkJoinPool + WorkStealing + CompletableFuture 底层源码与大厂面试演练
面试·职场和发展
林希_Rachel_傻希希14 小时前
学React治好了我的焦虑症,1小时速通React 前20分钟。
前端·javascript·面试
西安邮电大学16 小时前
分治算法详细讲解
java·后端·其他·算法·面试
私人珍藏库16 小时前
【Android】BotHub-多模型AI机器人聚合库-内置免费模型
android·人工智能·智能手机·app·工具·多功能
普马萨特16 小时前
Wi-Fi 扫描频率限制与 Android 演进全解析
android