Android之Service(服务)

Service(服务)是Android四大组件之一。

1.定义:与Activity不同,服务是一个应用程序组件,它能够在后台执行一些耗时操作,并且不与用户交互(不提供用户界面)。它可以运行在它自己的进程中,也可以运行在其他应用程序的进程的上下文菜单中,这取决与自身的需要。其他的组件可以绑定到一个服务上,通过远程过程调用(RPC)来调用这个方法。

在manifest中声明服务

与activity(及其它组件)类似,你必须在应用程序的manifest文件中对所有的服务进行声明。要声明你的服务,把<service>元素作为子元素加入到<application>元素中去即可。例如:

<manifest ... >
  ...
  <application ... ><serviceandroid:name=".ExampleService"/>
      ...
  </application></manifest>

2.什么时候需要使用Service?

执行一些后台操作

拥有service的进程具有较高的优先级

官方文档告诉我们, Android 系统会尽量保持拥有service的进程运行,只要在该service已经被启动 (start) 或者客户端连接(bindService) 到它。当内存不足时,需要保持拥有service的进程具有较高的优先级。

3.Service的启动方式及对应的生命周期

在Service的生命周期中,比Activity的周期少一点,只有onCreate(),onStartCommand,onDestroy(),onBind(),onUnbind();通常有2种启动方式,但对生命周期影响是不同的。

①startService()

生命周期:onCreate()-----onStartCommand()------服务已经运行(Service is running)------onDestroy()

注:如果调用着自己直接退出而没有调用onStopService(),那么该服务就一直运行在后台。

②bindService()

生命周期:onCreate()-----onBind()------已经绑定服务---------onUnbind()-------onDestroy()

注:a.通过执行onBind(),调用者就与该服务绑定在一起了,若调用者退出,则该服务也会停止(Service会调用onUnbind()--onDestroy()).

         b.调用者绑定某个serevice后也可以解除绑定,调用UnbindService()来停止服务(Service会调用onUnbind()--onDestroy())。


说明:a.Service的onCreate()只会被调用一次,无论多少次执行startService或bindService,Service只会被创建一次。如果是先bind了,那么start的时候就会执行startCommand(),如果先start了,那么bind的时候就会直接调用onbind().

            b.如果service在运行期间调用了bindService,这时候在调用stopService(),此时service不会调用OnDestroy(),只能调用UnbindService()方法service才会被销毁。

            c .如果一个service通过startService start之后,多次调用startService 的话, service会多次调用onStart方法。多次调用 stopService 的话,
         d.service只会调用一次 onDestroyed 方法。
      e.如果一个service通过 bindService start之后,多次调用 bindService 的话, service只会调用一次onBind方法。
      f.多次调用 unbindService的话会抛出异常。
      g.在service中创建一个 handler 无限发送消息,那么该service无法通过 stopservice 停止,只有结束该进程才可以


4.创建一个Service

started服务是指其它组件通过调用startService()来启动的服务,这会引发对该服务onStartCommand()方法的调用。一旦服务被启动started,它就拥有了自己的生命周期,这是独立于启动它的组件的。并且它能够在后台一直运行下去,即使启动它的组件已被销毁 也是如此。 因此,服务应该能够在完成工作后自行终止,通过调用stopSelf()即可,或者由其它组件通过调用stopService()也可以。诸如activity之类的应用程序组件,可以通过调用startService()启动服务,并传入一个给出了服务和服务所需数据的Intent对象。服务将在onStartCommand()方法中接收到该Intent对象。举个例子,假定某activity需要把一些数据保存到在线数据库中。此activity可以启动一个守护服务并通过传入startService()一个intent把需要保存的数据发送给该服务。该服务在onStartCommand()内接收intent,连接Internet,再进行数据库事务处理。当事务完成后,服务自行终止,并被系统销毁。

警告:默认情况下,运行服务的进程与应用程序的相同,并且运行在应用程序的主线程中。 因此,如果你的服务要执行计算密集或阻塞的操作,而同时用户又需要与同一个应用程序中的activity进行交互,那么服务将会降低activity的性能。 为了避免对应用程序性能的影响,你应该在服务中启动一个新的线程。

传统做法,你可以扩展两个类来创建started服务:

Service 这是所有服务的基类。如果你要扩展该类,则很重要的一点是:请在其中创建一个新的线程来完成所有的服务工作。 因为服务默认是使用应用程序的主线程的,这会降低应用程序中activity的运行性能。
IntentService 这是 Service类的子类,它使用了工作(worker)线程来处理所有的启动请求,每次请求都会启动一个线程。 如果服务不需要同时处理多个请求的话,这是最佳的选择。 所有你要做的工作就是实现 onHandleIntent()即可,它会接收每个启动请求的intent,然后就可在后台完成工作。

扩展IntentService类

因为大多数started服务都不需要同时处理多个请求(这实际上是一个危险的多线程情况),所以最佳方式也许就是用IntentService类来实现你的服务。

IntentService将执行以下步骤:

创建一个缺省的工作(worker)线程,它独立于应用程序主线程来执行所有发送到onStartCommand()的intent。

创建一个工作队列,每次向你的onHandleIntent()传入一个intent,这样你就永远不必担心多线程问题了。在处理完所有的启动请求后,终止服务,因此你就永远不需调用stopSelf()了。提供缺省的onBind()实现代码,它返回null。提供缺省的onStartCommand()实现代码,它把intent送入工作队列,稍后会再传给你的onHandleIntent()实现代码。以上所有步骤将汇成一个结果:你要做的全部工作就是实现onHandleIntent()的代码,来完成客户端提交的任务。(当然你需要为服务提供一小段构造方法。)


5. service是否在 main thread 中执行 , service 里面是否能执行耗时的操作 ?
默认情况 , 如果没有显示的指定service所运行的进程 , Service activity是运行在当前 app 所在进程的 main thread(UI 主线程 ) 里面
service里面不能执行耗时的操作 ( 网络请求 , 拷贝数据库 , 大文件 ), 需要在子线程中执行new Thread(){}.start();可以使用 IntentService
特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,
service在另外的进程中执行 <service android:process="cn.itcast.xxx"></service>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值