Android学习笔记九:Service
一:Service是什么
Service,服务。一般用于提供需要在后台长期运行的服务(如复杂计算、下载等等耗时任务),其特点是长生命周期的、没有用户界面、在后台运行的。
二:Service的生命周期方法
在定义Service子类时,需要重写以下方法:
| 内部自动调用的方法 | 作用 |
|---|---|
| onCreat() | 创建服务 |
| onStartCommand() | 开始服务 |
| onDestroy() | 销毁服务 |
| onBind() | 绑定服务 |
| onUnbind() | 解绑服务 |
在其他地方,创建服务、启动服务、停止服务时,需要调用以下方法:
| startService() | 启动服务 |
| stopService() | 关闭服务 |
| bindService() | 绑定服务 |
| unbindService() | 解绑服务 |
1:调用startService()后,自动调用service内部方法:onCreate()、onStartCommand()
2:调用stopService()后,自动调用内部方法:onDestory()
3:调用bindService()后,自动调用内部方法:onCreate()、onBind()
4:调用unbindService()后,自动调用内部方法:onCreate()、onBind()、onDestory()
三:常见的生命周期调用
1:startService()启动服务、stopService()停止服务:只能开启和关闭Service,无法操作Service;若启动服务后,无手动调用stopService(),则程序退出后服务仍然存在
2:bindService()绑定服务、unbindService()解绑服务:Service随着调用者销毁而停止。
3:使用startService()启动服务,再使用bindService()绑定服务——使用unbindService()解绑服务,再使用stopService()停止服务:要先解绑,才能停止服务。
四:Service的类型

【图片来自:http://www.jianshu.com/p/d963c55c3ab9】
五:不同类型Service的使用
1:本地服务:与某一个程序相关,在程序的代码中启动、停止服务
步骤1:新建子类继承Service类,重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法
步骤2:在AndroidManifest.xml里注册该Service
步骤3:在activity的代码中,创建用于启动Service的Intent对象
步骤4:调用startService(intent)启动Service、调用stopService(intent)停止服务
Androidmanifest里Service的常见属性说明
| 属性 | 说明 | 备注 |
|---|---|---|
| android:name | Service的类名 | |
| android:label | Service的名字 | 若不设置,默认为Service类名 |
| android:icon | Service的图标 | |
| android:permission | 申明此Service的权限 | 有提供了该权限的应用才能控制或连接此服务 |
| android:process | 表示该服务是否在另一个进程中运行(远程服务) | 不设置默认为本地服务;remote则设置成远程服务 |
| android:enabled | 系统默认启动 | true:Service 将会默认被系统启动;不设置则默认为false |
| android:exported | 该服务是否能够被其他应用程序所控制或连接 | 不设置默认此项为 false |
2:远程服务:与程序无关,系统级别的服务
远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程)
一般用在多个应用程序共享同一个后台服务(远程服务)的情况。
我们把Service称为服务器端、需要与Service通信的进程称为客户端。
以下是两个进程角色的具体使用步骤:
服务器端(Service)
步骤1:新建定义AIDL文件,并声明该服务需要向客户端提供的接口
步骤2:在Service子类中实现AIDL中定义的接口方法,并定义生命周期的方法(onCreat、onBind()、blabla)
步骤3:在AndroidMainfest.xml中注册服务 & 声明为远程服务客户端(Client)
步骤1:拷贝服务端的AIDL文件到目录下
步骤2:使用Stub.asInterface接口获取服务器的Binder,根据需要调用服务提供的接口方法
步骤3:通过Intent指定服务端的服务名称和所在包,绑定远程Service
AIDL:Android Interface Definition Language,即Android接口定义语言;用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。
具体使用参见:http://www.jianshu.com/p/34326751b2c6
3:前台服务
前台服务是指在手机的下拉通知栏保持显示一个通知。
前台Service优先级较高,不会由于系统内存不足而被回收;后台Service优先级较低,当系统出现内存不足情况时,很有可能会被回收。
前台服务不是一种特殊的服务类型,它只是在一般的后台服务的基础上添加了几个属性,使其具有了前台显示的界面而已。任何服务都可以通过以下方法成为前台服务:
在原有的Service类对onCreate()方法中添加以下内容:
@Override
public void onCreate() {
super.onCreate(); //添加下列代码将后台Service变成前台Service
//1:创建"点击通知"后要跳转至哪个页面的Intent对象
Intent notificationIntent = new Intent(this,MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0); //2:新建通知栏的Builer对象
Notification.Builder builer = new Notification.Builder(this);
//3:用通知栏的builder对象进行通知图标、标题、内容、点击事件的设置
builer.setContentTitle("前台服务通知的标题");//设置通知的标题
builer.setContentText("前台服务通知的内容");//设置通知的内容
builer.setSmallIcon(R.mipmap.ic_launcher);//设置通知的图标
builer.setContentIntent(pendingIntent);//设置点击通知后的操作
//4:使用builder创建出一个通知
Notification notification = builer.getNotification();//用Builder对象生成notification
//5:让通知在下拉通知栏显示
startForeground(1, notification);
}
4:可通信服务
上面创建的服务,除了启动、停止之外,并不能与activity进行交互,即:activity不能访问服务中的其他方法。
要通过activity操作service的话,需要用到绑定服务。
1)新建子类继承Service类,并在其中新建一个内部类继承自Binder类,在binder子类中定义Activity需要调用的方法。
然后在Service子类中创建binder子类实例,并在onBind()方法中return 这个实例。
2)在Activity中,创建ServiceConnection实例,并且重写其onServiceConnected()方法,把连接传递过来的binder强制类型转换为第一步中创建的binder。
3)在Activity中,创建一个binder实例,然后通过bindService()方法,把ServiceConnection实例作为参数传递进去,从而把创建的binder赋值为绑定成功后得到的service中的binder实例。
4)最后,通过binder调用其内部定义好的方法,从而实现Activity与Service的通信。
各种服务类型的使用场景:

