使用本地服务
一丶定义java接口
public interface CalculateI {
int addab(int a, int b);
}
二丶创建一个Binder子类,继承Binder并实现接口方法
public class CalculateBinder extends Binder implements CalculateI{
@Override
public int addab(int a, int b) {
return a+b;
}
}
三丶在Service里的Onbind,返回新建的Binder子类
@Override
public IBinder onBind(Intent intent) {
return new CalculateBinder();
}
四丶在Activity里绑定Service
Intent serviceintent = new Intent(SERVISE_INTENT);
serviceintent.setPackage(getPackageName());
bindService(serviceintent, serviceConnection, BIND_AUTO_CREATE);
- 其中Intent需要setPackage
- ServiceConnection在connect的时候要直接转换service对象为IBinder子类
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
calculateBinder = (CalculateBinder) service;
}
五丶使用IBinder对象实现功能
calculateBinder.addab(8, 4);
六丶AndroidManifest.xml配置
<service
android:name=".CalculateServie"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="xxxxx.action.open.calculateservice" />
</intent-filter>
</service>
远程服务的使用
一丶定义AIDL接口,文件名后缀为aidl
interface ICalculateInter {
int addab(int a, int b);
}
二丶创建IBindler子类,继承的是ICalculateInter.Stub
public class CalculateBinder extends ICalculateInter.Stub{
@Override
public int addab(int a, int b) {
return a+b;
}
}
三丶在Service里的Onbind,依然返回新建的Binder子类
@Override
public IBinder onBind(Intent intent) {
return new CalculateBinder();
}
四丶在Activity里绑定Service
//这时的onServiceConnected会有不同
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iCalculateInter = ICalculateInter.Stub.asInterface(service);
}
五丶使用IBinder对象实现功能,需要捕捉RemoteException
try {
iCalculateInter.addab(8, 4);
} catch (RemoteException e) {
e.printStackTrace();
}
六丶AndroidManifest.xml配置,注意此时Service运行在单独的process进程里
<service
android:process="com.example.xxxxxxx"
android:name=".CalculateServie"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="xxxxx.action.open.calculateservice" />
</intent-filter>
</service>
ICalculateInter.Stub指的是什么?
在创建aidl接口文件后,编译会自动生成一个类,这个类就是ICalculateInter.java
public interface ICalculateInter extends android.os.IInterface
{
public static abstract class Stub extends android.os.Binder implements com.example.xxxx.ICalculateInter{
//省略内容
public static ICalculateInter asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
}
public int addab(int a, int b) throws android.os.RemoteException;
}
ICalculateInter 有个内部抽象类Stub,这个Stub继承了Binder也实现了ICalculateInter.aidl里的接口,
这里和前面我们绑定本地服务是一样的写法。