摸鱼日记 09/16 day7 Android基础----Service

Service基础

service是一个可以在后台长时间运行的操作的没有用户界面的组件,运行于UI线程,因此不能进行耗时操作。
由于Service是运行在UI线程中的,是绝对不能进行耗时操作的,而Thread开启的子线程是可以进行耗时操作的,但是Thread开启的子线程不能直接对UI进行操作,否则极有可能直接让程序崩溃。

Service的启动方式

  1. StartService()方式开启的Service
    步骤:
    定义一个类继承Servcie
    在AndroidManifest.xml文件中配置该Service
    不在使用该Service时,调用Context的stopService(Intent)方法停止该Service
  2. bindService方法开启的Service(Activity与Service绑定)
    步骤:
    创建BindServcie服务器,继承自Service并在类中创建一个实现IBinder接口实现的实例对象并提供公共方法给客户端调用
    从onBind()回调方法返回给此binder实例
    在客户端中,从onServcieConnect回调方法接受Binder并使用提供的方法调用绑定服务。

Service的生命周期

在这里插入图片描述
在这里插入图片描述

因为Service的生命周期有两种,服务可以跟Activity绑定起来,也可以不绑定,Activity和服务进行通信的话,是需要把服务和Activity进行绑定,因此服务的生命周期分为未绑定Activity和绑定的Activity。
Service启动:

  1. 通过Intent和StartService方法启动了一个服务,接下来调用onCreate方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用onStartCommand和onBind之前)如果服务已在运行,则不会调用此方法。
  2. 当另一个组件通过调用startService请求启动服务时,系统将调用此方法。一旦执行此方法,服务将会启动并且可在后台无限运行。如果实现此方法,则在服务工作完成后,需要通过stopSelf或stopService来停止服务。在绑定情况下,生命周期与Activity相绑定则不需要执行此方法。
  3. 服务开始处于运行状态
  4. 某个操作导致服务停止,比如执行了stopService方法,那么服务接下来会执行onDestory销毁。服务应该实现此方法来清理所有的资源,比如线程、注册的监听器、接收器等,这是服务器接受的最后一个调用
  5. 服务被完全销毁,下一步就是等待被垃圾回收器回收了
  6. 通过Intent和bindService方法启动一个服务,接下来回启动onCreate方法,首次创建服务时,系统将调用此方法来执行一次性设置程序,在调用onStartCommand和onBInd之前。如果服务已在运行,则不会调用此方法。
  7. 当另一个组件想通过bindService与服务绑定,比如说执行RPC时,系统将调用次饭饭嘎。在此方法的实现中,您必须通过返回IBinder提供一个接口,供客户端来与服务进行通信。
  8. 服务开始处于运行状态,成功与Activity绑定
  9. 当某个操作导致服务接触绑定,比如说执行了方法unbindService,那么服务接下来会解除与当前的Activity的绑定。服务面临销毁
  10. 服务执行onDestory方法被销毁,服务应该实现此方法来清理所有的资源,比如线程、注册的侦听器
  11. 服务被完全销毁,接下来就是被垃圾回收器回收。

被启动的服务的生命周期:如果一个Servcie被某个Activity调用Context.startService方法启动,那么不管是否有Activity使用bindService绑定或者unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startservice方法启动多次,那么onCreate方法只会被调用一次,onstart方法会被调用多次,并且系统只会创建一个Servcie实例,所以只需要一次stopService的调用。该Service会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或是自身的stopSelf方法。假如系统资源不足,Android系统可能结束服务

被绑定的服务的生命周期:如果一个Servce被某个Activity调用Context.bindService方法绑定启动,不管调用bindService被调用几次,onCreate方法都只会调用一次,onStart方法不会被调用。当连接被建立后,Service将会一直运行,除非调用Context.unbindService断开连接或者之前调用bindService的Context不存在,比如Activity被finish了,系统都会自动停止Service,对应onDestory将会被调用

被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终都只会调用一次,对应的startService调用多少次,Service的onStrart便会调用多少次。调用unbindService将不会终止Service,必须调用stopService或Service的stopSelf的服务。

小Tips:
同时使用startService与bindService要注意,Service的终止,需要unbindServcie与stopService同时调用,才能终止Service,不管startService与bindService的调用顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cd C:\Program Files\FlightGear fgfs --fg-root=C:\Program Files\FlightGear\data --aircraft=ufo --in-air --fdm=null --telnet=5501 --telnet=5502 --telnet=5503 --disable-ai-traffic --disable-real-weather-fetch --disable-random-objects --disable-terrasync --disable-clouds --disable-sound --disable-panel --disable-hud --disable-specular-highlight --timeofday=noon --prop:/sim/rendering/multi-sample-buffers=1 --prop:/sim/rendering/multi-samples=2 --prop:/sim/rendering/draw-mask-clouds=false --prop:/sim/rendering/draw-mask-terrain=true --prop:/sim/rendering/draw-mask-objects=true --prop:/sim/rendering/draw-mask-lights=true --prop:/sim/rendering/draw-mask-internal=true --prop:/sim/rendering/draw-mask-cockpit=true --prop:/sim/rendering/draw-mask-effects=true --prop:/sim/rendering/draw-mask-overlay=true --prop:/sim/rendering/draw-mask-world=true --prop:/sim/rendering/draw-mask-panel=true --prop:/sim/rendering/draw-mask-vr=true --prop:/sim/rendering/draw-mask-2d=true --prop:/sim/rendering/draw-mask-3d=true --prop:/sim/rendering/draw-mask-sky=true --prop:/sim/rendering/draw-mask-shadows=true --prop:/sim/rendering/draw-mask-cabin=true --prop:/sim/rendering/draw-mask-weather=true --prop:/sim/rendering/draw-mask-stereo=true --prop:/sim/rendering/draw-mask-internal-cockpit=true --prop:/sim/rendering/draw-mask-internal-windows=true --prop:/sim/rendering/draw-mask-internal-instruments=true --prop:/sim/rendering/draw-mask-internal-overlay=true --prop:/sim/rendering/draw-mask-internal-effects=true --prop:/sim/rendering/draw-mask-internal-lights=true --prop:/sim/rendering/draw-mask-internal-world=true --prop:/sim/rendering/draw-mask-internal-panel=true --prop:/sim/rendering/draw-mask-internal-3d=true --prop:/sim/rendering/draw-mask-internal-sky=true --prop:/sim/rendering/draw-mask-internal-cabin=true --prop:/sim/rendering/draw-mask-internal-weather=true --prop:/sim/rendering/draw-mask-internal-stereo=true --prop:/sim/rendering/draw-mask-internal-shadow=true --prop:/sim/rendering/draw-mask-internal-stall=true --prop:/sim/rendering/draw-mask-internal-aoa=true --prop:/sim/rendering/draw-mask-internal-thermal=false --prop:/sim/rendering/draw-mask-internal-ice=false --prop:/sim/rendering/draw-mask-internal-glass=true --prop:/sim/rendering/draw-mask-internal-dead=true --prop:/sim/rendering/draw-mask-internal-reflection=true --telnet=127.0.0.1:5501 --disable-panel --disable-hud --disable-specular-highlight --disable-clouds --disable-sound --timeofday=noon --enable-hud-3d=no --enable-hud-2d=yes --enable-panel=no --enable-sound=no程序显示错误
最新发布
05-10

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值