Android之---Service介绍
来源:互联网 发布:什么牙刷好 知乎 编辑:程序博客网 时间:2024/06/06 18:27
Service—Android四大组件之一
简介
Service是Android的四大组件之一,它是用来进行后台操作的,它并不为用户提供界面,所有的操作都在后台完成,它的所有操作对用户都是不可见的。一旦其他的组件启动了一个Service,它会在后台一直运行,即便是用户切换到了其他的应用中。其他的组件也可以绑定Service进而启动一个Service,甚至可以用它来进行IPC(进程通信,inter process communication). Service可以进行的操作有很多,比如说网络通信,音乐播放,文件的I/O操作,以及和Content Provider进行交互。
Service生命周期图
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径:
Service的启动方式
A started service
被开启的service通过其他组件调用 startService()被创建。
这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。
当service被停止时,系统会销毁它。
A bound service
被绑定的service是当其他组件(一个客户)调用bindService()来创建的。
客户可以通过一个IBinder接口和service进行通信。
客户可以通过 unbindService()方法来关闭这种连接。
一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
这两条路径并不是完全分开的。
即是说,你可以和一个已经调用了 startService()而被开启的service进行绑定。
比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。
注意: Service是运行于寄主进程的主线程中,也就是说,一个Service启动的时候,它不会创建一个新的线程,也不会新开一个进程,除非你自己开一个进程。所以当你使用Service进行一些耗费CPU的操作时,最好新开一个线程,以减少ANR错误。
A bound service详解:
当绑定service和所有客户端解除绑定之后,Android系统将会销毁它,(除非它同时被onStartCommand()方法开启)。
因此,如果你的service是一个纯粹的绑定service,那么你不需要管理它的生命周期。
然而,如果你选择实现onStartCommand()回调方法,那么你必须显式地停止service,因为service此时被看做是开启的。
这种情况下,service会一直运行到它自己调用 stopSelf()或另一个组件调用stopService(),不论它是否和客户端绑定。
另外,如果你的service被开启并且接受绑定,那么当系统调用你的 onUnbind()方法时,如果你想要在下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你可以选择在 onUnbind()中返回true。
onRebind()的返回值为void,但是客户端仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。
下图展示了这种service(被开启,还允许绑定)的生命周期:
Service实现类
实现一个MyService必须继承自Service类,如下:
package com.example.administrator.myservice;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); }}
Service生命周期回调方法
onBind()
当其他的组件使用bindService()绑定Service的时候,这个方法会被调用。如果你实现了这个方法,你必须提供一个接口供客户端和这个Service通信,这时会返回一个IBinder对象。实际在编程的时候,你必须要实现这个方法,但是如果你不想要其他的组件绑定到这个Service上,你可以返回一一个空值。
onCreate()
当Service第一次被创建时,这个方法会被调用,如果这个Service已经在运行了,就不会调用这个函数。
onStartCommand()
当其他的组件,比如Activity,调用startService()方法启动Service的时候,就会调用这个方法。一旦这个方法执行了,service开始了,并且在后台运行。如果你实现了这个方法,当所有的工作完成之后,你应当调用stopSelf()方法或者是stopService()方法来结束这个Service。(如果你只是想绑定这个Service,那就不要实现这个方法)
onDestroy()
当Service不再运行,并且被销毁,就会调用这个方法。在这个方法中应当清理Service所占用的所有系统资源,比如线程,注册的监听器,接收器等。这个方法是Services生命周期中最后被调用的方法。
参考资料
API Guides:Services
http://developer.android.com/guide/components/services.html
API Guides:Bound Services
http://developer.android.com/guide/components/bound-services.html
- Android之---Service介绍
- Android之Service介绍
- android之Service介绍之一
- android之Service介绍之一
- android之Service介绍之一
- android之service简单介绍
- android之Service介绍之二 AIDL
- android之Service介绍之二 AIDL
- android之Service介绍之二 AIDL
- Android四大组件之Service的介绍
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- Web Service之介绍
- Android Service介绍
- Android Service 介绍
- 基数排序-java实现
- 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)
- 第十三周 项目4-Floyd算法的验证
- SpringMVC01__框架
- iOS开发(OC)——UITextView输入特殊符号崩溃处理
- Android之---Service介绍
- 第十二周项目一(图的算法库)
- STM32 GPIO速度,模式等理解
- 第十三周-项目一 验证算法(2)
- 百度地图开发查看发布版SHA1和开发版SHA1
- 第十三周项目二(Kruskal算法的验证)
- dagger2+rxjava+retrofit简单例子
- 第十三周项目2-Kruskal算法的验证
- SpringMVC常用注解3SpringMVC注入session、IO、本地化变量