第七章 Service
Service是一个长期运行在后台的用户组件,没有用户界面。即使切换到另一个应用程序,服务也可以在后台运行,因此服务更适合执行一段时间而又不需要显示界面的后台操作,例如下载数据,播放音乐等。
7.1 服务的创建
服务是Android四大组件之一,它的创建和广播接收者类似,File -> New -> Service - >Service。
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");
}
}
onBind方法用于绑定服务,并返回一个IBind对象。服务创建完成后会自动在AndroidManifest.xml文件中对服务进行注册。
7.2 服务的生命周期
服务的启动方式有两种,分别是startService和bindService.使用不同的方式启动服务,其生命周期也是不同的。
开启服务(startService)
服务一旦开启就与调用者没有任何关系, 当调用者Activity退出时,服务仍在运行,不会影响后台service的运行。
在Activity中不能调用服务里面的方法
绑定服务(bindService)
通过绑定方式开启服务,服务跟服务不求同生,但求同死。如果调用者的Activity退出了,那他绑定的服务也会跟着退出。
在Activity中能调用服务里面的方法
————————————————
版权声明:本文为CSDN博主「ArThur_Bob」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/windownew11/article/details/9301211
- onCreate() 第一次创建服务时执行的方法
- onDestroy() 服务被销毁时执行的方法
- onStartCommand() 客户端通过调用startService方法启动服务时执行该方法;
- onBind() 客户端通过调用bindService方法启动服务时执行该方法;
- onUnbind() 客户端通过调用unBindService方法断开服务绑定时执行该方法;
7.4 服务的通信
前面讲了服务的两种启动方式,可以发现通过绑定开启服务后,服务与Activity之间是可以通信的,通过Activity可以控制服务进行一些操作,下面针对Activity与服务之间的通信进行详细讲解。
7.4.1 通信方式
通信方式有两种,一种是本地服务通信,一种是远程服务通信.本地服务通信是指应用程序内部的通信,远程服务通信是两个程序之间的通信。使用这两种方式通信时,必须保证服务是以绑定方式开启的。
-
本地服务通信
在使用本地服务通信时,首先需要创建一个Service类,该类会提供一个onBind方法,onBind方法的返回值是一个IBinder对象,IBinder对象会作为参数传递给ServiceConnection类中的onServiceConnected()方法,这样访问者就能通过IBinder对象与Service进行通信。
-
远程服务通信
在安卓系统中,各个程序都运行在自己的进程中,如果想要完成不同进程间的通信,就需要使用远程服务通信。远程服务通信是通过AIDL(Android Interface Definition Language)实现的,它是一种接口定义语言,其语法格式非常简单,与java中定义接口很类似,但是存在几点差异:
- AIDL定义接口的源代码必须以.aidl结尾
- AIDL接口中用到的数据类型,除了基本数据结构及String,List, Map, CharSequence之外,其他类型全都需要导包,即使他们在同一个包中。data/data/cn.luoxin88.musicplayer/qqq.mp3