一、什么是Service

有些用时比较长得操作我们希望他在后台运行 ,不耽误我们当前的操作 。 这就引入了Service概念 。

常见的比如:访问网络 , 文件IO操作 , 大数据的数据库任务,播放音乐等 。

Service在后台运行,不与用户进行交互。在默认情况下,Service运行在应用程序进程的主线程中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些仸务放在单独的线程中处理,避免阻塞用户界面

二、Question

1,启动服务后,按Home键,服务是否还在运行?  Yes

2,启动服务后,退出进程,是否服务还会运行?    NO

3,启动服务,不用多线程,界面是否会阻塞?       Yes

4,服务是个新的进程么,服务是个新的线程么?

.服务不是一个新的进程,也不是一个新的线程 。 与当前进程绑定的

三、Service的分类

按照启动方式分类:

=== < Started Service > ===

1,startService()来启动

2,一旦启动,就运行在后台,即便启动它的对象(Activity)都销毁了

3,通常只启动,不返回值

4,通常网络上传或者下载,操作完成后,自动停止

=== onStartCommand() ===

< Bound Service >

1,bindService()来绑定

2,提供客户端服务器接口来启动

3,发送请求,得到返回值,甚至通过IPC来通讯

4,一个服务可以被多个调用者绑定,只要有一个绑定者,服务运行,所有绑定者都退出,服务退出

onBind()

按服务性质分:Local Service、Remote Service。

(1). 本地服务(Local Service):说白了就是在同一个apk内被调用。
(2). 远程服务(Remote
Sercie):被另外一个apk调用。

按实现方法分类:Java Service、Native Service。

四、生命周期

Service只有在系统资源不足的时候才有可能被系统销毁。值得注意的是:

Service如果正在bind状态,很少会被销毁,如果服务运行在前台,几乎不会被销毁。

五、创建及使用StartedService步骤

创建Service–继承android.app.Service实现自己的服务–必须在AndroidManifest.xml注册service必须在AndroidManifest.xml注册service

启动service–startService(i);

停止service–stopService(i);

1 继承Service类实现自己的服务

2 在AndroidManifest中注册服务

3 启动服务startService()

4停止服务stopService()   stopSelf()

onStartCommand()  返回值:

START_STICKY  START_NOT_STICKY  START_REDELIVER_INTENT

集成Service和IntentService的区别?

所有服务的基类,我们要实现服务就需要继承这个类
。IntentService:

异步处理服务
,新开了一个线程:HandlerThread

在线程中发消息
,然后接收

处理完成后
, 会清除线程 ,并且关掉服务 。

六、绑定及使用Boundservice的步骤 <介绍Binder>

Local BoundService

1 继承Service或者IntentService类实现自己的服务

2 在AndroidManifest中注册服务

3 绑定服务bindService()

4 取消绑定服务unbindService()

Messenger

AIDL

【FAQ:思考】

boundService  - 绑定(onBind)和连接(onServiceConnected)两个方法谁先执行?  onBind

相类似的onUnBind 和 onServiceDisconnected呢?
onUnBind

理解清楚了binder的作用么?

七、StartedService & BoundService 区别

两种服务最本质区别

boundService 其实是有一个客户端,服务器端的概念。借助于Binder
来通讯。

1,StartedService 和启动它的Activity不同生共死

BoundService 和启动它的Activity同生共死

2,无论是start or bind ,只要service没有实例化,就都会被create 
。 但start 每次都会调用onStartCommand 
。bind , 则如果已经绑定,就不再调用onBind了

八、在前台运行服务

何时会用到前台服务?

有的时候
, 我们不希望后台服务被系统在资源不够用的时候杀死,所以就会把服务设定为前台服务

比如音乐播放器,在后台播放的时候,我们就不希望被杀死

启动方式:startForground(int , notification)。

九、扩展:Native Service  (详见下一章节)

什么是Native Service

何时会用到Native Service

如何调用

十、扩展:Service运行中如何与用户交互

Toast Notification

StatusBar Notification

十一、如何在Service和线程之间选择?

1 Service是一个很方便的组件让你运行后台操作,并且不影响当前操作。

2当你需要在你当前操作的时候另外起一个更独立操作时候可以考虑线程,比如当前程序不关闭的情况下运行音乐。

3从逻辑上你认为需要一个后台操作,但跟我们现在主线程操作通讯频繁,逻辑关系紧密,就用多线程(直接用)。

4能够从逻辑上区分开来,就用后台服务。

十二、FAQ:思考

1>Service是一个新的进程或者新的线程么?

2>startedService 和
boundService区别?

3>activity和service是否在同一个进程和线程中?

默认情况下,这两个组件都在同一个进程中,但是不是同一个线程,activity为前台进程,service是后台进程,当android系统资源紧张的时候davlik虚拟机会首先寻找前台进程进行资源的释放,其次才是一些后台进程,所以通常我们把长时间运行的模

6、四大组件之二-Service初步的更多相关文章

  1. Android 四大组件之二(Service)

    service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...

  2. [Android四大组件之二]——Service

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  3. 11、四大组件之二-Service高级(二)Native Service

    一.Service的分类 1.1>Android Service 使用Java编写在JVM中运行的服务 1.2>Native Service 使用C/C++完成的服务,一般在系统开始时完成 ...

  4. 7、四大组件之二-Service高级

    一.Native Service 1>什么是Native Service 使用JNI编写,在系统启动完成之前启动的系统级服务. 2>哪些服务是Native Service ACCESSIB ...

  5. Android四大组件之服务-Service 原理和应用开发详解

    一.Android 服务简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Acti ...

  6. Android四大组件初识之Service

    Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...

  7. 入职小白随笔之Android四大组件——服务(Service)

    Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...

  8. Android四大组件之一:Service(服务)

    Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...

  9. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

    转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...

随机推荐

  1. Cocos-x 3.2:从C++过渡到Lua(转载)

    原文总结的非常好,都是我们学cocos2d-x以来摸索过的东西,如果早有这篇文章就能少走不少弯路了,特此截屏保存.原文链接:http://shahdza.blog.51cto.com/2410787/ ...

  2. springmvc 数据对象回绑

    springmvc中,由页面 post到 controller,对象可以在form里面设置modelAttribute达到回绑的目的. 但是如果对象里面有复杂的非String,int的对象,则要在co ...

  3. E437: terminal capability "cm" required

    执行 vi 的时候出现:E437: terminal capability "cm" required 临时解决: export TERM=xterm

  4. [scalability] Find all documents that contain a list of words

    Given a list of millions of documents, how would you find all documents that contain a list of words ...

  5. leetcode 练习1 two sum

    leetcode 练习1  two sum whowhoha@outlook.com 问题描述 Given an array of integers, return indices of the tw ...

  6. 解析php中die(),exit(),return的区别

    die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值die是遇到错误才停止exit是直接停止,并且不运行后续代码,exit()可以显示内容.return就是纯粹的返回 ...

  7. linux top动态查看进程信息

    来源<鸟哥的linux私房菜> top:动态观察程序的变化 [root@linux ~]# top [-d] | top [-bnp] 参数: -d :后面可以接秒数,就是整个程序画面更新 ...

  8. highcharts 多数据+切换

    var highchartsOptions = { chart:{ renderTo:'container' }, title:{ text:'指标数据' }, tooltip:{ pointForm ...

  9. 使用JavaMail发送邮件和接受邮件

    转载:http://blog.csdn.net/zdp072/article/details/30977213 一. 为什么要学习JavaMail 为什么要学习JavaMail开发? 现在很多WEB应 ...

  10. Servlet课程0425(四) Servlet实现简单用户登录验证

    Login.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class ...