项目用用到服务的地方有,但是用到使用远程服务的地方真不多;借着复习机会,撸一下AIDL,大体步骤如下,代码见下方
新建远程服务对应的Project,新建AIDL File
输入远程服务的名称,点击finish就会生成默认的aidl文件
同时在build/generated/source/aidl/debug/包/生成对应的.java文件
修改创建的.aidl文件,远程服务计算两个整数的和
点击菜单栏Build->Make Project 重新生成aidl对应的服务的java文件
生成了aidl对应的服务的java文件,如下图:
创建service
创建service并如下图实现:
在清单文件中为service添加隐式调用的action
MainActivity对应的界面中添加启动服务按钮,如下图:
至此,远程服务端代码就实现完了,下面实现客户端代码
创建客户端Project,并将服务端的aidl文件夹整个拷贝到客户端Project的main文件夹下;并Build->MakeProject
客户端界面放置"绑定服务"、“调用服务里的方法”、“解绑服务”,代码如下:
package com.test.aidltestclient;
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 com.test.aidltest.IMyAidlInterface;
public class MainActivity extends AppCompatActivity {
private IMyAidlInterface iMyAidlInterface;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent();
//由于是隐式启动Service 所以要添加对应的action,A和之前服务端的一样。
intent.setAction("com.test.aidltest.myService");
//android 5.0以后直设置action不能启动相应的服务,需要设置packageName或者Component。
intent.setPackage("com.test.aidltest"); //packageName 需要和服务端的一致.
}
public ServiceConnection serviceConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("RemoteService","远程服务绑定成功并获取到IBinder的子类对象");
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onBindingDied(ComponentName name) {
}
@Override
public void onNullBinding(ComponentName name) {
}
};
/**
* 绑定服务
* @param view
*/
public void bindService(View view) {
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
/**
* 调用服务里的方法
* @param view
*/
public void callMethodInService(View view) throws RemoteException {
int result = iMyAidlInterface.addition(1,2);
Log.d("RemoteService","调用了远程服务中的addition方法,结果为result="+result);
}
/**
* 解绑服务
* @param view
*/
public void unBindService(View view) {
unbindService(serviceConnection);
}
}
运行服务端APP
点击击"开启服务"按钮,日志如下
多次点击"开启服务"按钮,只会多次调用onStartCommand方法日志如下
运行客户端代码
点击客户端"绑定服务"按钮,会提示远程服务绑定成功并获取到IBinder的子类对象,日志如下:
现在就可以调用服务里的方法了,点击"调用服务里的方法"按钮,会调用远程addition方法,1+2=3 ,结果如下:
点击"解除绑定",远程服务中的onUnBind方法会回调,日志如下:
至此,绑定远程服务、调用远程服务中的方法、解除绑定都演示完毕了
源码见:下载地址