这里我们实现一个服务端计算,客户端显示计算结果的简单实例。
首先我们新建两个工程文件:Server和Client,这里两个工程可以不创建Layout文件,因为这个实例中没用到图形化界面。
在Server工程中,我们先要把目录结构由默认的Android改为Project,Android目录结构便于开发但是目录结构很不清晰,而一会儿为了让Client工程能够调用我们在Server工程中编写的服务则必须要将aidl目录整个拷贝到Client完全一样的位置,所以必须搞清楚到底在Server工程中的哪个位置创建了aidl文件。
选中main文件夹右击New一个AIDL File,Android Studio会自动创建一个aidl文件夹
这里我们将AIDL文件起名为CalculateInterface,然后开始编写这个CalculateInteface.aidl文件。这个文件本质上就是一个接口,在这个接口中定义我们准备实现的功能。
然后我们在Server工程中新建一个Java类(RemoteService.java),在这个Java类中,我们将实现之前在aidl文件中定义的函数
package com.example.a59129.server;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
public class RemoteService extends Service {
public RemoteService() {
} //constructor
@Override
public void onCreate() {
super.onCreate();
System.out.println("run");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return stub;
}
CaculateInterface.Stub stub = new CaculateInterface.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
@Override
public double add(double a, double b) throws RemoteException {
return a + b;
} //add()
@Override
public double subtract(double a, double b) throws RemoteException {
return a - b;
} //subtract()
@Override
public double multiply(double a, double b) throws RemoteException {
return a * b;
} //multiply()
@Override
public double divide(double a, double b) throws RemoteException {
return a / b;
} //divide()
};
} //class RemoteService
最后在manifest中注册一下这个service,服务端的编写工作就算结束了
接下来开始写客户端,打开Client工程,文件目录调成Project,将Server工程中的aidl文件夹整个复制粘贴到同样的目录下,这个地方必须一模一样,否则客户端将无法找到服务端提供的服务,这个工作一定要在Project目录结构下做,在Android目录结构下,天知道粘贴到哪儿去了。完成后最好把工程给Rebuild一下。
之后开始写Activity,在Acitivity中调用Server提供的实现加减乘除计算的函数,计算结果通过日志查看
package com.example.a59129.client;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.example.a59129.server.CaculateInterface;
public class ClientActivity extends AppCompatActivity {
private CaculateInterface calculateInterface;
@Override
public void setFinishOnTouchOutside(boolean finish) {
super.setFinishOnTouchOutside(finish);
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
calculateInterface = CaculateInterface.Stub.asInterface(iBinder);
try {
//调用计算服务,进行计算
double a = calculateInterface.add(1, 3);
double b = calculateInterface.subtract(3, 5);
double c = calculateInterface.multiply(2, 3);
double d = calculateInterface.divide(4, 2);
Log.e("加法", "the result is " + a);
Log.e("减法", "the result is " + b);
Log.e("乘法", "the result is " + c);
Log.e("除法", "the result is " + d);
} catch (RemoteException e) {
e.printStackTrace();
}
} //onServiceConnected()
@Override
public void onServiceDisconnected(ComponentName componentName) {
calculateInterface = null;
} //onServiceDisconnected()
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
Intent intent = new Intent();
intent.setAction("com.example.a59129.server.CalculateInterface.AIDL");
intent.setPackage("com.example.a59129.server");
bindService(intent, connection, BIND_AUTO_CREATE);
} //onCreate()
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
} //onDestroy()
} //class
这样一来服务端和客户端的工程就都完成了
我们先把Server运行起来:
然后运行Client,可以发现已经可以正确计算出结果:
附上两个工程文件的源码:
https://pan.baidu.com/s/1ewuwgzGu-HgQ_Ls_FG8f6A