Service浅谈

    Service,一个可以在后台长时间运行而不提供用户界面的应用组件

1.启动方式和生命周期

1.1  startService

startService使用的是同一个Service,onCreate()会执行一次,onStart()和onStartCommand()会执行多次,startService启动时是单独开一个服务,与启动对象没有任何关系

1.2  bindService

onCreate()和onBind()只会调用一次,bindService启动时会于启动对象绑定,当启动对象销毁时,Service也会随之销毁

下面是Android官网给出的两种启动方式执行流程图

这里写图片描述

2.IntentService

2.1简介

IntentService是Service的子类,通过开启一个线程HandlerThread处理所有请求,任务执行完后自动停止服务

2.2原理

创建一个名叫ServiceHandler的内部handler

把内部handler与HandlerThread对应的子线程进行绑定

HandlerThread开启线程,创建自己的looper

通过onStartCommand()的实现,将Intent依次发送到工作队列和onHandleIntent()

2.3与Service的区别

IntentService会创建独立的worker线程来处理所有的Intent请求,所有请求处理完后,无需调用任何方法即可自动停止,IntentService不会阻塞UI线程

Service主线程不能处理耗时操作,需要调用stopSelf()停止,普通的Service会导致ANR异常

3.Service与Thread

3.1Thread

Thread是程序的最小单元,在android系统中,线程一般指的是工作线程,即后台线程。主线程是一种特殊的工作线程,为了保证UI的响应能力主线程不可执行耗时操作。耗时操作应该在工作线程(子线程)执行

3.2Service

Service是一种轻量级的IPC通信,运行在主线程上,由系统进程托管。如果需要长时间在后台运行,并且不需要交互的情况下可以使用服务

3.3两者结合使用

在大部分情况下,两者都会结合使用,比如文件下载。通过Service在后台执行,Notification在通知栏显示,Thread异步下载。

4.如何保证服务不被杀死

4.1因内存资源不足而杀死

将onStartCommand() 方法的返回值设为 START_STICKY或START_REDELIVER_INTENT,在内存不足时杀死后,在资源足够时再恢复。或者将Service设置为前台服务,提高优先级在内存资源不足时也不会被杀死

4.2用户通过 settings --> Apps --> Running --> Stop 方式杀死

这种情况会执行Service的生命周期,所以可以在onDestroy()中发送广播重新启动

4.3用户通过 settings --> Apps --> Downloaded --> Force Stop 方式强制杀死

这种情况不会执行Service的生命周期,所以无法重启服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值