8.1.1 Service的生命周期
《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个事件方法如下:
- public void onCreate(); // 创建服务
- public void onStart(Intent intent, int startId); // 开始服务
- public void onDestroy(); // 销毁服务
一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。
下面编写一个服务类,具体看一下服务的生命周期由开始到销毁的过程。
- package net.blogjava.mobile.service;
- import android.app.Service;
- import android.content.Intent;
- import android.os.IBinder;
- import android.util.Log;
- // MyService是一个服务类,该类必须从android.app.Service类继承
- public class MyService extends Service
- {
- @Override
- public IBinder onBind(Intent intent)
- {
- return null;
- }
- // 当服务第1次创建时调用该方法
- @Override
- public void onCreate()
- {
- Log.d("MyService", "onCreate");
- super.onCreate();
- }
- // 当服务销毁时调用该方法
- @Override
- public void onDestroy()
- {
- Log.d("MyService", "onDestroy");
- super.onDestroy();
- }
- // 当开始服务时调用该方法
- @Override
- public void onStart(Intent intent, int startId)
- {
- Log.d("MyService", "onStart");
- super.onStart(intent, startId);
- }
- }
在MyService中覆盖了Service类中3个生命周期方法,并在这些方法中输出了相应的日志信息,以便更容易地观察事件方法的调用情况。
读者在编写Android的应用组件时要注意,不管是编写什么组件(例如,Activity、Service等),都需要在 AndroidManifest.xml文件中进行配置。MyService类也不例子。配置这个服务类很简单,只需要在 AndroidManifest.xml文件的<application>标签中添加如下代码即可:
- <service android:enabled="true" android:name=".MyService" />
其中android:enabled属性的值为true,表示MyService服务处于激活状态。虽然目前MyService是激活的,但系统仍 然不会启动MyService,要想启动这个服务。必须显式地调用startService方法。如果想停止服务,需要显式地调用stopService 方法,代码如下:
- public void onClick(View view)
- {
- switch (view.getId())
- {
- case R.id.btnStartService:
- startService(serviceIntent);
// 单击【Start Service】按钮启动服务 - break;
- case R.id.btnStopService:
- stopService(serviceIntent);
// 单击【Stop Service】按钮停止服务 - break;
- }
- }
其中serviceIntent是一个Intent对象,用于指定MyService服务,创建该对象的代码如下:
- serviceIntent = new Intent(this, MyService.class);
运行本节的例子后,会显示如图8.1所示的界面。
图8.1 开始和停止服务 |
第1次单击【Start Service】按钮后,在DDMS透视图的LogCat视图的Message列会输出如下两行信息:
- onCreate
- onStart
然后单击【Stop Service】按钮,会在Message列中输出如下信息:
- 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的生命周期的更多相关文章
- Android activity和service的生命周期对比
1Activity生命周期 七个方法 1. void onCreate(Bundle savedInstanceState) 当Activity被第首次加载时执行.我们新启动一个程序的时候其主窗体的o ...
- Android 测试Service的生命周期
package com.example.myapp4; import android.support.v7.app.ActionBarActivity; import android.content. ...
- Activity和Service的生命周期(图)
1.Activity的生命周期 情形一.一个单独的Activity的正常的生命过程是这样的:onCreate->onStart->onPause->onStop->onDest ...
- Android Service的生命周期
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...
- 18_Android中Service的生命周期,远程服务,绑定远程服务,aidl服务调用,综合服务案例,编写一个应用程序调用远程支付宝远程服务场景
============================================================================ 服务的生命周期: 一.采用start的方式开始 ...
- service的生命周期
Managing the Lifecycle of a Service service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的s ...
- android基础---->service的生命周期
服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...
- android学习-Activity和Service的生命周期
详细请跳转原网页Activity和Service的生命周期(图) 不解释,不懂算我输 Activity的生命周期(图) Service的声明周期
- service的生命周期以及两种service的差异
可以看到,两种service的生命周期都相对简单,有一点不同的是,Intentservice每次调用的时候都执行onstartcommand,而boundservice一旦启动了之后,就不会每次执行o ...
随机推荐
- 51nod 1344 走格子【贪心/前缀和】
1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...
- 使用selenium模拟知网登录
之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...
- 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分)
layout: post title: 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分) author: "luowentaoaa" catalog: tr ...
- mysql实现full outer join
由于MySQL设计时不支持full outer join, 所以如果有全连接需求时,需要一点小技巧来实现. 假设有两个表t1,t2 full outer join 的效果和下面的效果一样: SELEC ...
- 【bzoj1370】【团伙】原来并查集还能这么用?!
(画师当然是武内崇啦) Description 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一 ...
- 1.6(学习笔记)Session
一. Session简介 Session是用于解决HTTP无状态问题,HTTP协议本身是没有状态的, 就类似一个没有记性的商人,每次只交易当前的货物,交易完后就忘记了 以前的交易历史.我们和商人交易时 ...
- [Android]--RadioGroup+RadioButton实现底部导航栏
RadioGroup+RadioButton组合方式打造简单实用的底部导航栏 代码块: <?xml version="1.0" encoding="utf-8&qu ...
- python函数中的关键字参数
关键字参数: 就是在形式参数中必须要提供”传递参数名=传递参数值” 位置参数: 仅仅只有参数名 特点:1.位置参数只能出现在关键字参数之前,不管是在行参还是实参中. 2.关键字参数在调用时(实参)中 ...
- CASJAVA一些理解
如果不用锁机制如何实现共享数据访问.(不要用锁,不要 用sychronized 块或者方法,也不要直接使用 jdk 提供的线程安全的数据结构,需要自己实现一个类来保证多个线程同时读写这个类中的共享 ...
- 关于shape和selector和layer-list的drawable详细说明
在Android开发中,但凡涉及控件的的特效问题,<shape>,<selector>以及<layer-list>都是不可或缺的drawable.但是发现有同事并不 ...