【图片来自:http://www.jianshu.com/p/e04c4239b07e】
六:Service与Thread的区别

一般来说,会将Service和Thread联合着用,即在Service中再创建一个子线程(工作线程)去处理耗时操作逻辑。
Android学习笔记九:Service的更多相关文章
- android学习笔记56——Service
Service四大组件之一,需要在AndroidMainfest.xml中添加相关配置,运行于后台,不与用户进行交换,没有UI... 配置时可通过<intent-filter.../>元素 ...
- Android学习笔记--服务(Service)
1.服务概述 1.服务是Android四大组件之一,在使用上可以分为本地服务和远程服务,本地服务是指在不影响用户操作的情况下在后台默默的执行一个耗时操作,例如下载,音频播放等.远程服务是指可以供其他应 ...
- Android学习笔记之Service
与服务通信 用bindservice 而startservice并无通信条件. service 为android为系统服务,所以程序员无法new出来,只能建立服务,共其他组件使用. package c ...
- android学习笔记九——RatingBar
RatingBar==>星级评分条 RatingBar和SeekBar十分相似,它们甚至有相同的父类:AbsSeekBar.两者都允许用户通过拖动来改变进度: 两者最大的区别在于RatingBa ...
- 【转】 Pro Android学习笔记(七七):服务(2):Local Service
目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...
- 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
随机推荐
- springMVC中HTTP PUT请求该如何传输请求参数呢?
对于表单提交,tomcat默认只解析POST的表单,对于PUT和DELETE的不处理,所以Spring拿不到.解决方案:1.修改tomcat的server.xml: <Connector p ...
- 将hta包装为exe发布
hta在打开的时候,有时候会被杀毒软件拦截而不给执行,更重要的一点是通常都可以右击查看源代码,里面如果涉及到域名或者其它的一些细节就很容易被其它人了解. 网络上有一些hta转exe的,类似的软件基本上 ...
- [Web 前端] React高级教程(es6)——(2)对于Refs最新变动的理解
cp : https://blog.csdn.net/liwusen/article/details/53384561 1.什么是ReactJS中的refs 在React中组件并不是真实的 DOM 节 ...
- Javascript 对象(object)合并
对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...
- CubieBoard 简单入门
大约一个月之前折腾的部分记录,当时没有完全完成,就着手其他事情了,这是存在Live Writer中的草稿,先发出来吧,后来花了一段时间移植Qt,一直遇到了点问题,并没有完全跑通,后续估计也没有时间再继 ...
- 算法:快速排序实现 & 定制比较函数
1. 快速排序基本算法 #include<stdio.h> ; int quick_sort(int *a, int start, int end){ if (start >= en ...
- linux中断
[一].中断底半部 1. 软中断 --->>> 执行在中断上下文 --->>> 会被中断打断,不会被软中断或进程打断 --->>> ...
- 技术向:一文读懂卷积神经网络CNN
转自:http://dataunion.org/11692.html 作者:张雨石 自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN), ...
- 查看LINQ Expression編譯後的SQL語法(转)
在用了LINQ語法之後的一個月,我幾乎把SQL語法全部拋到腦後了,不過 LINQ好用歸好用,但是實際上操作資料庫的還是SQL語法,如果不知道LINQ語法 編譯過後產生怎樣的SQL語法,一不小心效能就會 ...
- fn:replace()函数
fn:replace()函数将字符串中所有指定的子串用另外的字符串替换. 语法 fn:replace()函数的语法如下: ${fn:replace(<原始字符串>, <被替换的字符串 ...