Binder之AIDL进程间通信的使用(附源码)

废话不多说,先看代码,再讲原理。
首先我们先搞两个进程出来,一个作为客户端(client)一个作为服务端(service)。

在客户端和服务的分别创建一个AIDL接口,可以用如下方式进行创建,需要注意的是,两端创建的接口必须保证完全一致,包括他们的包名,这里的包名可能需要手动去修改一下,不一致的话运行时会抛出如下异常 “Binder invocation to an incorrect interface” 。
在这里插入图片描述
创建完接口之后我们点击一下下面这个锤子,来打造一下这个工程,这样在build目录下就会自动生成我们需要的文件了。

在这里插入图片描述
在这里插入图片描述

我的AIDL接口是这么定义的:

interface IMyAidlInterface {
    void sendMessage(in String msg);
    String getMessage();
}

定义完接口之后我们去服务端启动一个服务,直接在MainActivity里启动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startService(new Intent(this, AiService.class));
    }
}

service的内容也很简单,直接在onBind的时候处理就好了

public class AiService extends Service {

    private static final String TAG = "AiService";

    private String message;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return iBinder;
    }

    private IBinder iBinder = new IMyAidlInterface.Stub() {
        @Override
        public void sendMessage(String msg) throws RemoteException {
            message = "  "+msg +"  " + "被service处理了";
            Log.d(TAG, "sendMessage: "+msg);
        }

        @Override
        public String getMessage() throws RemoteException {
            Log.d(TAG, "getMessage: "+message);
            return message;
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }
}

做完这些服务端就完成了,不要忘记在清单文件中添加我们的服务,并设置可以为其他进程所利用

        <service android:name=".service.AiService"
            android:exported="true"/>

接下来我们来写客户端,直接一个在activity使用,这个代码结构就非常简单了,我们在这个进程中发送一个字符串,然后在service进程对这个字符串处理,处理完成后我们再获取处理后的字符串,实现一个这么简单的功能。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private IMyAidlInterface myAidl;

    private Button bt;
    private TextView tv;
    private EditText et;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        bindService();
    }

    private void initView() {

        bt = (Button)findViewById(R.id.button);
        tv = (TextView)findViewById(R.id.message);
        et = (EditText)findViewById(R.id.et_1);

        bt.setOnClickListener(v -> {
            Log.d(TAG, "initView: bt按了" );
            try {
                myAidl.sendMessage(et.getText().toString());
                tv.setText(myAidl.getMessage());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        });

    }

    private void bindService() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.tiancong.myaidl1","com.tiancong.myaidl1.service.AiService"));

        bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected: ");
            myAidl = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myAidl = null;
        }
    };
}

运行结果:

在这里插入图片描述
这样我们就完成了进程间的通信。下面附上源码,如果对AIDL的使用还有什么不理解欢迎关注我的微信公众号,我们来一起进行讨论。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值