项目简介
我们要实现一个计算器的功能。
首先实现一个服务端,用于提供计算服务,供客户端去调用。它接受客户端提供的两个值,计算之后,返回两个数之和。
第二,实现客户端界面进行操作。
第三: 我们命名客户端和服务端。
第四:定义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);
}
}
注意事项
- 每次修改aidl文件都要编译一下程序。
- 两个模块都要安装在手机中,并且打开。这样才能调用服务端。