Android基础知识(十三):Service生命周期及更多技巧

Android基础知识(十三):Service生命周期及更多技巧

一、Service生命周期
当Service是使用startService()方法启动时,则Service的生命周期如下图所示。调用Context的startService()方法,相应的Service就会启动,若该Service之前未被创建,则onCreate()方法优先于onStartCommand()方法执行
服务启动后一直保持运行状态,直到stopService()或stopSelf()方法被调用。需要注意的是,虽然每次调用startService()方法,onStartCommand()方法就执行一次,但实际上每个Service都只存在一个实例,因此只需调用一次stopService()或者stopSelf()方法,服务就会被销毁。
在这里插入图片描述
调用Context的bindService()方法绑定Service的情况下,Service生命周期如下图所示。通过bindService()方法获取的是一个Service的持久连接,这时会回调服务中的onBind()方法。类似的,如果服务尚未创建,onCreate()方法会优先于onBind()方法执行,不同的是,服务只会绑定一次即无论bindService()方法执行几次,只有第一次的绑定是有效的。调用方可以获取到onBind()方法返回的IBinder对象实例,从而自由的与服务通信。
此外,只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态
在这里插入图片描述
无论服务是通过startService()方法进行启动,还是通过bindService()方法进行服务绑定,都可以对应的调用stopService()方法或者unbindService()方法进行服务的销毁,从而执行onDestroy()方法。那么问题来了,如果对一个服务既调用了startService()方法进行启动,又调用了bindService()方法进行绑定了呢?
在这里插入图片描述
根据Android系统的机制,一个服务只要被启动或者绑定之后,就会一直处于运行状态必须要让以上两种条件同时不满足,服务才能销毁。换句话说,对于上面的情况,要销毁服务必须同时调用stopService()和unbindService()方法,onDestroy()方法才会执行。

二、前台Service
在Android系统中,服务的系统优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收掉正在后台运行的服务。为了防止服务被回收,可以使用前台服务,当然前台服务不仅仅只是为了避免被系统回收,有时候处于项目的特殊需求会使用到前台服务,例如天气预报在系统状态栏显示当前天气信息。
创建一个前台服务并不复杂,只需要在onCreate()方法中,使用Notification对象,并调用startForeground()方法显示出来即可。
在这里插入图片描述

三、IntentService
从笔记:Android基础知识(十二):Service简介与基本用法中知道,Service中的代码都是默认运行在主线程中,如果直接在服务里去处理一些耗时的逻辑,就容易出现ANR(Application Not Responding)的情况。
为了解决这种情况,需要使用到Android多线程编程的技术,在服务的每个具体的方法里开启一个子线程,并在子线程中处理耗时操作,一个比较标准的服务如下所示。其中可以通过stopSelf()实现在服务执行完毕之后自动停止的功能。
在这里插入图片描述
Android专门提供了一个IntentService类,该类可以简单地创建一个异步的、会自动停止的服务。IntentService的用法如下所示。
在这里插入图片描述

参考资料:《第一行代码 Android 第2版》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值