Forver.微笑

面带微笑未必真的开心,但笑起的那一刻,心中的那些不开心的事已经不重要了~

0%

service基础

Activity是Android四大组件之一,主要用于处理没有UI的后台计算任务。

Service特点

  • 与调用者在同一进程;
  • 运行在主线程,如需进行耗时操作,需要开启线程;
  • 多个Activity都可以控制同一个Service,而系统只会创建一个Service。

2种启动方式

1.Start方式

步骤

  • 定义一个继承Service的子类
  • manifest.xml文件中配置service
  • 使用context的startService(Intent)方法启动service
  • 不再使用时,调用stopService(Intent)方法停止服务

生命周期

  • onCreate() -> onStartCommand() -> onDestory()
  • 启动Service:context.startService,如果服务已开启,不调用onCreate, 而是会调用onStart()或者onStartCommand()
  • 停止Servcie:context.stopService

特点
一旦服务开启就跟调用者(开启者)没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行,开启者不能调用服务里面的方法。不能的到开启者实例,因此不能与开启者直接交互

2.Bind方式

步骤

  • 定义一个继承Service的子类
  • manifest.xml文件中配置service
  • 使用context的bindService(Intent ,ServiceConnection,int)方法启动service
  • 不在使用时,调用unbindService(ServiceConnection) 方法停止服务

生命周期

  • onCreate() -> onBind() -> onUnbind() -> onDestory()
  • 启动Service:context.bindService,绑定服务不会调用onStart()或者onStartCommand()
  • 停止Servcie:context.unbindService

特点
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。绑定者可以调用服务里面的方法。

IntentService

用法

  • 定义类继承IntentService的子类,实现父类的onHandleIntent
  • 在配置文件注册service
  • 启动Service

特点

  • 是继承自Service的抽象类。
  • 用于处理客户端发送来的startService请求,onIntent每次处理一个startService发送来的请求。
  • IntentService会启动一个线程去处理客户端发送来的请求,因此可以处理耗时操作。
  • 内部维护了HandlerThreadLooperHandler实现,维护了自己的消息队列。
  • onHandlerIntent执行完成后,IntentService会尝试自动停止,直到最后一个消息被处理会真正自动停止。
  • 拥有较高的优先级,不容易被杀死(待考证)

HandlerThread

  • 是一个线程对象,继承了Thread类
  • 其内部封装创建好了Looper和MessageQuene
  • 通过HandlerThread可以实现UI和子线程的通信
  • HandlerThread不需要使用时需要手动回收