Android开发必须知道SERVICE的10件事
这些年我在和其他安卓攻城狮交流时经常谈到的一个话题就是Service组件被开发者错误地理解,不管是新手还是老司机。这篇文章就是交流的成果。
这篇文章不会讲解Service的使用方法,这个要去看官方的(被墙的)文档:
http://developer.android.com/guide/components/services.html
https://developer.android.com/intl/pt-br/reference/android/app/Service.html
http://developer.android.com/training/run-background-service/index.html
这篇文章总结了对于掌握Service至关重要却常常被忽视、误解、忘记的概念。
1. Service不是更好的AsyncTask
Service不是用来执行异步、后台操作的,它被创造的目的就是在Activity不可见时仍能执行逻辑,要把Service想成不可见的Activity。
要记住每个Service都是有使用成本的特殊组件,不只是对于APP,更是对整个系统。
2. 默认情况下Service在主线程运行
可以选择让Service在其他线程运行,但除非必要情况时应尽量避免这么做,因为这么做是有代价的。
3. IntentService并不神奇
IntentService是通过创建一个HandlerThread并在其中排列逻辑来工作的,可以很轻松的跳出Service实现这种方式。
IntentService是一个很简单的类,只有164行代码,去掉注释74行,可以自己去看看。
4. 一个Service同时只能有一个实例
不管怎么new,一个Service永远只能有一个实例,即使外部APP/进程与它交互也是这样。
5. Service很容易被干掉
不要以为内存少是很极端的情况,应该在编写Service代码时让它可以很优雅的处理系统对它的重启,这是生命周期的一部分。
可以把Service标记为foreground让它更难被干掉,但应该只在必要时这么做。
注意当执行onCreate()、onStartCommand()、onDestroy()方法时,Service被视作foreground虽然它并不是。
下面这个链接可以告诉你你的进程有多么可能被干掉。
https://developer.android.com/guide/components/processes-and-threads.html#Lifecycle
6. 一个Service可以在同时被启动与绑定
明确的停止绑定了其他组件的Service并不会使它结束。解绑Service的所有组件而不结束它也不会使它停止。还有就是不论你调用startService()多少次,只需调用一次stopService()或stopSelf()就可以结束它。具体参考下图:
7. STARTFLAGREDELIVERY可以避免输入数据丢失
如果在启动Service时传入数据并在onStartCommand()中返回STARTFLAGREDELIVERY可以有效地避免在Service处理数据被杀死时丢失数据。
8. 前台的通知可以被部分遮盖
当一个前台的Service要发送一个通知时,可以传入一个优先级值PRIORITY_MIN来在状态栏中隐藏它,而在通知栏中仍然可见。
9. Service可以启动Activity
就像不是Activity的所有Context一样,Service可以在添加FLAGACTIVITYNEW_TASK标记时启动Activity。
还可以显示Toast或状态栏通知,一样的道理。
10. 可以引入单一职责原则
最好不要在Service中写逻辑代码,而是分离在另一个类中,这样除了可以复用外,说不定还有其他好处。
推荐:
所有Android控件的学习以及service和广播的使用方法
Android开发必须知道SERVICE的10件事的更多相关文章
- Android开发人员必须掌握的10 个开发工具+应该深入学习的10个开源应用项目
一.Android开发人员必须掌握的10 个开发工具 Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. ...
- Android 开发人员必须掌握的 10 个开发工具
Android 开发人员必须掌握的 10 个开发工具 Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. ...
- Android开发技巧——自定义控件之组合控件
Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...
- 在开发第一个Android应用之前需要知道的5件事:
你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的 ...
- 在 PHP 7 中不要做的 10 件事
在 PHP 7 中不要做的 10 件事 1. 不要使用 mysql_ 函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好 ...
- 转:你需要知道的NoSQL数据库10件事
你需要知道的NoSQL数据库10件事 NoSQL的5个优势 1.弹性扩展 多年来,数据库管理员一直依赖于向上扩展(scale up)-随着数据库负载的增加购买更大的数据库服务器―而不是向外扩展-随着负 ...
- 亲身体验:digitalocean vps能做的10件事
我写过一篇亲身体验:digitalocean和linode评测哪个好,帮助不少网友选购价格便宜性能优异的免备案vps,相信大家对两家产品有所了解.vps的性能和用途远远超过传统的虚拟主机,你拥有独立I ...
- 使用Office 365前,企业必须要知道的10件事
目前的市场上充斥着很多关于微软Office 365的炒作,相信厂商.客户或者企业的都有自己不同的考虑.Office 365是微软云版本的Office,用户可以通过互联网创建一个帐户,付款.下载应用安装 ...
- (0)开始 Raspberry Pi 项目前需要知道的 10 件事
https://www.digikey.cn/zh/articles/techzone/2017/feb/10-things-to-know-before-starting-a-raspberry-p ...
随机推荐
- 201621123034 《Java程序设计》第8周学习总结
作业08-集合 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 答 ...
- CodeForces Round #515 Div.3 D. Boxes Packing
http://codeforces.com/contest/1066/problem/D Maksim has nn objects and mm boxes, each box has size e ...
- h5滚动条加载到底部
https://www.zhihu.com/question/31861301 重复加载问题 http://www.jianshu.com/p/12aa901bee1f?from=timeline w ...
- Spring和ActiveMQ集成实现队列消息以及PUB/SUB模型
前言:本文是基于Spring和ActiveMQ的一个示例文章,包括了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,只是做了比较简单的实现,无任何业务方面的东西,作为一个 ...
- 几个简单的VBS脚本程序以及其JS实现
1 语音发声脚本,调用sapi.spvoice读英语hh 保存为say.vbs,点击打开就可以念诗: set objTTS = CreateObject("sapi.spvoice&quo ...
- 自定义View基础 (1)
前言 自定义View原理是Android开发者必须了解的基础: 在了解自定义View之前,你需要有一定的知识储备: 本文将全面解析关于自定义View中的所有知识基础. 目录 目录 1. View的分类 ...
- [ CodeVS冲杯之路 ] P3038
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3038/ 按照题目给定的方法,一步步推下去,直到推到1就输出次数 至于-1的话,一开始想直接用数组判重,但是怕T掉,于是 ...
- win7 无法启动此程序,因为计算机中丢失glut32.dll
http://zhidao.baidu.com/link?url=9NZxqCvR7hvmKuVR1dUSdQB-TTv_re-g7lp-xZj5FKII04FnMvIKjFhKv299t6wv5Ht ...
- 跨平台的EVENT事件 windows linux
#ifndef _HIK_EVENT_H_ #define _HIK_EVENT_H_ #ifdef _MSC_VER #include <Windows.h> #define hik_e ...
- Kubernetes监控工具
#镜像在谷歌上需要FQ#####################################监控工具#当前最新版本 heapster https://github.com/kubernetes/h ...