2010-06-21 16:57 李宁 中国水利水电出版社 字号:T | T

《Android/OPhone开发完全讲义》第8章Android服务,本章主要介绍了Android系统 中的服务(Service)技术。Service是Android中4个应用程序组件之一。在Android系统内部提供了很多的系统服务,通过这些系统 服务,可以实现更为复杂的功能,例如,监听来电、重力感应等。本节为大家介绍Service的生命周期。

AD:

8.1.1  Service的生命周期

本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycle

Service与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. //  MyService是一个服务类,该类必须从android.app.Service类继承
  7. public class MyService extends Service
  8. {
  9. @Override
  10. public IBinder onBind(Intent intent)
  11. {
  12. return null;
  13. }
  14. //  当服务第1次创建时调用该方法
  15. @Override
  16. public void onCreate()
  17. {
  18. Log.d("MyService", "onCreate");
  19. super.onCreate();
  20. }
  21. //  当服务销毁时调用该方法
  22. @Override
  23. public void onDestroy()
  24. {
  25. Log.d("MyService", "onDestroy");
  26. super.onDestroy();
  27. }
  28. //  当开始服务时调用该方法
  29. @Override
  30. public void onStart(Intent intent, int startId)
  31. {
  32. Log.d("MyService", "onStart");
  33. super.onStart(intent, startId);
  34. }
  35. }

在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);

运行本节的例子后,会显示如图8.1所示的界面。

 
图8.1  开始和停止服务

第1次单击【Start Service】按钮后,在DDMS透视图的LogCat视图的Message列会输出如下两行信息:

  1. onCreate
  2. onStart

然后单击【Stop Service】按钮,会在Message列中输出如下信息:

  1. onDestroy

下面按如下的单击按钮顺序的重新测试一下本例。

【Start Service】→【Stop Service】→【Start Service】→【Start Service】→【Start Service】→【Stop Service】

测试完程序,就会看到如图8.2所示的输出信息。可以看出,只在第1次单击【Start Service】按钮后会调用onCreate方法,如果在未单击【Stop Service】按钮时多次单击【Start Service】按钮,系统只在第1次单击【Start Service】按钮时调用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.1 Service的生命周期的更多相关文章

  1. Android activity和service的生命周期对比

    1Activity生命周期 七个方法 1. void onCreate(Bundle savedInstanceState) 当Activity被第首次加载时执行.我们新启动一个程序的时候其主窗体的o ...

  2. Android 测试Service的生命周期

    package com.example.myapp4; import android.support.v7.app.ActionBarActivity; import android.content. ...

  3. Activity和Service的生命周期(图)

    1.Activity的生命周期 情形一.一个单独的Activity的正常的生命过程是这样的:onCreate->onStart->onPause->onStop->onDest ...

  4. Android Service的生命周期

    service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...

  5. 18_Android中Service的生命周期,远程服务,绑定远程服务,aidl服务调用,综合服务案例,编写一个应用程序调用远程支付宝远程服务场景

    ============================================================================ 服务的生命周期: 一.采用start的方式开始 ...

  6. service的生命周期

    Managing the Lifecycle of a Service service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的s ...

  7. android基础---->service的生命周期

    服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...

  8. android学习-Activity和Service的生命周期

    详细请跳转原网页Activity和Service的生命周期(图) 不解释,不懂算我输 Activity的生命周期(图) Service的声明周期

  9. service的生命周期以及两种service的差异

    可以看到,两种service的生命周期都相对简单,有一点不同的是,Intentservice每次调用的时候都执行onstartcommand,而boundservice一旦启动了之后,就不会每次执行o ...

随机推荐

  1. 用户点击行为实时分析系统spark

    系统设计技术有:Hadoop2.xZookeeperFlumeHiveHbaseKafkaSpark2.xSpark StreamingStructured StreamingMySQLHueJava ...

  2. 11.5NOIP2018提高组模拟题

    书信(letter) Description 有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信. 显然, 这样一共有 n!种拿到书信的情 ...

  3. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  4. 洛谷——P1088 火星人

    P1088 火星人 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常 ...

  5. [BZOJ 2115] Xor

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 Algorithm: 此题一看到是求异或和最大问题的,立即想到使用线性基解题 最终 ...

  6. 【枚举】【贪心】 Codeforces Round #398 (Div. 2) B. The Queue

    卡题意……妈的智障 一个人的服务时间完整包含在整个工作时间以内. 显然,如果有空档的时间,并且能再下班之前完结,那么直接输出即可,显然取最左侧的空档最优. 如果没有的话,就要考虑“挤掉”某个人,就是在 ...

  7. Java高级架构师(一)第02节:分模块、分工程管理

    本节课程的目标在于:利用Maven构建分工程.分模块的空项目. -------- 基本的构建大致相同,有一个强调调点: 在总web的pom里边(architecture01web中),加入要合并的wa ...

  8. 解决Post提交乱码问题

    在web.xml里面配置 <filter> <filter-name>charac</filter-name> <filter-class>org.sp ...

  9. 【java】处理时间字段 在数据库查询的时候只想要年月日,不想要时分秒 ,java中设置时间类型为年月日,java中设置Date中的时分秒为00.00.000

    JDK8 中最简单的处理方式: @Test public void dateTest(){ Date now = new Date(); System.out.println(now); // jav ...

  10. Swift,枚举

    枚举类型判断 1.设置并利用枚举 enum Weacher{ case a case b case c } var d=Weacher.b switch d{ case .a: print(" ...