Android 使用本地服务与使用远程服务

使用本地服务

一丶定义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);
  1. 其中Intent需要setPackage
  2. 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里的接口,
这里和前面我们绑定本地服务是一样的写法。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值