添加系统服务

系统服务

系统服务都是继承Binder类或者根据aidl文件生成的stub类,如IFpService.stub,但由于stub也是继承Binder,因此可以说

系统服务都是继承Binder类(Binder可以进行跨进程通信)。

apk服务

apk服务是继承Service

添加自定义服务到ServiceManager中

可在自定义Application的onCreate()方法中添加

try {
	servicemanager = Class.forName("android.os.ServiceManager");
	final Method addservice = servicemanager.getMethod("addService", String.class, IBinder.class);
	mService = new FpService(context);
	addservice.invoke(null, SERVICE_NAME, mService.onBind(null));
} catch (final ClassNotFoundException ex) {
	throw new RuntimeException(ex);
}
  • 通过反射获取ServiceManager的addService方法

  • 初始化服务对象,并调用onBind()方法获取IBinder对象
    FpService为继承Service类的服务public class FpService extends Service
    并会重写方法onBind()

    @Override
    public IBinder onBind(final Intent intent) {
    return mStub;
    }

  • mStubIBinder对象,并实现了aidl中的方法,客户端apk可以跨进程调用aidl中定义的方法。

    private IFPService.Stub mStub = new IFPService.Stub() {
    @Override
    public int getInt() throws RemoteException {
    return 0;
    }
    }

  • addservice.invoke(null, SERVICE_NAME, mService.onBind(null));
    第一个参数为调用addservice方法的对象,由于此方法为静态方法,可以直接通过类名调用,因此没有对象调用,可以填null。
    第二个参数为添加进ServiceManager的服务的key值,通过此key值可以从ServiceManager获取对应的服务对象,在这里我设置SERVICE_NAME = “fpservice”
    第三个参数为要添加进ServiceManager的服务,必须是继承了Binder类的对象,由于mServiceonBind方法返回的mStubIBinder对象,因此可以添加入ServiceManager中。

从ServiceManager中获取自定义服务

可通过

getService = Class.forName("android.os.ServiceManager").getMethod("getService", new Class[]{String.class});
this.mService = Stub.asInterface((IBinder)getService.invoke(new Object(), new Object[]{"fpservice"}));
  • 通过反射获取ServiceManager的getService方法
  • getService.invoke(new Object(), new Object[]{"fpservice"})
    第一个参数为调用getService方法的对象,这里没有,可以传new Object()
    第二个参数为获取服务的key,由于在addservice时设置key为"fpservice",因此在这里填"fpservice"
  • 调用getService返回的是mStub,强转成IBinder类型,再通过Stub.asInterface方法生成aidl代理对象mService(IFPService类型),因此mService可直接调用getInt()方法。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值