AIDL使用详解(三) 客户端通过AIDL与服务端通信 实例项目

项目简介

我们要实现一个计算器的功能。
首先实现一个服务端,用于提供计算服务,供客户端去调用。它接受客户端提供的两个值,计算之后,返回两个数之和。
这里写图片描述
第二,实现客户端界面进行操作。

这里写图片描述

第三: 我们命名客户端和服务端。

第四:定义AIDL,连接客户端与服务端。

这里写图片描述

程序代码

程序实例代码

实现服务端

1. 定义aidl接口

我们接着上篇文章AIDL使用详解 (二)AndroidStudio中 创建 AIDL service继续,根据上篇文章创建aidl文件的步骤创建。然后修改代码:

// IMyAidlInterface.aidl
package com.kite.aidltest;

// Declare any non-default types here with import statements

interface IMyAidlInterface {

   //计算两个数之和
   int add(int num1, int num2);
}

修改之后,编译一下,Build ->make project.

根据官方文档:
这里写图片描述

2. 实现接口

我们定义好adil文件后,然后实现该接口。接下来创建一个service去实现服务端。

这里写图片描述

package com.kite.aidltest;

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

public class RemoteService extends Service {
    private static final String TAG = "RemoteService";

    public RemoteService() {
    }

    /**
     * 当客户端绑定该服务时 会执行以下代码,返回iBInder对象
     * @param intent
     * @return
     */
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    private IBinder iBinder = new IMyAidlInterface.Stub() {

        @Override
        public int add(int num1, int num2) throws RemoteException {
            Log.d(TAG, "add方法:收到了客户端的请求 ,输入的" +
                    "num1 ->" + num1 + "\n num2 ->" + num2);
            return num1 + num2;
        }
    };
}

3. 向客户端公开该接口

这也是实现客户端的步骤,请见实现客户端

实现客户端

新建aidl client 模块

新建一个aidl client 模块。详细步骤如图:

这里写图片描述

这里写图片描述

这里写图片描述

创建界面

修改该模块的activity_main 资源文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.kite.aidlclient.MainActivity">

   <EditText
       android:id="@+id/num1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="#ececec"/>

    <TextView
        android:id="@+id/add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:text="+" />
    <EditText
        android:id="@+id/num2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ececec"/>

    <TextView
        android:id="@+id/value"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:text="=" />

    <EditText
        android:id="@+id/result"
        android:inputType="none"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#eceaea"/>

    <Button
        android:id="@+id/toAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="哆啦A梦超能力(计算)"/>
</LinearLayout>

注意:客户端和服务端的adil文件必须一致(包名也必须一致),所以复制服务端的adil文件到adilclient中,然后编译程序。
然后修改 MainActivity

package com.kite.aidlclient;

import android.content.ComponentName;
import android.content.Context;
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.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.kite.aidltest.IMyAidlInterface;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private EditText num1;
    private EditText num2;
    private EditText result;

    private Button toAdd;

    IMyAidlInterface iMyAidlInterface;

    private ServiceConnection conn = new ServiceConnection() {
        //绑定上服务的时候
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //接受到了远程的服务
            Log.d(TAG, "onServiceConnected: ");
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);

        }

        // 当服务断开的时候调用
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.d(TAG, "onServiceDisconnected: ");
            //回收资源
            iMyAidlInterface = null;

        }
    };

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

        initView();

        bindServce();
    }

    private void initView() {
        num1 = (EditText) findViewById(R.id.num1);
        num2 = (EditText) findViewById(R.id.num2);
        result = (EditText) findViewById(R.id.result);

        toAdd = (Button) findViewById(R.id.toAdd);
        toAdd.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int number1 = Integer.valueOf(num1.getText().toString());
        int number2 = Integer.valueOf(num2.getText().toString());

        try {
            //调用远程服务
            int valueRes = iMyAidlInterface.add(number1, number2);
            result.setText(valueRes + "");
        } catch (RemoteException e) {
            e.printStackTrace();
            result.setText("error");
        }


    }

    private void bindServce() {
        //获取到服务端, 5.0 之后必须显示绑定服务
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.kite.aidltest", "com.kite.aidltest.RemoteService"));
        bindService(intent, conn, BIND_AUTO_CREATE);
        Log.d(TAG, "bindServce: bind on end");
    }

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

注意事项

  1. 每次修改aidl文件都要编译一下程序。
  2. 两个模块都要安装在手机中,并且打开。这样才能调用服务端。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值