android Service 启动讲解

转载 2013年12月04日 16:50:14
有了 Service 类我们如何启动他呢,有两种方法:

• Context.startService()

• Context.bindService() 

1.  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。
另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。
 
2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。 

总结: 
1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。
2.  bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服务)。
由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。

与 Service 通信并且让它持续运行 

如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。

提高 Service 优先级 
Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。

为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。

摘自网络其他资料:关于Service生命周 

Android Service生命周期与Activity生命周期是相似的,但是也存在一些细节上也存在着重要的不同:
 
onCreate和onStart是不同的 通过从客户端调用Context.startService(Intent)方法我们可以启动一个服务。如果这个服务还没有运行,Android将启动它并且在onCreate方法之后调用它的onStart方法。

如果这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。所以对于单个运行的Service它的onStart方法被反复调用是完全可能的并且是很正常的。
 

onResume、onPause以及onStop是不需要的
 回调一个服务通常是没有用户界面的,所以我们也就不需要onPause、onResume或者onStop方法了。无论何时一个运行中的Service它总是在后台运行。
onBind 如果一个客户端需要持久的连接到一个服务,那么他可以调用Context.bindService方法。如果这个服务没有运行方法将通过调用onCreate方法去创建这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,并且它返回一个IBind对象以便客户端稍后可以调用这个服务。同一服务被客户端同时启动和绑定是很正常的。

onDestroy 与Activity一样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与很多Activity时的情况一样,当内存很低的时候Android也可能会终结一个服务。如果这种情况发生,Android也可能在内存够用的时候尝试启动被终止的服务,所以你的服务必须为重启持久保存信息,并且最好在onStart方法内来做。

Android Service的启动过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会...
  • qq_35114086
  • qq_35114086
  • 2016年10月15日 19:51
  • 540

显式和隐式启动Activity、Service

Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。隐式Intent:通过Inte...
  • what93
  • what93
  • 2016年01月06日 15:29
  • 2877

Android四大组件之Service工作原理

Servie的工作过程 As we all know, Service分为两种工作状态,一种是启动状态,主要用于执行后台计算,另外一种是绑定状态,主要用于其他组件和Service交互。需要注意的是Se...
  • tianmi1988
  • tianmi1988
  • 2016年03月19日 20:42
  • 1160

Android使用Intent启动Service的Intent必须是显式的

今天使用Intent来启动Service时,代码如下: //为 Intent设置Action属性 intent.setAction("com.hust.service"); ...
  • tuke_tuke
  • tuke_tuke
  • 2016年01月25日 15:39
  • 3769

android中判断service是否已经启动

在写一款音乐播放器时,发现如果不判断service是否启动,每次进入本地歌曲的界面时由于重新加载就会造成重复startService的现象,后台播放的歌曲就会停止,所以我们需要先判断如果service...
  • u013926110
  • u013926110
  • 2015年06月09日 01:45
  • 5756

Android Service两种启动方式详解(总结版)

Service生命周期.png 第一种方式:通过StartService启动Service 通过startService启动后,service会一直无限期运行下去,只有外部调用了stopServic...
  • imxiangzi
  • imxiangzi
  • 2017年07月25日 06:10
  • 777

如何实现跨应用启动Service

跨应用启动Service需要注意的地方有2点: 1.目标service需要声明exported=true 的属性,表示允许其他应用访问该服务. 2.android5.0之前是可以通过设置隐式意图来跨...
  • mChenys
  • mChenys
  • 2015年11月01日 23:03
  • 5633

android在Fragment中启动服务

1.startService(new Intent(getActivity(),mService.class));2.getActivity().startService(new Intent(get...
  • u011710991
  • u011710991
  • 2016年01月22日 21:44
  • 2848

Android 服务两种启动方式的区别

Service是Android四大组件之一,也是可执行的程序,有自己的生命周期。创建、配置Service和创建、配置Activity的过程相似。和Activity一样,都是从Context派生出来的。...
  • syc434432458
  • syc434432458
  • 2016年04月19日 21:37
  • 5675

android开发 使用Action启动/关闭Service

前面有用使用Intent来控制  Service 使用的参数是Service的类 Service的启动/关闭还有另外一种方式来控制 通过Intent传入Action的参数  ...
  • zzzzyu
  • zzzzyu
  • 2014年12月19日 14:50
  • 8755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android Service 启动讲解
举报原因:
原因补充:

(最多只允许输入30个字)