阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680
本篇文章将先从以下三个内容来介绍Service内核原理:
- [startService与bindService的区别]
- [多线程IntentService的工作原理 & 源码分析]
- [前台服务以及通知]
一 startService与bindService的区别
Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。
1、生命周期上的区别
2、调用者如何获取绑定后的Service的方法
3、既使用startService又使用bindService的情况
4、本地服务与远程服务
5、代码实例
startService启动服务
bindService绑定服务
上面的代码关键之处,在于 onBind(Intent) 这个方法 返回了一个实现了 IBinder 接口的对象,这个对象将用于绑定Service 的 Activity 与 Local Service 通信。
下面是 Activity 中的代码:
6、在AndroidManifest.xml里Service元素常见选项
android:name ------------- 服务类名
android:label -------------- 服务的名字,如果此项不设置,那么默认显示的服务名则为类名
android:icon -------------- 服务的图标
android:permission ------- 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务
android:process ---------- 表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字
android:enabled ---------- 表示是否能被系统实例化,为true表示可以,为false表示不可以,默认为true
android:exported --------- 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false
二 多线程IntentService的工作原理 & 源码分析
2.1.1流程示意图
IntentService
的工作原理 & 源码工作流程如下:
2.1.2 特别注意
若启动IntentService
多次,那么 每个耗时操作 则 以队列的方式 在 IntentService
的 onHandleIntent
回调方法中依次执行,执行完自动结束
接下来,我们将通过 源码分析 解决以下问题:
IntentService
如何单独开启1个新的工作线程IntentService
如何通过onStartCommand()
将Intent 传递给服务 & 依次插入到工作队列中
2.2. 源码分析
问题1:IntentService如何单独开启1个新的工作线程
主要分析内容 = IntentService
源码中的 onCreate()
方法
问题2:IntentService 如何通过onStartCommand() 将Intent 传递给服务 & 依次插入到工作队列中
至此,关于IntentService
的源码分析讲解完毕。
2.3. 源码总结
从上面源码可看出:IntentService
本质 = Handler
+ HandlerThread
:
- 通过
HandlerThread
单独开启1个工作线程:IntentService
- 创建1个内部
Handler
:ServiceHandler
- 绑定
ServiceHandler
与IntentService
- 通过
onStartCommand()
传递服务intent
到ServiceHandler
、依次插入Intent
到工作队列中 & 逐个发送给onHandleIntent()
- 通过
onHandleIntent()
依次处理所有Intent
对象所对应的任务
因此我们通过复写
onHandleIntent()
& 在里面 根据Intent
的不同进行不同线程操作即可
三、前台服务与通知
3.1 什么是前台服务
前台服务是那些被认为用户知道(用户认可所认可)且在系统内存不足的时候不允许系统杀死的服务。前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下——这就意味着通知只有在这个服务被终止或从前台主动移除通知后才能被解除。
3.2 通知
Notification支持文字内容显示、震动、三色灯、铃声等多种提示形式,在默认情况下,Notification仅显示消息标题、消息内容、送达时间这3项内容。
1. 标准样式
2. 扩展样式
3. 自定义样式
使用notification
Notification:通知信息类,它里面对应了通知栏的各个属性。
NotificationManager : 状态栏通知的管理类,负责发通知、清除通知等操作。
构建通知的步骤:
1. 获取状态通知栏管理类实例
2. 实例化通知栏构造器NotificationCompat.Builder
3. 对Builder进行配置
4. 设置通知栏PendingIntent(点击动作事件等都包含在这里)
5. 发送通知请求
更新通知
要想更新通知,需要利用NotificationManager.notify()
的id参数,该id在应用内需要唯一。要想更新特定id的通知,只需要创建新的Notification,并发出与之前所用 id 相同的 Notification。如果之前的通知仍然可见,则系统会根据新的 Notification 对象的内容更新该通知。相反,如果之前的通知已被清除,系统则会创建一个新通知。
删除通知
删除通知可以有多种方式:
1.通过NotificationCompat.Builder
设置setAutoCancel(true)
,这样当用户点击通知后,通知自动删除。
2.通过NotificationManager.cancel(id)
方法,删除指定 id 的通知
3.通过 NotificationManager.cancelAll()
方法,删除该应用的所有通知
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680
参考:https://my.oschina.net/tingzi/blog/376545
https://www.jianshu.com/p/8a3c44a9173a
https://www.jianshu.com/p/b59d2e51ddc5