service启动的两种方式和IntentService

启动一个service有两种方式:

  • 通过Context的startService()方法:通过该方法启动service,访问者与service之间没有关联,即使访问者退出了,Service仍然正常运行。
  • 通过Context的bindService()方法:使用该方法启动service,访问者与Service绑定在一起,访问者一旦退出,Service也就终止。

 

 

Caution:一个service运行在宿主进程的主线程中——service不创建自己的线程,并且不运行在一个单独的进程中。意思就是说,如果你的service打算做一些使用cpu密集的工作或者阻塞的操作(例如MP3播放或者网络操作),你必须创建一个新的线程去做一些工作。使用一个单独的线程,你可以减少出现ANR的几率,并且应用的主线程可以专注于和用户交互。

 

 

上面说了,在service线程是在主线程中运行的,所以不能执行耗时任务,如果要执行耗时任务可以在onStartCommand方法中启动一个子线程,其实service还提供了另一个方案,那就是IntentService,他是Service的子类。下面翻译一些官方的文档,对IntentService做个介绍。

 

IntentService  是Service的子类,他使用一个工作线程去处理所有的请求,每次处理一个。如果你不需要大量的同步请求,这是一个非常好的选项。你要做的就是实现onHandleIntent()方法,他接受intent请求,并在后台线程中处理。

 

IntentService做一下的事情:

  • 创建一个默认的工作线程,来处理所发送到onStartCommand() 的intent请求,并且和你的主线程分开。
  • 创建一个工作队列,并每次传送一个intent到onHandleIntent()方法,所以,你从来不用担心多线程的问题。
  • 到任务执行完成,service自动停止,所有你从来不用调用 stopSelf().方法
  • 提供onBind()的默认实现,并返回null。
  •  提供onStartCommand() 方法的默认实现,并把intent传递给工作队列,然后发送给onStartCommand(),。

关于onStartCommand() 方法的返回值:

此方法的返回值一定是一个整数,系统根据这个值来决定当onStartCommand() 方法执行完成后,系统由于某种原因关闭服务后将如何处理。返回值为如下几个:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值