一、什么是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. Qt单元测试

    单元测试之作用要完成测试用例,保证设计上的耦合依赖通过测试用例,保证覆盖率,提高程序质量 QTest一些有用的静态函数QTest::qExecQTest::qSleepQTest::qWait   例 ...

  2. 应该如何入门deep learning呢?从UFLDL开始!

    抱歉,大家,这里不是要分享如何学习deep learning,而是想要记录自己学习deep learning的小历程,算是给自己的一点小动力吧,希望各位业内前辈能够多多指教! 看到有网友提到,Andr ...

  3. play2 控制台打印乱码问题

    修改 play安装目录下,framework/build.bat java -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:Ma ...

  4. 【斜率DP】BZOJ 1911:特别行动队

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3006  Solved: 1360[Submit][Statu ...

  5. 【无聊放个模板系列】BZOJ 1597 斜率优化

    STL 双向队列DEQUE版本 #include<cstdio> #include<cstdlib> #include<cstring> #include<i ...

  6. [数论]ZOJ3593 One Person Game

    题意:一个人要从A走到B  只能走a布.b步.(a+b)步,可以往左或右走   问 最少要走几步,不能走到的输出-1 可以列出方程 $ax+by=A-B$ 或者 $ax+(a+b)y=A-B$ 或者 ...

  7. Repeater, DataList, 和GridView控件的区别

    http://blog.sina.com.cn/s/blog_646dc75c0100h5p6.html http://www.cnblogs.com/phone/archive/2010/09/15 ...

  8. mac中用命令行运行mysql

    1,安装mysql 在mysql的官方网站下载 mysql 5.5.23 http://www.mysql.com/downloads/mysql/,根据我的机器的配置情况选择了64bit版本. 2, ...

  9. jdbc操作mysql

    本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...

  10. HeadFirst设计模式之观察者模式

    一.什么是观察者模式 观察者模式定义了一系列对象间一对多的关系,当主题对象的状态发生变化时,会通知所有观察者 二.自定义观察模式 1. 2. package headfirst.designpatte ...