Android mobile development and application
安徽师范大学-计算机信息学院-2019-2020学年第一学期, 作者(授课教师): 周文
Service是安卓中四大组件之一,本质上是后台运行的可执行程序,她没有Activity那样的用户界面。通常情况下,Service不与用户交互,不能自己启动、运行在后台,Service主要应用于长时间的后台服务以及周期性的后台监控,如
Started(启动):当应用程序组件(例如Activity)通过调用startService()方法启动服务时,服务处于“started”状态。
一旦启动,服务能在后台无限期运行,即使启动它的组件已经被销毁。通常,启动服务执行单个操作并且不会向调用者返回结果。
Bound(绑定):当应用程序组件通过调用bindService()方法绑定到服务时,服务处于“bound”状态。
多个组件可以一次绑定到一个服务上,但是当它们都解绑定时,服务被销毁。
为了创建服务,开发人员需要创建Service类(或其子类)的子类。
在实现类中,需要重写一些处理服务生命周期重要方面的回调方法并根据需要提供组件绑定到服务的机制。
onStartCommand()onBind()onCreate()onDestroy()
类似Activity和其他组件,开发人员必须在应用程序配置文件中声明全部的Service。
为了声明Service,需要向<application>标签中增加<service>子标签,
<service>子标签的语法如下。
xxxxxxxxxx<service android:enabled=["true" | "false"]android:exported=["true" | "false"]android:icon="drawable resource"android:label="string resource"android:name="string"android:permission="string"android:process="string" >...</service>
因为多数启动服务不必同时处理多个请求(在多线程情境下会很危险),所以使用IntentService类实现服务是非常好的选择。IntentService完成如下任务:
onStartCommand()方法的全部Intent;onHandleIntent()方法实现,这样就不必担心多线程;stopSelf()方法;onBind()方法默认实现,其返回值是null;onStartCommand()方法默认实现,它先发送Intent到工作队列然后到onHandleIntent()方法实现。使用IntentService类将简化启动服务的实现。然而,如果需要让服务处理多线程(取代使用工作队列处理启动请求),则可以继承Service类来处理各个Intent。
为了创建服务,开发人员需要创建Service类(或其子类)的子类。在实现类中,需要重写一些处理服务生命周期重要方面的回调方法并根据需要提供组件绑定到服务的机制。
xxxxxxxxxxonStartCommand()onBind()onCreate()onDestroy()
开发人员可以从Activity或者其他应用程序组件通过传递Intent对象(指定要启动的服务)到startService()方法启动服务。
Android系统调用服务的onStartCommand()方法并将Intent传递给它。
例如,Activity能使用显式Intent和startService()方法启动前面章节的示例服务(HelloService),
其代码如下。
xxxxxxxxxxIntent intent = new Intent(this, HelloService.class);startService(intent);
onStartCommand()方法返回后服务继续运行。stopSelf()方法停止自身,或者其他组件调用stopService()方法停止服务。stopSelf()或stopService()方法请求停止时,系统会尽快销毁服务。创建Android项目,实现继承IntentService在后台输出当前时间。

其实现步骤如下:
1.在服务中,创建Binder类实例来完成下列操作之一:
2.从onBind()回调方法中返回Binder类实例;
3.在客户端,从onServiceConnected()回调方法接收Binder类实例,并且使用提供的方法调用绑定服务。
如果开发人员需要服务与远程进程通信,则可以使用Messenger来为服务提供接口。该技术允许不使用AIDL执行进程间通信(IPC)。
下面是关于如何使用Messenger的总结:
Handler的服务因为每次从客户端调用而收到回调;IBinder,服务从onBind()方法将其返回到到客户端;IBinder来实例化Messenger,然后使用它来发送Message对象到服务;handleMessage()方法接收Message。Handler方法。如果需要从客户端绑定服务,需要完成以下操作:
1.实现ServiceConnection,这需要重写onServiceConnected()和onServiceDisconnected()两个回调方法;
2.调用bindService()方法,传递ServiceConnection实现;
3.当系统调用onServiceConnected()回调方法时,就可以使用接口定义的方法调用服务;
4.调用unbindService()方法解绑定。
创建Android项目,实现继承Binder类绑定服务,并显示当前时间。


本章结束
2019-9-1