Service的理解
Service的理解
Service是什么?
Service是一种可以在后台运行相关任务的组件。没有界面。其存在的线程是主线程,一般会通过启动子线程来执行耗时操作。
Service有什么用?
可用于在后台执行下载任务。从而不影响用户界面操作。
Service分启动型服务、绑定型服务两种。
绑定服务中的创建Binder的扩展类的目的是什么?
该类主要用于获取Service的实例,以及执行相关的方法。
额外知识
1.不绑定服务,直接点击取消绑定服务会报错。因此需要通过判断Binder对象是否为空来处理。
2.服务可以不定义Action,通过Intent指定要跳转的Service即可。
3.Service的有效范围是所有满足条件的Activity。
4.在Service里执行耗时操作会导致ANR,启动新的线程执行耗时操作可有效避免。
两种服务的区别
| Service类型 | 说明 | 使用步骤 |
|---|---|---|
| 启动型服务 | 1.生命周期为onCreate->onStartCommand->onDestroy 2.服务一旦启动后,需要调用stopService方法或stopSelf方法才能停止。 3.可常驻系统。 |
1.通过调用startService启动服务 2.通过stopService停止服务 |
| 绑定型服务 | 1.生命周期为onCreate->onBind->onUnbind->onDestory 2.需要返回Binder对象,即定义Binder的子类。 3.通过Binder子类的方法来获取Service对象,用于与Activity交互。 4.在Activity中需要通过创建ServiceConnection对象来获取service实例。从而调用service里的方法。 |
1.通过bindService绑定服务 2.通过unbindService取消绑定服务 |
Service生命周期
![]()
Service的类型及其示例
启动型服务 - StartService
使用
1.创建java类继承Service
2.重写onStart、onCreate等方法。
3.在onCreate中新开子线程,用于执行任务。
示例 - 启动型服务
Service作用
打印0-2000的数字,完毕后停止服务
1 |
public class CalcService extends Service {
|
1 |
// Activity中的代码 |
绑定型服务 - BindService
BindService(Intent,ServiceConnection,Context.BIND_AUTO_CREATE)
参数分别为Intent,ServiceConnection,标识号。通常为BIND_AUTO_CREATE。
使用
1.创建java类继承Service
2.创建Java类继承Binder类。用于返回Service实例。
3.重写onBind、onUnBind等方法。
4.在Activity中创建ServiceConnection对象,并获取Binder实例。
ps:为防止未绑定服务,用户点击取消绑定而导致的崩溃。需要对unbindService进行边缘性处理。
示例 - 普通绑定型服务
1 |
public class BindService extends Service {
|
Activity中的代码
1 |
private ServiceConnection connection = new ServiceConnection() {
|
示例 - 绑定型远程服务
理解
如何定义远程服务?
在配置文件中添加代码android:progress=”:remote”即可
为什么设置了Service为远程Service就不会导致ANR了?
远程服务是指将服务放到另一个进程中执行,所以就不会导致程序的ANR现象。
如何跨进程与Activity进行通信? 见示例
如何实现跨程序通信?
示例 - 实现跨进程与Activity交互
步骤
1.创建aidl文件,定义接口(TestInterface)及相关方法。点击make project,自动生成Stub相关的接口。
2.创建Service类,并在ManiFest文件设置远程属性。android:process=”:remote”
3.在Service中创建接口TestInterface.Stub 对象,重写接口方法。
4.在Activity中通过AIDL接口的asInterface方法来获取AIDL对象。
5.利用接口对象调用相关方法。
1 |
// 创建aidl文件,定义接口。 |
1 |
// 配置服务远程属性 |
1 |
// Service中创建远程接口的Stub对象 |
1 |
// Activity中调用远程接口的方法 |
示例 - 实现跨程序与Activity交互
步骤
实现步骤跟上面类似。只是需要为Service定义Action,以及将AIDL接口及其包名复制到另一程序中。即可实现跨程序交互。
IntentService
理解
为什么有这个类?
该类是Service的子类,主要是简化了异步操作繁琐复杂的代码。
有什么特点?
1.不需要自己创建子线程。
2.不需要考虑何时关闭服务。
使用情景是什么?
多次调用startService。
使用
1.Service继承IntentService。
2.以类名为参数调用父类构造方法。
3.重写onHandleIntent核心方法以及其他方法。
前台服务
什么是前台服务?
普通服务在内存不足的情况下会被系统杀掉,而前台服务不会因为内存不足而被杀掉。
前台服务有什么特点?
前台服务有通知栏提示,可设定相关的标题、提示灯。例如天气、播放器等。
前台服务的使用
1.构建Notification对象。
2.通过startForeground方法启动通知栏。
3.通过stopForeground方法关闭通知栏。
注意
Notification的构建中,若不调用setSmallIcon方法设置Icon,其他相关设置(标题、提示)均无效。
1 |
@Override |
Service的理解的更多相关文章
- 【Java】对Web Service的理解
WSDL(Web Service Description Language)是描述Web Service的语言. 你会怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你 ...
- Java Web Action DAO Service层次理解
参考来源:http://blog.csdn.net/inter_peng/article/details/41021727 1. Action/Service/DAO简介: Action是管理业务(S ...
- Springboot的entity,dao,controller,service层级理解
1.Dao层:持久层,主要与数据库交互 DAO层首先会创建Dao接口,接着就可以在配置文件中定义该接口的实现类:接着就可以在模块中调用Dao的接口进行数据业务的处理,而不用关注此接口的具体实现类是哪一 ...
- web service的理解
http://blog.csdn.net/u011075267/article/details/41522643
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- Android组件系列----Android Service组件深入解析
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android应用开发基础篇(6)-----Service
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/20/2360336.html 一.概述 我们知道,Service是Android的四大组件之一. ...
- service and intentservice
Service是Android中四大组件之一,在Android开发中起到非常重要的作用,先来看一下官方对Service的定义: A Service is an application componen ...
- 关于Service中bindService注意的几个问题
最近有用到Activity需要不断的从Service中获取数据,第一个想法肯定就是通过bind回调机制了,有几点概念模糊特此记录下: 单独使用bindService(),unbindService() ...
随机推荐
- iOS 如何在一个应用程序中调用另一个应用程序
原则上iOS的沙箱原理,是阻止一个app去访问其他app的资源乃至是系统底层的资源的但是我们可以通过一种变相的方式:通过对应的URL模式和其他程序进行通讯. iOS应用之间的调用步骤: 一, 调用自己 ...
- Go语言性能优化
原文:http://bravenewgeek.com/so-you-wanna-go-fast/ 我曾经和很多聪明的人一起工作.我们很多人都对性能问题很痴迷,我们之前所做的是尝试逼近能够预期的(性能) ...
- IO流入门-第八章-BufferedWriter
BufferedWriter基本用法和方法示例 import java.io.*; public class BufferedWriterTest01 { public static void mai ...
- > >> 将错误输出到文件
将错误输出到文件 转载:https://blog.csdn.net/woshinia/article/details/18040063 1.覆盖写入: echo "日志内容" & ...
- Linux环境安装nodejs
安装node 去官网下载nodejs 根据下载的文件可以看出它的压缩方式是.xz的方式,所以不能直接使用linux命令tar直接下载. xz -d node-v10.6.0-linux-x64.tar ...
- AngularJS 笔记之创建服务方式比较 : factory vs service vs provider 。
首先说一下服务这个东西是用来干嘛的.很多时候我们把太多的数据和逻辑都一股脑儿地往 controller 里放.这样我们的 controller 原来越臃肿.从它们的生命周期可以发现,其实 contro ...
- Codeforces Round #302 (Div. 2)
A. Set of Strings 题意:能否把一个字符串划分为n段,且每段第一个字母都不相同? 思路:判断字符串中出现的字符种数,然后划分即可. #include<iostream> # ...
- 看github上有18万star的第一开源项目如何教你学前端编程的
作为 Github | star 第一开源项目,已经超过18万 star:比之前最火的bootstrap的10万star还要多出8w,freeCodeCamp 越来越受关注,建站两年时间不到已经近40 ...
- 算法:LRU(最近最少使用)
算法:LRU(最近最少使用) 本文参考自小灰文章:https://mp.weixin.qq.com/s/B5xiVeW22ZumbI9KfrYJSg LRU算法 什么是LRU算法 LRU算法又称最近最 ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会 F - Color it (扫描线)
题意:一个N*M的矩形,每个点初始都是白色的,有Q次操作,每次操作将以(x,y)为圆心,r为半径的区域涂成黑点.求最后剩余白色点数. 分析:对每行,将Q次操作在该行的涂色视作一段区间,那么该行最后的白 ...