Android高级开发第四讲-API之Service

Android高级开发第四讲--API之Service博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rig

Android高级开发第四讲--API之Service

博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 


今天主要跟大家翻译一下Service的内容,请慢慢阅读!


Service是一个应用组件,它可以在后台长时间的运行,而不产生用户界面。

一个应用程序可以开启一个Service,即使切换到另外一个应用程序,它依然会继续执行。
此外,一个组件可以绑定一个Service并与它进行交互,甚至进行进程间的通信(IPC)。
例如,一个Service可以处理网络传输,播放音乐,执行文件I/0流,或者与Cotnent Provider进行交互,这所有一切都是在后台进行的。


Service基本上有两种形式
Started
当一个应用程序组件(如Activity)调用"startService()"时,Service被开启。一旦开始,它就会一直在后台运行下去,即使创建它的组件已经被销毁。
通常情况下,启动的Service会执行一个单一的操作,不会返回结果给调用者。例如,它可以通过网络上传下载文件,操作结束后,服务就应该被停止。
Bound
当一个应用程序组件调用"onBind()"时,Service被绑定。一个绑定的Service提供客户端-服务端接口,允许组件与Service进行交互,发送请求,得到结果,进行进程间的通信(IPC)。
当一个应用程序组件绑定它的时候,它才正式开启。多个组件可以同时绑定到一个Service上,当所有组件解绑("unbind()")后,Service会被马上销毁。
虽然这篇文章分析了Service的两种类型,但两者也可以同时使用,它可以被启动(无限期运行),也可以绑定运行。
这是一个简单的问题,在于你是否实现了一个双向回调方法。通过"onStartCommand()"方法可以开户并绑定当前的Service。


无论你的Service被开启,绑定或者两者都进行了,每一个应用程序组件都可以使用它(甚至是两个不同的应用程序),同时每一个应用程序都可以用一个activity通过Intent来启动它。
然而,你可以通过mainifest文件将Service设为私有,阻止其他程序访问。接下来是更多讨论在mainifest文件声明Service的一部分。

注意:Service运行在设备进程的主线程中,Service不会创建自己的线程,也不运行在一个单独的进程里(除非你另有指定)。这就意味着如果你的Service要进行CPU密集型工作或阻塞操作(如播放MP3或网络服务),你需要为这个Service提供一个新的线程来继续工作。使用一个新的线程,就可以减少应用程序不反应(ANR)错误和使主线程能致力于Activity与用户之间的交互。

最基本的
你应该用一个Service还是一个线程
Service是一个可以在后台运行甚至用户没有与当前的应用程序交互的


组件。因此,当你需要时你可以创建这样一个Service。
如果你需要在主线程外执行工作,但只在用户交互时,这时你最好创建


一个线程而不是一个Service。举例:如果你想播放一些音乐,只有当


这些Activity在运行的时候,你可以在onCreate()方法里创建一个线程


,在onStart()方法里运行,在onStop()方法里结束。也可以考虑


AsyncTask和HandlerThread,取代传统的线程类。参考进程和线程文档


获得更多有益信息。
记得当你使用Service时,它仍然默认在你应用主线程里运行,所以当


你要处理一些密集或阻塞操作时,要在Service里再创建一条线程。
为创建一个Service,你必须创建一个Service子类(或已存在的子类)


。在你的实现方法里,你需要重写一些处理Service生命周期关键方面


的回调方法,如果适应的话。最重要的回调方法莫过于以下几个:
onStartCommand()
当另一个组件像Activity需要通过startService()来启动Service的时候,系统会调用这个方法。一旦这个方法执行了,Service就立马启动,并在后台开始运行。当你实现它们,你要在工作停止时停止Service,就要调用stopSelf()或者stopService()方法(如果你只想提供绑定,那你就不需要实现这个方法)。
onBind()
当另一个组件如执行RPC需要通过bindService()方法绑定Service时,系统会调用这个方法。在你的实现方法里,你必须提供一个接口,用作客户端与Service进行交流,并返回一个IBinder对象。你必须实现这个方法,但如果你不允许绑定,那么你可以返回null。
onCreate()
当Service第一次被创建时,系统会调用它,来执行一次启动程序(在调用onStartCommand()或onBind()方法之前)。如果你的Service已经存在,则这个方法不会被调用。
onDestroy()
当Service不再被使用时,系统会调用这个方法来销毁Service。你的Service需要实现这个方法用来清除如线程,注册的监听器,通知等等一些资源。这是Service最后接收的一个回调方法。如果一个组件通过startService()来启动一个Service(同时也会调用onStartCommand()),那Service仍然会保持运行直到调用stopSelf()来停止它或另一个组件调用stopService()来停止它。
如果一个组件调用bindService()方法来创建一个Service(同时onStartCommand()方法没有被调用),那么Service只在这个组件处于激活状态时才运行。一旦客户端解绑了Service,系统就会销毁它。