一、Service的作用

主要用于在后台处理一些耗时的逻辑操作,或者去执行某些长期运行的操作。

二、Service的创建

1.主要方法

IBinder onBind(Intent intent):必须实现方法。返回一个IBinder对象,程序通过该对象与Service交互

(Service类似Activity有自己的生命周期)

void onCreate():当Service第一次被创建的时候回调

void onDestroy():当Service被关闭的时候回调

int onStartCommand(Intent intent, int flags,int startId) :每次调用startService(int)→(启动Service的方法)时候回调

返回值

1):START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。 
2):START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务 
3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。 
4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

参数flags(表示启动服务的方式):

START_FLAG_REDELIVERY:如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作, 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent。这样如果你的服务在处理它的时候被Kill掉, Intent不会丢失. 
START_FLAG_RETRY:表示服务之前被设为START_STICKY,则会被传入这个标记。 
启动service的时候,onCreate方法只有第一次会调用,onStartCommand和onStart每次都被调用。onStartCommand会告诉系统如何重启服务,如判断是否异常终止后重新启动,在何种情况下异常终止.

boolean onUnbind():与绑定的所有客户端断开连接(Service可与Activity绑定 稍后讲)的时候回调

2.调用流程——跟Activity类的创建相似

①子类继承Service,重写方法

②在AndroidManifest.xml注册(因为需要用Intent启动Service,所以Service类必须注册)

③调用启动方法启动Service(详见3.启动Service)

3.启动Service

类别 区别
1.startService 启动的服务

主要用于启动一个服务执行后台任务,不进行通信(无绑定与无法交互)。

停止服务使用stopService。

在Activity所在进程被Kill的时候,该服务依然在运行

2.bindService 启动的服务

该方法启动的服务要进行通信(与绑定的Acitivty交互)。

停止服务使用unbindService。

主进程被Kill后,服务便会终止。

3.startService 同时也 bindService 启动的服务 停止服务应同时使用stopService与unbindService(顺序由创建顺序决定)
 注:每种方法的生命周期也是不同的  详见4.Servier的生命周期                为什么需要这么多种Service详见  6.两种方法的用处

①方法一的启动与关闭(startService)

步骤一:

  1. /*步骤一:子类继承Service类*/
  2. public class LocalService1 extends Service {
  3.  
  4. /**
  5.  
  6. * onBind 是 Service 的虚方法,因此我们不得不实现它。
  7.  
  8. * 返回 null,表示客服端不能建立到此服务的连接。
  9.  
  10. */
  11.  
  12. @Override
  13.  
  14. public IBinder onBind(Intent intent) {
  15.  
  16. return null;
  17.  
  18. }
  19.  
  20. @Override
  21.  
  22. public void onCreate() {
  23.  
  24. super.onCreate();
  25.  
  26. }
  27.  
  28. @Override
  29.  
  30. public void onStartCommand(Intent intent,int flag, int startId) {
  31.  
  32. super.onStart(intent, flag,startId);
  33.  
  34. }
  35.  
  36. @Override
  37.  
  38. public void onDestroy() {
  39.  
  40. super.onDestroy();
  41.  
  42. }
  43.  
  44. }

步骤二:

  1. <service android:name=".LocalService1">
  2. <!--intent-filter可设可不设 跟注册Activity的方式是一样的-->
  3. <intent-filter>
  4. <action android:name="com.chen.service.First_Service"/>
  5. </intent-filter>
  6. </service>

步骤三:

  1. // 启动一个 Service
  2. Intent intent = new Intent();
  3. intent.setAction("com.chen.service.First_Service");//设置Intent
  4. startService(intent);
  5.  
  6. ...
  7.  
  8. // 停止一个 Service
  9.  
  10. stopService(intent);

②方法二的启动与关闭(bindService)
启动方法:bindService(Intente service,ServiceConnection conn,int flags);

service:intent对象

conn:监听绑定者与Service的状况。当连接成功时回调该对象的onServiceConnected(ComponentName name,IBinder service)方法。

失败时候调用onServiceDisconnected(ComponextName name)(注:用unBindService()方法断开并不会被调用)。

注:onServiceConnected返回的IBinder对象是Service类中的onBind(Intent intent)的返回值

