AIDL+Messenger通信

AIDL

一.AIDL简介
AIDL,全称是Android Interface Define Language,即安卓接口定义语言,可以实现安卓设备中进程之间的通信(Inter Process Communication, IPC)。安卓中的服务分为2类:本地服务(网络下载大文件,音乐播放器,后台初始化数据库的操作);远程服务(远程调用支付宝进程的服务。。)
二.AIDL的使用
假设有如下场景,需要计算a+b的值,在客户端中获取a和b的值,然后传递给服务端,服务端进行a+b的计算,并将计算结果返回给客户端。
这里的客户端和服务端均是指安卓设备中的应用,由于每一个应用对应一个进程,由此可以模拟安卓系统中通过AIDL进行进程之间的通信。
三 .使用步骤
服务端moudle:aidl_server
(1)将as切换到Project下,按照如图所示创建文件夹命名为aidl,在aidl文件夹下创建aidl文件,命名为IMyAidlInterface.aidl
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)在服务端中新建一个类,继承Service,在其中定义一个IBinder类型的变量iBinder,引用上述接口IMyAidlInterface.java类中的Stub类对象,实现其中的add方法,在Service的onBind方法中,返回iBinder变量。最终代码如下:

package com.example.day17_aidl_service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class My_Service extends Service {
   IBinder binder = new IMyAidlInterface.Stub() {
       @Override
       public int add(int num1, int num2) throws RemoteException {
           return num1+num2;
       }
   };
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
}

(5)清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报
java.lang.SecurityException: Not allowed to bind to service Intent 异常。

        <service android:name=".My_Service" android:exported="true">
            <intent-filter>
                <action android:name="com.xxs.1602"></action>
            </intent-filter>
        </service>

客户端moudle:aidl_client

package com.example.day17_aidl_client;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.example.day17_aidl_service.IMyAidlInterface;

public class MainActivity extends AppCompatActivity {
    ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            final IMyAidlInterface iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
            try {
                 int add = iMyAidlInterface.add(9, 8);
                Toast.makeText(MainActivity.this, ""+add, Toast.LENGTH_SHORT).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setAction("com.xxs.1602");
        intent.setPackage("com.example.day17_aidl_service");
        bindService(intent,serviceConnection,BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(serviceConnection);
    }
}

Messager

一.Messager介绍
Messager,故名思义信使的意思,能够完成跨进程通信。

二.Messager的原理

Messager的2个构造方法:分别以handler和Ibinder为参数
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}

我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。

特点:
客户端和服务端发送的都是message
使用handler接受消息(客户端和服务端都是)
不需要编写aidl文件
三 .使用步骤
服务端moudle:messager_server

package com.example.day17_messager_service;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.*;
import android.widget.Toast;

public class My_Message_Service extends Service {

    @SuppressLint("HandlerLeak")
    Messenger messenger = new Messenger(new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle data = msg.getData();
            String name = data.getString("name");
            String hobby = data.getString("hobby");
            Toast.makeText(My_Message_Service.this, "姓名:"+name+"爱好:"+hobby, Toast.LENGTH_SHORT).show();
             Messenger replyTo = msg.replyTo;
            Message message = new Message();
            Bundle bundle = new Bundle();
            bundle.putString("name","张金伟");
            bundle.putString("hobby","成为一个木头");
            message.setData(bundle);
            try {
                replyTo.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    });
    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}

package com.example.day17_messager_client;

import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.*;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    @SuppressLint("HandlerLeak")
    Messenger my_messenger = new Messenger(new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle data = msg.getData();
            String name = data.getString("name");
            String hobby = data.getString("hobby");
            Toast.makeText(MainActivity.this, "姓名:"+name+"爱好:"+hobby, Toast.LENGTH_SHORT).show();
        }
    });
    Messenger messenger;
    ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
              messenger = new Messenger(service);
             Message message = new Message();
             Bundle bundle = new Bundle();
             bundle.putString("name","王震");
             bundle.putString("hobby","成为一个像旭哥一样的程序猿");
             message.setData(bundle);
            message.replyTo = my_messenger;
            try {
                messenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent();
        intent.setAction("com.bawei.1602");
        intent.setPackage("com.example.day17_messager_service");
        bindService(intent,serviceConnection,BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(serviceConnection);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MX_XXS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值