android 源码阅读笔记之 Service

Service的源码中带有大量注释,其中声称service这个东西其实是一个意图简单的组件,主要的两个用途是:用于进行不与用户交互但需要长期保持在后台的操作、或可以共享给其他程序使用的本程序的一些功能。

Service的启动方式有两种,一种是在context中直接调用startService(), 这样未被创建的服务就会通过onCreate()创建,已创建的跳过,并马上调用onStartCommand()中的操作逻辑。但是有一个缺点是开启服务之后就与活动断开了联系。所以要一直保持服务与活动的信息交流,就需要使用bindService()进行启动,它同样可以创建未初始化的服务,但是不会调用onStartCommand()。为了完成服务于活动的通信,需要写一个Binder的子类作为Service中的一个内部类(这样较简便),然后在service的onBind()中返回一个binder实例,供活动对服务进行操作。而服务中则需要通过实例化并重写一个ServiceConnection类,使得bindService能绑定service并获取binder实例。

一个要注意的地方是,服务Service并不是一种线程,它是与其他组件一样运行在同一个主线程中的,因此如果其中的耗时操作达到一定限度(大约是20秒),就会出现ANR。所以一般在服务中的耗时操作都要在一个新开(spawn)的线程中进行。而android本身已经有一个范例,那就是继承自Service的IntentService。

停止服务的方法有两种,一种是在context中使用stopService(),另一种是在service内部的合适位置调用stopSelf()。而如果使用的事intentService,就不需要考虑这一点,只要重写onHandleIntent()完成想要完成的操作逻辑,执行完毕后会自动停止。

 service源码中确实是有onStart(),但是我们在使用service的时候重写的都是onStartCommand(),因为源码中前者被包装在了后者的方法体中,为了能根据模式产生int型返回值。这一功能暂时没有用到。

此外有一个ActivityManager的对象,用在了stopSelf()、startForeground()中,这个类中有一些对service进行操作的成员方法。

原文地址:https://www.cnblogs.com/jason31/p/9591820.html