Android应用多进程通讯(一)

本文深入探讨了Android应用中多进程通信的实现方法,重点介绍了Messenger和AIDL两种通信方式。Messenger适用于同一应用内的进程间通信,而AIDL则用于跨应用的进程间通信,详细解析了它们的使用场景及具体实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android应用多进程通讯

(1)实现:AndroidManifest中声明process属性,指定组件进程

 : 开头,为当前应用子进程(私有进程)
 小写字母开头,其他应用可用

(2)进程间通讯:

  • Messager

使用场景:
同个应用中的多进程时使用

使用方法:

创建获取服务端,客户端的Messager对象
	服务端: Service
Messager messagerServer = new Messager(handler)
Messager messagerClient = message.replyTo;
	客户端: Activity
Messager messagerClient = new Messager(handler)
message.replyTo = messagerClient;
messagerClient.sendMessage(message)
messagerServer = new Messager(binder);


code:
	service:
		public class ProcessService extends Service{
		
		    private Messenger messengerServer;
		    private Messenger messengerClient;
		    private Handler serverHandler;
		
		    static class Handler extends android.os.Handler {
		        private WeakReference<ProcessService> instance;
		        public Handler (ProcessService processService) {
		            instance = new WeakReference<>(processService);
		        }
		
		        @Override
		        public void handleMessage(Message msg) {
		            super.handleMessage(msg);
		            instance.get().handleMessage(msg);
		        }
		    }
		
		    public void handleMessage(Message msg) {
		        messengerClient = msg.replyTo;//获取客户端Messenger
		    }
		
		    @Nullable
		    @Override
		    public IBinder onBind(Intent intent) {
		        serverHandler = new Handler(this);
		        messengerServer = new Messenger(serverHandler);//创建服务端Messenger
		        return messengerServer.getBinder();
		    }
		}
	
	Client:
		public class MainActivity extends Activity {

		    private Messenger messengerServer;
		    private Messenger messengerClient;
		    private Handler clientHandler;
		    static class Handler extends android.os.Handler {
		        WeakReference<MainActivity> instance;
		        public Handler (MainActivity instance) {
		            this.instance = new WeakReference<>(instance);
		        }
		
		        @Override
		        public void handleMessage(Message msg) {
		            super.handleMessage(msg);
		            if (instance != null) instance.get().handleMessage(msg);
		        }
		    }
		
		    public void handleMessage(Message msg) {
		
		    }
		
		    @Override
		    protected void onCreate(Bundle savedInstanceState) {
		        super.onCreate(savedInstanceState);
		        setContentView(R.layout.activity_main);
		        clientHandler = new Handler(this);
		        messengerClient = new Messenger(clientHandler);//客户端Messenger
		        bindService(new Intent(this, ProcessService.class), serviceConnection, BIND_AUTO_CREATE);
		    }
		
		    private ServiceConnection serviceConnection = new ServiceConnection() {
		        @Override
		        public void onServiceConnected(ComponentName name, IBinder service) {
		            messengerServer = new Messenger(service);//获取服务端Messenger
		            sendMsg();
		        }
		
		        @Override
		        public void onServiceDisconnected(ComponentName name) {
		            messengerServer = null;
		        }
		    };
		
		    @Override
		    protected void onResume() {
		        super.onResume();
		    }
		
		    public void sendMsg () {
		        if (messengerServer != null) {
		            Message message = Message.obtain();
		            message.replyTo = messengerClient;
		            message.what = 11;
		            try {
		                messengerServer.send(message);
		            } catch (RemoteException e) {
		                e.printStackTrace();
		            }
		        }
		    }
		}
  • AIDL

    使用场景: 多个应用进程间通讯

    使用方法:

      服务端
      
      (1)对应包名下new  aidl 文件,会在aidl文件夹下生成对应包名的aidl文件
    
      (2)build 项目,在build-- generated--source -- aidl --debug下生成对应的java文件
    
      (3)服务端实现AIDL.Stub   实现aidl文件中定义的接口方法
      
       (4) 服务端远程服务中onbind方法返回 stub.asBinder()
    
      客户端
      
      (1)建立相同包名的aidl文件
      
      (2)bind启动远程服务
      	bindService(new Intent(this, AidlService.class)
          	,serviceConnection, Context.BIND_AUTO_CREATE);
      
      (3)ServiceConnection 中获取AIDL对象,调用aidl接口中定义的方法,code:
    
      	IMyAidlInterface aidl;
          private ServiceConnection serviceConnection = new ServiceConnection() {
              @Override
              public void onServiceConnected(ComponentName name, IBinder service) {
                  aidl = (IMyAidlInterface) service;
              }
      
              @Override
              public void onServiceDisconnected(ComponentName name) {
      
              }
          };
    

    Messager底层封装的也是AIDL的调用方法;

    AIDL是一种代理模式。通过代理远程对象,调用对象的方法,实现进程间的通讯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值