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

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

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

二、前台Service
在Android系统中,服务的系统优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收掉正在后台运行的服务。为了防止服务被回收,可以使用前台服务,当然前台服务不仅仅只是为了避免被系统回收,有时候处于项目的特殊需求会使用到前台服务,例如天气预报在系统状态栏显示当前天气信息。
创建一个前台服务并不复杂,只需要在onCreate()方法中,使用Notification对象,并调用startForeground()方法显示出来即可。
Android基础知识(十三):Service生命周期及更多技巧_第4张图片

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

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

你可能感兴趣的:(走进Anroid)