Android学习笔记:服务(Service)

一、概念

  • 服务是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务(服务是一个运行在后台没有用户界面的组件,用于执行耗时操作)。
  • 服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常执行。
  • 服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖于该进程的服务也会停止执行(服务运行于宿主进程的主线程中,既不创建自己的线程也不运行在单独的进程中(除非明确指定))。
  • 服务并不会自动开启线程,所有的代码都是运行在主线程当中。因此,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞的情况。
  • 服务都是需要在AndroidManifest.xml里注册的。

二、方法

1、4个手动调用方法
  • startService():启动服务
  • stopService():关闭服务
  • bindService():绑定服务
  • unbindService():解绑服务
2、5个自动调用方法
  • onCreate():创建服务,在服务创建的时候调用。
  • onStartCommand():开始服务,在服务每次启动的时候调用。
  • onDestroy():销毁服务,在服务销毁的时候调用。
  • onBind():绑定服务,Service中唯一个抽象方法,必须在子类中实现。
  • onUnbind():解绑服务。
3、Service的启动方法
  • 调用startService()启动
    这种方式启动的Service会长期在后台运行,即使启动它的应用组件已经被销毁,该服务还是会运行。若资源不足时,则服务可能被杀死;当资源足够时,服务又会被重新启动。
  • 调用bindService()启动
    这是一种“绑定”状态的Service,绑定的Service只有当应用组件绑定后才能运行,多个组件可以绑定一个Service,被绑定服务的生命周期会跟调用者关联起来,调用者退出,服务也会跟着被销毁。通过绑定服务,可以间接调用服务内部的方法(借助onBind()方法返回IBinder实现类)。当调用unbind()方法时,该Service就会被销毁。

这两种启动服务方式的区别是,通过调用startService()方法启动的服务不能调用服务内部的方法。通过调用bindService()方法启动服务,可以通过一个调用者调用服务内部的方法

(1)当Service组件处于启动状态时,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。
(2)当Service组件处于绑定状态时,这个时候Service内部同样可以进行后台计算,但是处于这种状态时,外界可以很方便地和Service组件进行通信。

4、服务的混合开启模式

(1)startService()→bindService()→stopService()→unbindService()→ondestroy()
开启服务→绑定服务→结束服务(服务不停)→解除绑定(服务停止)

(2)startService()→bindService()→unbindService()→stopService()
开启服务→绑定服务→解绑服务(此服务还继续运行)→结束服务(不用时,再停止服务)

混合开启服务的方式既保证了服务可以长期在后台运行,又可以让调用者远程调用服务中提供的方法。


三、生命周期

①Un Bounded Service

一旦在项目的任何位置调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没被创建过,onCreate()方法会先于onStartCommand()方法执行。服务启动了之后会一直保持运行状态,直到stopService()或stopSelf()方法被调用。注意,虽然每调用一次startService()方法,onStartCommand()就会执行一次,但实际上每个服务都只会存在一个实例。所以不管调用多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止下来。

start多次,onCreate只会被调用一次,onStart会调用多次,该service会在后台运行,直至被调用stopService或是stopSelf。

②Bounded Service

调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。如果这个服务还没有被创建过,onCreate()方法会先于onBind()方法执行,之后,调用方法可以获取到onBind()方法里返回的IBinder对象的实例,这样就能自由地和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。

不管调用bindService()几次,onCreate()只会调用一次,onStart()不会被调用,建立连接后,Service会一直运行,直到调用unBindService或是之前调用的bindService的Context不存在了,系统会自动停止Service,对应的onDestory会被调用。

③混合开启

当调用了startService()方法后,又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已经销毁了。类似的,当调用了bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行。但是,当一个服务既调用了startService()方法,又调用了bindService()方法,根据Android系统的机制,必须要让以上两种条件同时不满足时,服务才会销毁。所以,这种情况下需要同时调用stopService()和unbindService()方法,onDestroy()方法才会执行。

不管如何调用onCreate()只被调用一次,startService调用多少次,onStart就会被调用多少次,而unbindService不会停止服务,必须调用stopService或是stopSelf来停止服务。必须unbindService和stopService(stopSelf)同时都调用了才会停止服务。
在这里插入图片描述


四、服务和活动通信

(1)当一个活动和服务绑定了之后,就可以调用该服务里的Binder提供的方法。


五、前台服务

前台服务与普通服务最大的区别在于,它会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看见更加详细的信息,非常类似于通知的效果。


六、IntentService

Android学习笔记:IntentService

为了可以简单地创建一个异步的、会自动停止的服务,Android专门提供一个IntentService类。


七、注意事项

  • 1、避免在Service的onStartCommand()和onBind()方法中执行耗时操作,如果有需求,可以采用IntentService或者其他异步机制来完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值