【Android学习】Service&Boradcast初步
Service初步
掌握Service概念
掌握Service分类
Service开发能力具备
了解Service和intentService类的区别
重点难点
StartService和BoundService区别
Service的开发,启动和绑定
掌握Service和线程的使用区别
考核目标
什么是Service?
请描述一下Service的生命周期?
说一下Android里有哪两种Service?
Service会新开进程或者线程么?
startedService和BoundService区别
练习
使用Service来写一个音乐播放器,要求分别使用startService和bindService方法
什么是服务
服务是一个应用程序组件,能够在后台执行一个长时间运行的程序,不提供用户交互接口,即有些用时比较长的操作我们希望他在后台运行,不耽误我们当前的操作,这
就引入了Service概念。
常见的比如:访问网络,文件IO操作,大数据的数据库任务,播放音乐等。
Service在后台运行,不与用户进行交互。在默认情况下,Service运行在应用程序进程的主线程中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务放在单独的线程中处理,避免阻塞用户界面。
Q:
- 启动服务后,按Home键,服务是否还在运行?是
- 启动服务后,退出进程,是否服务还会运行?否
- 启动服务后,不用多线程,界面是否会阻塞?会
- 服务是个新的进程,服务是个新的线程么?
服务不是一个新的进程,也不是一个新的线程,它与当前进程绑定
Service的分类
按照启动方式分类
-
Started Service
通过startService()启动
一旦启动,就运行在后台,即便启动它的对象(Activity)都销毁了
通常只启动,不返回值
通常网络上传或下载,操作完成后,自动停止
onStartCommand() -
BoundService
bindService()来绑定
提供客户端服务器接口来启动
发生请求,得到返回值,甚至通过IPC通讯
一个服务可以被多个调用者绑定,只要有一个绑定这,服务运行,所有绑定者都退出,服务退出
onBind()
按服务性质分
- Local Service
- Remote Service (不同的进程之间)
按实现方法分类
- Java Service
- Native Service
Service的生命周期
- onCreate()
- onDestory()
- onStartCommand()
- onBind()
创建及使用Service步骤
Started Service
Service
- 继承Service类实现自己的服务
- 在AndroidManifest中注册服务
- 启动服务startService()
- onStartCommand
- (返回值)
- START_STICKY
- START_NOT_STICKY
- START_REDELIVER_INTENT
- (参数值flag)
- START_FLAG_REDELIVERY
- START_FLAG_RETRY
- 停止服务stopService(),stopSelf()
IntentService 异步请求的Service
异步处理服务,新开了一个线程:HandlerThread,在线程中发消息,然后接收,处理完成后,会清除线程,并且关掉服务。在做一次性操作时,用IntentService
下载文件
BoundService
三种实现方法 Local BoundService、(Remote) Messager、AIDL,这里只介绍第一种。
Local BoundService
- 继承Service或者IntentService类实现自己的服务,定义IBinder接口
- 在AndroidManifest中注册服务
- 通过绑定服务bindService(),启动服务
- 取消绑定服务unbindService()
bindService不会阻塞线程,说明它是异步操作
Q:
unbind之后是否一定会destory?
boundService 绑定(onBind)和连接 onServiceConnection哪个先执行?
onBind先执行,onServiceConnection后执行。
相似性的onUnBind和onServiceDisconneced呢?
onServiceDisconnected先执行,onUnBind后执行。
什么时候用startedService什么时候用BoundService?
什么是Binder?Linux的Binder和Android的Binder之间的区别?
Binder就是Linux下的进程间IPC通讯的一套机制,android基于它进行了封装和改进,因此成为默认的IPC机制。
startedService&BoundService区别
本质区别:
boundService 其实是有一个客户端、服务端的概念。借助Binder来通讯。
- startedService和启动它的Activity不同生共死,Activity消亡,不影响Service,但是如果当前进程关闭,则Service消亡
- BoundService和启动它的Activity同生共死
- 无论是start or bind,只要service没有实例化,就都会被create,但start每次都会调用onStartCommand,而bind则如果已经绑定,就不再调用onBind了
可以通过Notification来Running Service in the foreground,等学会Notification了,再说。
Nactive Service(C++实现,NDK)
- 什么是Native Service
- 什么时候用到Naticei Service
- 如何调用
Service运行如何与用户交互
- Toast Notification
- StatusBar Notification
如何在Service和线程之间选择?
Service是一个很方便的组件让你运行后台操作,并且不影响当前操作
当你需要在你当前操作的时候另外其一个更独立操作时候可以考虑线程,比如当前程序不关闭的情况下运行音乐,从逻辑上你认为需要一个后台操作,但跟我们现在主线程操作通讯频繁,逻辑关系紧密,那就用多线程(直接用),能够从逻辑上区分开来,就用后台服务。(跟当前页面无关,并长期运行的,则用服务,否则则用多线程)
Broadcast Recevier
学习目标
了解Android的消息机制
掌握Broadcast发送消息的两种类型
掌握BroadcastReceiver接收消息的编程
重点难点
sendOrderedBroadcast()的理解
考核目标
说说Android中发生创建两种广播分别是?以及他们的区别?
Broadcast Receiver作用以及为何要引用:
在系统内通知和判定执行状态
- 系统执行状态,开机了,IF卡拔了,准备关机了, 电量低了
- 自定义执行状态,发消息提示更新界面
用来接收系统及自定义消息
Broadcast Reveiver接收哪些消息
- 常规消息(Normal broadcast),通过Context.sendBroadcast发送
- 排序消息(Ordered broadcast),通过Context.sendOrderedBroadcast发送
如何使用:
- 继承BroadcastReceiver
注意:Message、Message Queue、Message Manger