当前位置:文档之家› Android服务Service 详解

Android服务Service 详解

第8章 Android服务∙ 8.1 Service起步∙ 8.1.1 Service的生命周期∙ 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.1 Service起步Service并没有实际界面,而是一直在Android系统的后台运行。

一般使用Service为应用程序提供一些服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。

本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动Service的各种方法。

8.1.1 Service的生命周期本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycleService与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。

Service启动到销毁的过程只会经历如下3个阶段:创建服务开始服务销毁服务一个服务实际上是一个继承android.app.Service的类,当服务经历上面3个阶段后,会分别调用Service 类中的3个事件方法进行交互,这3个事件方法如下:1.public void onCreate(); // 创建服务2.public void onStart(Intent intent, int startId); // 开始服务3.public void onDestroy(); // 销毁服务一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。

下面编写一个服务类,具体看一下服务的生命周期由开始到销毁的过程。

1.package net.blogjava.mobile.service;2.import android.app.Service;3.import android.content.Intent;4.import android.os.IBinder;5.import android.util.Log;6.7.// MyService是一个服务类,该类必须从android.app.Service类继承8.public class MyService extends Service9.{10. @Override11. public IBinder onBind(Intent intent)12. {13. return null;14. }15. // 当服务第1次创建时调用该方法16. @Override17. public void onCreate()18. {19. Log.d("MyService", "onCreate");20. super.onCreate();21. }22. // 当服务销毁时调用该方法23. @Override24. public void onDestroy()25. {26. Log.d("MyService", "onDestroy");27. super.onDestroy();28. }29. // 当开始服务时调用该方法30. @Override31. public void onStart(Intent intent, int startId)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.<service android:enabled="true"android:name=".MyService"/>其中android:enabled属性的值为true,表示MyService服务处于激活状态。

虽然目前MyService是激活的,但系统仍然不会启动MyService,要想启动这个服务。

必须显式地调用startService方法。

如果想停止服务,需要显式地调用stopService方法,代码如下:1.public void onClick(View view)2.{3. switch (view.getId())4. {5. case R.id.btnStartService:6. startService(serviceIntent);// 单击【Start Service】按钮启动服务7. break;8. case R.id.btnStopService:9. stopService(serviceIntent);// 单击【Stop Service】按钮停止服务10. break;11. }12.}其中serviceIntent是一个Intent对象,用于指定MyService服务,创建该对象的代码如下:1.serviceIntent = new Intent(this, MyService.class);然后单击【Stop Service】按钮,会在Message列中输出如下信息:1.onDestroy在讨论完服务的生命周期后,再来总结一下创建和开始服务的步骤。

创建和开始一个服务需要如下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.public boolean bindService(Intent service,ServiceConnection conn, int flags)该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent对象指定的服务。

通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。

第3个参数是一个标志位,一般设为Context.BIND_AUTO_CREATE。

下面重新编写8.1.1节的MyService类,在该类中增加了几个与绑定相关的事件方法。

1.package net.blogjava.mobile.service;2.3.import android.app.Service;4.import android.content.Intent;5.import android.os.Binder;6.import android.os.IBinder;7.import android.util.Log;8.9.public class MyService extends Service10.{11. private MyBinder myBinder = new MyBinder();12. // 成功绑定后调用该方法13. @Override14. public IBinder onBind(Intent intent)15. {16. Log.d("MyService", "onBind");17. return myBinder;18. }19. // 重新绑定时调用该方法20. @Override21. public void onRebind(Intent intent)22. {23. Log.d("MyService", "onRebind");24. super.onRebind(intent);25. }26. // 解除绑定时调用该方法27. @Override28. public boolean onUnbind(Intent intent)29. {30. Log.d("MyService", "onUnbind");31. return super.onUnbind(intent);32. }33. @Override34. public void onCreate()35. {36. Log.d("MyService", "onCreate");37. super.onCreate();38. }39. @Override40. public void onDestroy()41. {42. Log.d("MyService", "onDestroy");43. super.onDestroy();44. }45. @Override46. public void onStart(Intent intent, int startId)47. {48. Log.d("MyService", "onStart");49. super.onStart(intent, startId);50. }51. public class MyBinder extends Binder52. {53. MyService getService()54. {55. return MyService.this;56. }57. }58.}现在定义一个MyService变量和一个ServiceConnection变量,代码如下:1.private MyService myService;2.private ServiceConnection serviceConnection = new ServiceConnection()3.{4. // 连接服务失败后,该方法被调用5. @Override6. public void onServiceDisconnected(ComponentName name)7. {8.myService = null;9. Toast.makeText(Main.this, "ServiceFailed.", Toast.LENGTH_LONG).show();10. }11. // 成功连接服务后,该方法被调用。

相关主题