flags:指定绑定是是否自动创建Service(如果Service还未创建)   0(不自动创建)或 BIND_AUTO_CREATE(自动创建)

步骤一:借用方法一的步骤一经过修改

  1. //未修改部分
  2. @Override
  3.  
  4. public IBinder onBind(Intent intent) {
  5.  
  6. return null;
  7.  
  8. }
  9.  
  10. //修改部分
  11. private int count = 5;
  12.  
  13. public class MyBinder extends Binder{
  14. public int getCount(){
  15. //获取当前Service的count值;
  16. return count;
  17. }
  18. }
  19.  
  20. @Override
  21. public IBinder onBind(Intent intent) {
  22.  
  23. return new MyBinder;
  24.  
  25. }

步骤二:在Activity中启动并绑定Service

  1. LocalService1.MyBinder binder;//定义Binder,获取Service的Binder。因为是内部类
  2.  
  3. //定义一个ServiceConnection对象
  4. private ServiceConntection connection = new ServiceConnection(){
  5. @Override
  6. public void onServiceConnected(ComponentName name, IBinder service) {
  7. mMyBinder = (LocalService1.MyBinder)service;//获取binder
  8. Log.d("MainActivity","Service is connected");
  9. }
  10.  
  11. @Override
  12. public void onServiceDisconnected(ComponentName name) {
  13. Log.d("MainActivity","Service is disconnect");
  14. }
  15. };
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. Intent intent = new Intent(this,LocalService1.class);
  22. bindService(intent,mConnection,BIND_AUTO_CREATE);//绑定到程序
  23.  
  24. int count = mBinder.getCount();//利用Binder获取Service内部信息
  25. }
  26.  
  27. @Override
  28. protected void onDestory(){
  29. unbindService(conn);//解除绑定
  30. }

4.不同方法的生命周期

①.调用startService(左图),调用bindService(右图)

注:当多次调用startService方法:系统只会调用onStartCommand()方法

当多次调用bindService方法:系统只会调用onBind()方法

隐藏方法:onRebind()  产生条件:1.由startService()方法启动 2.重写onUnbind方法 return true

②先调用startService()再调用bindService()方法,再调用unbindService()

生命周期:onCreate()->onStartCommand()->onBind()->onUnbind()[重写时reuturn true]->onRebuild()

但是发现没有调用onDestory()方法:说明bindService()只是通信绑定在Acitivty,但生命周期并不与Activity绑定。(这就可以又能交互又能不在Activity消失后Service也跟着消失)

5、在什么情况下使用 startService 或 bindService 或 同时使用startService 和 bindService

如果你只是想要启动一个后台服务长期进行某项任务那么使用 startService 便可以了。

如果你想要与正在运行的 Service 取得联系,那么有两种方法,一种是使用 broadcast ,另外是使用 bindService ,前者的缺点是如果交流较为频繁,容易造成性能上的问题,并且 BroadcastReceiver 本身执行代码的时间是很短的(也许执行到一半,后面的代码便不会执行),而后者则没有这些问题,因此我们肯定选择使用 bindService(这个时候你便同时在使用 startService 和 bindService 了,这在 Activity 中更新 Service 的某些运行状态是相当有用的)。

另外如果你的服务只是公开一个远程接口,供连接上的客服端(android 的 Service 是C/S架构)远程调用执行方法。这个时候你可以不让服务一开始就运行,而只用 bindService ,这样在第一次 bindService 的时候才会创建服务的实例运行它,这会节约很多系统资源,特别是如果你的服务是Remote Service,那么该效果会越明显(当然在 Service 创建的时候会花去一定时间,你应当注意到这点)。

6、两种办法的具体用处

类别 区别 应用
前台服务 会在通知一栏显示 ONGOING 的 Notification, 当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。
后台服务 默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。 当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。

7.与Thread的区别 详见  http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html

疑问:Service用startService()能不能在应用程序退出的时候执行。如果能的话Remote Service是干什么用的。

