服务端的实现
步骤:
1、在AndroidStudio中创建AIDL文件,并且在这个文件中创建你想暴露给外部的方法,`package com.example.lpjxlove.aidl_practice;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
String getName();//自定义方法
}
`
编译运行程序。编译成功后,会自动生成一个AIDL的.Java文件,如图:
2、新建一个Service,并创建一个继承IMyAidlInterface.stub的binder类型的内部类,并且实现AIDL文件中自定义的方法。(静态启动Service别忘记在Mainifests中注册service并写明service的Action)
`public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
}
public class MyBinder extends IMyAidlInterface.Stub{
//实现自定义方法
@Override
public String getName() throws RemoteException {
return "你好啊";
}
}
}`
至此,服务端已经完成了!
客户端的实现
步骤:
1.新建一个包,使其名字与服务端存放Aidl文件的包名一致,然后复制服务端生成的AIDL的Java文件至客户端的包中。
2.在你想调用服务端服务的地方,调用服务端。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button;
private IMyAidlInterface iMyaidlinterface;
private String Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
assert button != null;
button.setOnClickListener(this);
Intent intent=new Intent("com.example.lpjxlove.aidl_practice.Myservice");//
intent.setPackage("com.example.lpjxlove.aidl_practice");//5.0后要设置包名
bindService(intent,conn,BIND_AUTO_CREATE);
}
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyaidlinterface=IMyAidlInterface.Stub.asInterface(service);
try {
Name=iMyaidlinterface.getName();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View v) {
if (iMyaidlinterface==null){
Toast.makeText(MainActivity.this, "空的!", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, ""+Name, Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
*使用AIDL需要注意的地方:***1、客户端和服务端的包名必需相同
2、在android5.0以后要静态调用Service必须设置 intent.setpackage()方法。