Service

1、跨进程Messager 多应用间单线程

把Messenger比喻为一个信使,信使的作用是派信;那么Message就比喻为信件、信封,即信使派的东西;那么Bundle是什么呢?Message里面保存了Bundle,那么bundle可以比喻为信纸,信纸上写满了各种我们要传递的信息。读到这里,读者应该明白了这三者在Messenger通讯方式内所扮演的角色了。简单来说:Messenger把装有Bundle的Message发送到别的进程。
###客户端
private Messenger clientMessenger = new Messenger(handler);
private Handler handler = new Handler(Looper.getMainLooper()){
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        Bundle bundle = msg.getData();
        Log.i(TAG,"收到远程服务数据:"+bundle.getString("service"));
    }
};

private void bindRemoteService(){
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.example.xxx",
            "com.example.xxx.MessengerService"));
    boolean isBind = bindService(intent,conn, Service.BIND_AUTO_CREATE);
    Log.i(TAG,"bindRemoteService isBind="+isBind);
}
private Messenger messengerProxy;
ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder iBinder) {
        Log.i(TAG,"onServiceConnected:");
        messengerProxy = new Messenger(iBinder);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.i(TAG,"onServiceDisconnected:");
    }
};

private void sendData(){
    if (messengerProxy == null) return;
    Message message = new Message();
    message.replyTo = clientMessenger;
    Bundle bundle = new Bundle();
    bundle.putString("client","这是客户端发送数据:"+messageid);
    message.setData(bundle);
    messengerProxy.send(message);
   }

###服务端
//创建服务端Messenger
private final Messenger mMessenger = new Messenger(messengerHandler);

@Override
public IBinder onBind(Intent intent) {
    //向客户端返回IBinder对象,客户端利用该对象访问服务端
    return mMessenger.getBinder();
}
  //拿到客户端的message 发送消息     
  private  Handler messengerHandler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        //取出客户端的消息内容
        Bundle bundle = msg.getData();
        String clientMsg = bundle.getString("client");
        Log.i(TAG, "来自客户端的消息:" + clientMsg);
        //新建一个Message对象,作为回复客户端的对象
        Message message = Message.obtain();
        Bundle bundle1 = new Bundle();
        bundle1.putString("service", clientMsg+",服务端收到");
        message.setData(bundle1);
        try {
            msg.replyTo.send(message);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
};  

2、AIDL 多应用间多线程


参数定向tag

image.png
image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 只有 Activity、服务和内容提供程序可以绑定到服务 — 您无法从广播接收器绑定到服务。 1:Service和...
    夏广成阅读 3,833评论 0 0
  • 本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇。主要目的是:通过Service来执行图片压缩任...
    laogui阅读 9,901评论 5 62
  • 概要:介绍绑定服务端的三种方式:同一进程绑定服务、跨进程绑定服务(Messenger)、跨进程绑定服务(aidl)...
    aimaile阅读 4,697评论 2 1
  • 【Android Service】 Service 简介(★★★) 很多情况下,一些与用户很少需要产生交互的应用程...
    Rtia阅读 8,349评论 1 21
  • Android学习的第一步从四大组件开始 在四大组件中Activity和Service应该算的上是一对亲兄弟了,两...
    总是一点点阅读 3,902评论 0 0

友情链接更多精彩内容