Android framework 系统服务和应用服务的区别

慕课网 android framework 笔记

 

2-4 系统服务和bind的应用服务有什么区别?

为什么专门提到的bind的应用服务?因为它与系统服务更有可比性

 

考察:

启动方式的区别

注册方式的区别

使用方式的区别

 

1,启动方式的区别

1)系统服务的启动,

系统服务大部分跑在system server里,也是在它里面启动的,

在system server启动时顺便把服务都启动了

如AMS ,WMS,PMS都在system server里面

private void run(){
    ...
    startBootstrapService();
    startCoreService();
    startOtherServices();
    ...
}

 

启动服务不一定是要启动工作线程,其实大部分服务都是跑在binder线程的,少部分才有自己的工作线程。

所以启动服务是什么意思?主要是做服务的init工作,如准备服务的binder实体对象,

当client有请求,就会在binder线程池里把请求分发给对应的binder实体对象处理,再回复给client

 

 

还有一些服务不在system server里面,它自己开了一个进程,

这种服务一般是native实现的,有自己的main入口函数,需要自己启用binder机制,管理binder通信,复杂一些,

但是一样的,它也要有binder实体对象,binder线程,binder线程等待client请求,再分发给binder实体对象。

 

2)应用服务的启动

无论是start service,还是bind service,都是从应用端发起的

请求会调到AMS里面,

ComponentName startServiceCommon(Intent service, ..){
    ....
    //拿到AMS的binder对象,startSetvice是IPC调用,它里面会创建ServiceRecord,
    //ServiceRecord只是service的记录,AMS只是负责service的管理和调度,service的启动和加载还是要在AP端做的
    ActivityManagerNative.getDefault().startService(...);
}

 

AP端怎么启动和加载service,前面讲过

private void handleCreateService(CreateServiceData data){
    //通过loadClass加载service的类,newInstance给service创建对象
    Service service = (Service)cl.loadClass(data.info.name).newInstance();
    //给service创建上下文
    ContextImpl context = ContextImpl.createAppContext(this, ..);
    //create application
    Application app = packageInfo.makeApplication(false, ...);
    //attach service
    service.attach(context, this, ...);
    //执行声明周期回调
    service.onCreate();
}

 

2,注册方式的区别

1)系统服务的注册

//跑在system server进程,java层实现
pubic void setSystemProcess(){
    ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
    ..
}
//跑在单独进程,native层实现
int main(int, char**){
    sp<IServiceManager> sm(defaultServiceManager());
    sm->addService(String16(SurfaceFlinger::getServiceName(), flinger, false));
}

 

无论是在sysemserver进程,还是单独进程,都要在service manager注册服务,

 

另外注意,不是随便什么binder实体对象,都能注册到service manager,

实验,给AP段的binder实体对象注册到service manager,肯定提示权限错误,因为只有系统服务可以注册到service mananger

 

2)应用服务的注册

 

 

应用端向AMS发起binderService调用,

AMS看service注册过没有,注册过直接把binder的service对象返回给应用。

若没有,AMS去请求binder对象,Service响应请求,把自己的binder对象注册到AMS,AMS再把binder对象回调给AP

 

所以AP的注册不像系统服务,在启动时注册,

AP服务首先要由应用来bindService,还要AMS专门去请求下,是典型的被动注册

 

3,使用方式的区别

1)系统服务的使用

//通过context的getSystemService(),传入名字,查到服务的管理对象
PowerManager pm  = context.getSystemService(Context.POWER_SERVICE);
//调用对象的接口函数使用系统服务
PowerManagfer.WakeLock = pm.newWakelock(Flags. TAG);

 

看下getSystemService的实现

registerService(Context.POWER_SERVICE, PowerManager.class,
//先找到Service对应的serviceFetcher,再通过Fecher拿到服务的管理对象
    new CachedServiceFetcher<PowerManager>(){
        @Override
        public PowerManager createService(ContextImpl ctx){
            //先通过service manager的getService函数获取系统服务的binder对象
            IBinder b = ServiceManager.getService(Context.POWER_SERVICE);
            //用对象封装了一层服务的管理对象再传给AP层,方便应用层调用
            IPowerManager service = IPowerManager.Stub.asInterface(b);
            return new PowerManager(ctx.getOuterContext(),..);
        }
    }
    );

2)应用服务的使用

通过bind service向AMS发送绑定服务的请求

之前的课讲过bind service的原理,这里不讲了

bindService(serviceIntent, new ServiceConection(){
    @Override
    //AMS通过onServiceConnected回调,把服务的IBinder对象返回给AP端,
    public void onServiceConnected(ComponentName name, IBinder service){
        //把binder对象service封装一层业务接口对象,就可以持有对象向AP服务发起调用了
        IMyInterface myInterface = IMyInterface.Stub.asInterface(service);
    }

})

回到问题,系统服务和binder的应用服务有什么区别。

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值