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类
(或其子类)的子类。在实现类中,需要重写一些处理服务生命周期重要方面的回调方法并根据需要提供组件绑定到服务的机制。
xxxxxxxxxx
onStartCommand()
onBind()
onCreate()
onDestroy()
开发人员可以从Activity
或者其他应用程序组件通过传递Intent对象(指定要启动的服务)到startService()方法
启动服务。
Android系统调用服务的onStartCommand()方法
并将Intent
传递给它。
例如,Activity
能使用显式Intent
和startService()方法
启动前面章节的示例服务(HelloService),
其代码如下。
xxxxxxxxxx
Intent 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