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 ...
随机推荐
- python os操作
大家先看一下Python os模块中的部分函数 python 路径相关的函数 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os. ...
- P4113 [HEOI2012]采花
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- IPV6地址格式分析
IPV6地址格式分析 IPv6的地址长度是128位(bit). 将这128位的地址按每16位划分为一个段,将每个段转换成十六进制数字,并用冒号隔开. 例如:2000:0000:0000:0000:00 ...
- margin-top影响父元素定位
写样式时无意中发现margin-top会影响到父元素的定位,下面是示例: HTML代码: <div class="demo"> <div class=" ...
- java中TCP两个例子大写服务器和文件上传
大写服务器的实例: package com.core.net; import java.io.BufferedReader; import java.io.BufferedWriter; import ...
- 用ServletContext做一个简单的聊天室
这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...
- [原]C++拾遗
int a=3,b=4; bool ok=(a==2,b==4); printf("%d\n",ok); //输出的结果是1,逗号既不是&& 也不是|| 应该是从前 ...
- python tornado对接权限中心的sdk封装
# -*- coding: utf-8 -*- import json import requests import logging as logger from python.akskapp.scr ...
- 百度之星复赛T5&&hdu6148
Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过去数字没有出现先递增接着递 ...
- 报告撰写,linux使用gimp简单做gif动图
我想把我的系统菜单完整记录下来,方便查看,如果单纯使用文字比较单调,使用屏幕截图,需要依次打开多个图像查看也不是很方便,就想到了使用动画的形式展示.由于本人的系统一直使用Linux系统,为了一张gif ...