您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > Android之Service---经典详解
Android之Service---经典详解第8章Android服务•8.1Service起步•8.1.1Service的生命周期•8.1.2绑定Activity和Service•8.1.3在BroadcastReceiver中启动Ser..•8.2.1获得系统服务•8.2.2在模拟器上模拟重力感应•8.3.1计时器:Chronometer•8.3.2预约时间Handler•8.3.4在线程中更新GUI组件•8.3.5全局定时器AlarmManager(1)•8.3.5全局定时器AlarmManager(2)•8.3.5全局定时器AlarmManager(3)•8.4.1什么是AIDL服务•8.4.2建立AIDL服务的步骤(1)•8.4.2建立AIDL服务的步骤(2)•8.4.2建立AIDL服务的步骤(3)•8.5本章小结第8章Android服务服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。本章内容Service的生命周期绑定Activity和Service在BroadcastReceiver中启动Service系统服务时间服务在线程中更新GUI组件AIDL服务在AIDL服务中传递复杂的数据8.1Service起步Service并没有实际界面,而是一直在Android系统的后台运行。一般使用Service为应用程序提供一些服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动Service的各种方法。8.1.1Service的生命周期本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycleService与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。Service启动到销毁的过程只会经历如下3个阶段:创建服务开始服务销毁服务一个服务实际上是一个继承android.app.Service的类,当服务经历上面3个阶段后,会分别调用Service类中的3个事件方法进行交互,这3个事件方法如下:1.publicvoidonCreate();//创建服务2.publicvoidonStart(Intentintent,intstartId);//开始服务3.publicvoidonDestroy();//销毁服务一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。下面编写一个服务类,具体看一下服务的生命周期由开始到销毁的过程。1.packagenet.blogjava.mobile.service;2.importandroid.app.Service;3.importandroid.content.Intent;4.importandroid.os.IBinder;5.importandroid.util.Log;6.7.//MyService是一个服务类,该类必须从android.app.Service类继承8.publicclassMyServiceextendsService9.{10.@Override11.publicIBinderonBind(Intentintent)12.{13.returnnull;14.}15.//当服务第1次创建时调用该方法16.@Override17.publicvoidonCreate()18.{19.Log.d(MyService,onCreate);20.super.onCreate();21.}22.//当服务销毁时调用该方法23.@Override24.publicvoidonDestroy()25.{26.Log.d(MyService,onDestroy);27.super.onDestroy();28.}29.//当开始服务时调用该方法30.@Override31.publicvoidonStart(Intentintent,intstartId)32.{33.Log.d(MyService,onStart);34.super.onStart(intent,startId);35.}36.}在MyService中覆盖了Service类中3个生命周期方法,并在这些方法中输出了相应的日志信息,以便更容易地观察事件方法的调用情况。读者在编写Android的应用组件时要注意,不管是编写什么组件(例如,Activity、Service等),都需要在AndroidManifest.xml文件中进行配置。MyService类也不例子。配置这个服务类很简单,只需要在AndroidManifest.xml文件的application标签中添加如下代码即可:1.serviceandroid:enabled=trueandroid:name=.MyService/其中android:enabled属性的值为true,表示MyService服务处于激活状态。虽然目前MyService是激活的,但系统仍然不会启动MyService,要想启动这个服务。必须显式地调用startService方法。如果想停止服务,需要显式地调用stopService方法,代码如下:1.publicvoidonClick(Viewview)2.{3.switch(view.getId())4.{5.caseR.id.btnStartService:6.startService(serviceIntent);//单击【StartService】按钮启动服务7.break;8.caseR.id.btnStopService:9.stopService(serviceIntent);//单击【StopService】按钮停止服务10.break;11.}12.}其中serviceIntent是一个Intent对象,用于指定MyService服务,创建该对象的代码如下:1.serviceIntent=newIntent(this,MyService.class);运行本节的例子后,会显示如图8.1所示的界面。图8.1开始和停止服务第1次单击【StartService】按钮后,在DDMS透视图的LogCat视图的Message列会输出如下两行信息:1.onCreate2.onStart然后单击【StopService】按钮,会在Message列中输出如下信息:1.onDestroy下面按如下的单击按钮顺序的重新测试一下本例。【StartService】→【StopService】→【StartService】→【StartService】→【StartService】→【StopService】测试完程序,就会看到如图8.2所示的输出信息。可以看出,只在第1次单击【StartService】按钮后会调用onCreate方法,如果在未单击【StopService】按钮时多次单击【StartService】按钮,系统只在第1次单击【StartService】按钮时调用onCreate和onStart方法,再单击该按钮时,系统只会调用onStart方法,而不会再次调用onCreate方法。图8.2服务的生命周期方法的调用情况在讨论完服务的生命周期后,再来总结一下创建和开始服务的步骤。创建和开始一个服务需要如下3步:(1)编写一个服务类,该类必须从android.app.Service继承。Service类涉及到3个生命周期方法,但这3个方法并不一定在子类中覆盖,读者可根据不同需求来决定使用哪些生命周期方法。在Service类中有一个onBind方法,该方法是一个抽象方法,在Service的子类中必须覆盖。这个方法当Activity与Service绑定时被调用(将在8.1.3节详细介绍)。(2)在AndroidManifest.xml文件中使用service标签来配置服务,一般需要将service标签的android:enabled属性值设为true,并使用android:name属性指定在第1步建立的服务类名。(3)如果要开始一个服务,使用startService方法,停止一个服务要使用stopService方法。8.1.2绑定Activity和Service本节的例子代码所在的工程目录是src\ch08\ch08_serviceactivity如果使用8.1.1节介绍的方法启动服务,并且未调用stopService来停止服务,这个服务就会随着Android系统的启动而启动,随着Android系统的关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。通过bindService方法可以将Activity和Service绑定。bindService方法的定义如下:1.publicbooleanbindService(Intentservice,ServiceConnectionconn,intflags)该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent对象指定的服务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。第3个参数是一个标志位,一般设为Context.BIND_AUTO_CREATE。下面重新编写8.1.1节的MyService类,在该类中增加了几个与绑定相关的事件方法。1.packagenet.blogjava.mobile.service;2.3.importandroid.app.Service;4.importandroid.content.Intent;5.importandroid.os.Binder;6.importandroid.os.IBinder;7.importandroid.util.Log;8.9.publicclassMyServiceextendsService10.{11.privateMyBindermyBinder=newMyBinder();12.//成功绑定后调用该方法13.@Override14.publicIBinderonBind(Intentintent)15.{16.Log.d(MyService,onBind);17.returnmyBinder;18.}19.//重新绑定时调用该方法20.@Override21.publicvoidonRebind(Intentintent)22.{23.Log.d(MyService,onRebind);24.super.onRebind(intent);25.}26.//解除绑定时调用该方法27.@Override28.publicbooleanonUnbind(Intentintent)29.{30.Log.d(MyService,onUnbind);31.returnsuper.onUnbind(intent);32.}33.@Override34.publicvoidonCreate()35.{36.Log.d(MyService,onCreate);37.super.onCreate();38.}39.@Override40.publicvoidonDestroy()41.{42.Log.d(MyService,onDestroy);43.super.onDestr
本文标题:Android之Service---经典详解
链接地址:https://www.777doc.com/doc-5893845 .html