Service(Local Service)简介的更多相关文章

  1. (转)内置系统账户:Local system/Network service/Local Service 区别

    最近会转载一些 MSSQL 基础相关的文章. 参考文献: http://www.cnblogs.com/xianspace/archive/2009/04/05/1429835.html 前言 今天在 ...

  2. Local System/Network Service/Local Service

    // The name of the account under which the service should run// 1 NT AUTHORITY\\SYSTEM 2 NT AUTHORIT ...

  3. [转帖]内置系统账户:Local system/Network service/Local Service 区别

    内置系统账户:Local system/Network service/Local Service 区别 学习使用 xp_cmdshell 的时候 发现必须 sqlserver 的服务运行在local ...

  4. 内置系统账户:Local system/Network service/Local Service 区别

    参考文献: http://www.cnblogs.com/xianspace/archive/2009/04/05/1429835.html 前言 今天在安装sqlserver2008 r2的时候,在 ...

  5. Windows内置系统账户:Local system/Network service/Local Service 区别

    LocalSystem 账户  LocalSystem是预设的拥有本机所有权限的本地账户,这个账户跟通常的用户账户没有任何关联,也没有用户名和密码之类的凭证.这个服务账户可以打开注册表的HKEY_LO ...

  6. SSRS2:Reporting Service 配置Service Account

    1,Service Account SSRS以一个Service方式实现,有三部分组成:Web Service,Report Manager和一个后台的进程,这个Service运行的账号就是Servi ...

  7. Local System、Local Service與Network Service

    CreateService参数介绍SC_HANDLE CreateService( SC_HANDLE hSCManager, //服务控制管理程序维护的登记数据库的句柄,由系统函数OpenSCMan ...

  8. Android中Local Service最本质的作用是什么?

    把Service等同于thread或process是一个非常常见的误解.需要强调又强调的第一点是,Android的Service是一个Context,并不必然等于一个额外的thread.如果你有仔细看 ...

  9. sql server Local Service, Local System or Network Service

    local system account local system 选项指定一个不需要密码的本地系统账号去连接同一台电脑的sql server.local system account会限制sql s ...

随机推荐

  1. oracle函数trunc的使用

    1.日期比较时精确到日,可以使用 TRUNC(sysdate,'dd')函数.函数支持格式有:yyyy MM  dd  hh Mi可以用   select TRUNC(sysdate,'yyyy') ...

  2. 配置Apache2 管理 SVN

    软件环境:CentOS-7-x86_64 1.安装 mod_dav_svn   模块 2.在Apache2下增加管理配置,如: cd /etc/httpd/conf.d vim subversion. ...

  3. 【Android类型SDK测试(二)】环境基础

    (一)语言 Android使用的Java语言,所以要测试Android类型的SDK,Java的基础知识还是需要的. 另外,Android中有NDK类型的编程,需要知道C相关的知识. (二)环境准备 A ...

  4. windows系统部署discuz并和javaweb账号连通同步

    一.Discuz安装说明 1.安装wamp集成环境 (1)下载wampserver集成环境 网址:(http://wampserver-64bit.en.softonic.com)或百度搜索下载 (2 ...

  5. BottomSheetBehavior 之 java.lang.IllegalArgumentException: The view is not associated with BottomSheetBehavior

    AndroidRuntime: FATAL EXCEPTION: main Process: me.chunsheng.uberdriver, PID: 13674 java.lang.Runtime ...

  6. Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务

    第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...

  7. ASP.net(C#)批量上传图片(完整版)

    摘自:http://www.biye5u.com/article/netsite/ASPNET/2010/1996.html   这篇关于ASP.Net批量上传图片的文章写得非常好,偶尔在网上看到想转 ...

  8. 对DTU系统结构的重新思考

        从决定做DTU开始无时无刻不在对这个新的产品系统进行思考,从最开始的ucos多任务结果到QPC基 于事件回调的软件结果,再到现在准备结合两者使用QPC+freeRTOS的系统结构.     原 ...

  9. COB對PCB設計的要求

    由於COB沒有IC封裝的leadframe(導線架),而是用PCB來取代,所以PCB的焊墊設計就便得非常的重要,而且Fihish只能使用電鍍金或是ENIG(化鎳浸金),否則金線或是鋁線,甚至是最新的銅 ...

  10. 《how to design programs》9.3处理任意长度的表

    假定一个玩具商店要把货物库存清单存放在计算机之中,这样,店里的员工就可以快速判断商店里是否还有某种玩具存货.简言之,商店需要一个能够检查库存是否含有玩具'doll 的函数contains-doll?, ...