`

Android Service生命周期及用法!

 
阅读更多

分类:Android面试区Android基础教程49331人阅读评论(54)收藏举报

大家好,上一节我讲解了Android Activity的生命周期,这一节我将讲解一下Service,首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等。

Service概念及用途:

Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用Service在后台定时更新,而不用每打开应用的时候在去获取。

Service生命周期:

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

Service与Activity通信:

Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。

为了让大家 更容易理解,我写了一个简单的Demo,大家可以模仿着我,一步一步的来。

第一步:新建一个Android工程,我这里命名为ServiceDemo.

第二步:修改main.xml代码,我这里增加了四个按钮,代码如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/text"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/hello"
  12. />
  13. <Button
  14. android:id="@+id/startservice"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:text="startService"
  18. />
  19. <Button
  20. android:id="@+id/stopservice"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:text="stopService"
  24. />
  25. <Button
  26. android:id="@+id/bindservice"
  27. android:layout_width="fill_parent"
  28. android:layout_height="wrap_content"
  29. android:text="bindService"
  30. />
  31. <Button
  32. android:id="@+id/unbindservice"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"
  35. android:text="unbindService"
  36. />
  37. </LinearLayout>

第三步:新建一个Service,命名为MyService.java代码如下:

  1. packagecom.tutor.servicedemo;
  2. importandroid.app.Service;
  3. importandroid.content.Intent;
  4. importandroid.os.Binder;
  5. importandroid.os.IBinder;
  6. importandroid.text.format.Time;
  7. importandroid.util.Log;
  8. publicclassMyServiceextendsService{
  9. //定义个一个Tag标签
  10. privatestaticfinalStringTAG="MyService";
  11. //这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到
  12. privateMyBindermBinder=newMyBinder();
  13. @Override
  14. publicIBinderonBind(Intentintent){
  15. Log.e(TAG,"startIBinder~~~");
  16. returnmBinder;
  17. }
  18. @Override
  19. publicvoidonCreate(){
  20. Log.e(TAG,"startonCreate~~~");
  21. super.onCreate();
  22. }
  23. @Override
  24. publicvoidonStart(Intentintent,intstartId){
  25. Log.e(TAG,"startonStart~~~");
  26. super.onStart(intent,startId);
  27. }
  28. @Override
  29. publicvoidonDestroy(){
  30. Log.e(TAG,"startonDestroy~~~");
  31. super.onDestroy();
  32. }
  33. @Override
  34. publicbooleanonUnbind(Intentintent){
  35. Log.e(TAG,"startonUnbind~~~");
  36. returnsuper.onUnbind(intent);
  37. }
  38. //这里我写了一个获取当前时间的函数,不过没有格式化就先这么着吧
  39. publicStringgetSystemTime(){
  40. Timet=newTime();
  41. t.setToNow();
  42. returnt.toString();
  43. }
  44. publicclassMyBinderextendsBinder{
  45. MyServicegetService()
  46. {
  47. returnMyService.this;
  48. }
  49. }
  50. }

第四步:修改ServiceDemo.java,代码如下:

  1. packagecom.tutor.servicedemo;
  2. importandroid.app.Activity;
  3. importandroid.content.ComponentName;
  4. importandroid.content.Context;
  5. importandroid.content.Intent;
  6. importandroid.content.ServiceConnection;
  7. importandroid.os.Bundle;
  8. importandroid.os.IBinder;
  9. importandroid.view.View;
  10. importandroid.view.View.OnClickListener;
  11. importandroid.widget.Button;
  12. importandroid.widget.TextView;
  13. publicclassServiceDemoextendsActivityimplementsOnClickListener{
  14. privateMyServicemMyService;
  15. privateTextViewmTextView;
  16. privateButtonstartServiceButton;
  17. privateButtonstopServiceButton;
  18. privateButtonbindServiceButton;
  19. privateButtonunbindServiceButton;
  20. privateContextmContext;
  21. //这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到
  22. privateServiceConnectionmServiceConnection=newServiceConnection(){
  23. //当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值
  24. publicvoidonServiceConnected(ComponentNamename,IBinderservice){
  25. //TODOAuto-generatedmethodstub
  26. mMyService=((MyService.MyBinder)service).getService();
  27. mTextView.setText("IamfromeService:"+mMyService.getSystemTime());
  28. }
  29. publicvoidonServiceDisconnected(ComponentNamename){
  30. //TODOAuto-generatedmethodstub
  31. }
  32. };
  33. publicvoidonCreate(BundlesavedInstanceState){
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.main);
  36. setupViews();
  37. }
  38. publicvoidsetupViews(){
  39. mContext=ServiceDemo.this;
  40. mTextView=(TextView)findViewById(R.id.text);
  41. startServiceButton=(Button)findViewById(R.id.startservice);
  42. stopServiceButton=(Button)findViewById(R.id.stopservice);
  43. bindServiceButton=(Button)findViewById(R.id.bindservice);
  44. unbindServiceButton=(Button)findViewById(R.id.unbindservice);
  45. startServiceButton.setOnClickListener(this);
  46. stopServiceButton.setOnClickListener(this);
  47. bindServiceButton.setOnClickListener(this);
  48. unbindServiceButton.setOnClickListener(this);
  49. }
  50. publicvoidonClick(Viewv){
  51. //TODOAuto-generatedmethodstub
  52. if(v==startServiceButton){
  53. Intenti=newIntent();
  54. i.setClass(ServiceDemo.this,MyService.class);
  55. mContext.startService(i);
  56. }elseif(v==stopServiceButton){
  57. Intenti=newIntent();
  58. i.setClass(ServiceDemo.this,MyService.class);
  59. mContext.stopService(i);
  60. }elseif(v==bindServiceButton){
  61. Intenti=newIntent();
  62. i.setClass(ServiceDemo.this,MyService.class);
  63. mContext.bindService(i,mServiceConnection,BIND_AUTO_CREATE);
  64. }else{
  65. mContext.unbindService(mServiceConnection);
  66. }
  67. }
  68. }

第五步:修改AndroidManifest.xml代码(将我们新建的MyService注册进去如下代码第14行:)

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.tutor.servicedemo"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7. <activityandroid:name=".ServiceDemo"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <actionandroid:name="android.intent.action.MAIN"/>
  11. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  12. </intent-filter>
  13. </activity>
  14. <serviceandroid:name=".MyService"android:exported="true"></service>
  15. </application>
  16. <uses-sdkandroid:minSdkVersion="7"/>
  17. </manifest>

第六步:执行上述工程,效果图如下:

点击startServie按钮时先后执行了Service中onCreate()->onStart()这两个方法,打开Logcat视窗效果如下图:

我们这时可以按HOME键进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了一个服务,效果如下:

点击stopService按钮时,Service则执行了onDestroy()方法,效果图如下所示:

这时候我们再次点击startService按钮,然后点击bindService按钮(通常bindService都是bind已经启动的Service),我们看一下Service执行了IBinder()方法,以及TextView的值也有所变化了,如下两张图所示:

最后点击unbindService按钮,则Service执行了onUnbind()方法,如下图所示:

大家好,上一节我讲解了Android Activity的生命周期,这一节我将讲解一下Service,首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等。

Service概念及用途:

Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用Service在后台定时更新,而不用每打开应用的时候在去获取。

Service生命周期:

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

Service与Activity通信:

Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。

为了让大家 更容易理解,我写了一个简单的Demo,大家可以模仿着我,一步一步的来。

第一步:新建一个Android工程,我这里命名为ServiceDemo.

第二步:修改main.xml代码,我这里增加了四个按钮,代码如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/text"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/hello"
  12. />
  13. <Button
  14. android:id="@+id/startservice"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:text="startService"
  18. />
  19. <Button
  20. android:id="@+id/stopservice"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:text="stopService"
  24. />
  25. <Button
  26. android:id="@+id/bindservice"
  27. android:layout_width="fill_parent"
  28. android:layout_height="wrap_content"
  29. android:text="bindService"
  30. />
  31. <Button
  32. android:id="@+id/unbindservice"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"
  35. android:text="unbindService"
  36. />
  37. </LinearLayout>

第三步:新建一个Service,命名为MyService.java代码如下:

  1. packagecom.tutor.servicedemo;
  2. importandroid.app.Service;
  3. importandroid.content.Intent;
  4. importandroid.os.Binder;
  5. importandroid.os.IBinder;
  6. importandroid.text.format.Time;
  7. importandroid.util.Log;
  8. publicclassMyServiceextendsService{
  9. //定义个一个Tag标签
  10. privatestaticfinalStringTAG="MyService";
  11. //这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到
  12. privateMyBindermBinder=newMyBinder();
  13. @Override
  14. publicIBinderonBind(Intentintent){
  15. Log.e(TAG,"startIBinder~~~");
  16. returnmBinder;
  17. }
  18. @Override
  19. publicvoidonCreate(){
  20. Log.e(TAG,"startonCreate~~~");
  21. super.onCreate();
  22. }
  23. @Override
  24. publicvoidonStart(Intentintent,intstartId){
  25. Log.e(TAG,"startonStart~~~");
  26. super.onStart(intent,startId);
  27. }
  28. @Override
  29. publicvoidonDestroy(){
  30. Log.e(TAG,"startonDestroy~~~");
  31. super.onDestroy();
  32. }
  33. @Override
  34. publicbooleanonUnbind(Intentintent){
  35. Log.e(TAG,"startonUnbind~~~");
  36. returnsuper.onUnbind(intent);
  37. }
  38. //这里我写了一个获取当前时间的函数,不过没有格式化就先这么着吧
  39. publicStringgetSystemTime(){
  40. Timet=newTime();
  41. t.setToNow();
  42. returnt.toString();
  43. }
  44. publicclassMyBinderextendsBinder{
  45. MyServicegetService()
  46. {
  47. returnMyService.this;
  48. }
  49. }
  50. }

第四步:修改ServiceDemo.java,代码如下:

  1. packagecom.tutor.servicedemo;
  2. importandroid.app.Activity;
  3. importandroid.content.ComponentName;
  4. importandroid.content.Context;
  5. importandroid.content.Intent;
  6. importandroid.content.ServiceConnection;
  7. importandroid.os.Bundle;
  8. importandroid.os.IBinder;
  9. importandroid.view.View;
  10. importandroid.view.View.OnClickListener;
  11. importandroid.widget.Button;
  12. importandroid.widget.TextView;
  13. publicclassServiceDemoextendsActivityimplementsOnClickListener{
  14. privateMyServicemMyService;
  15. privateTextViewmTextView;
  16. privateButtonstartServiceButton;
  17. privateButtonstopServiceButton;
  18. privateButtonbindServiceButton;
  19. privateButtonunbindServiceButton;
  20. privateContextmContext;
  21. //这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到
  22. privateServiceConnectionmServiceConnection=newServiceConnection(){
  23. //当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值
  24. publicvoidonServiceConnected(ComponentNamename,IBinderservice){
  25. //TODOAuto-generatedmethodstub
  26. mMyService=((MyService.MyBinder)service).getService();
  27. mTextView.setText("IamfromeService:"+mMyService.getSystemTime());
  28. }
  29. publicvoidonServiceDisconnected(ComponentNamename){
  30. //TODOAuto-generatedmethodstub
  31. }
  32. };
  33. publicvoidonCreate(BundlesavedInstanceState){
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.main);
  36. setupViews();
  37. }
  38. publicvoidsetupViews(){
  39. mContext=ServiceDemo.this;
  40. mTextView=(TextView)findViewById(R.id.text);
  41. startServiceButton=(Button)findViewById(R.id.startservice);
  42. stopServiceButton=(Button)findViewById(R.id.stopservice);
  43. bindServiceButton=(Button)findViewById(R.id.bindservice);
  44. unbindServiceButton=(Button)findViewById(R.id.unbindservice);
  45. startServiceButton.setOnClickListener(this);
  46. stopServiceButton.setOnClickListener(this);
  47. bindServiceButton.setOnClickListener(this);
  48. unbindServiceButton.setOnClickListener(this);
  49. }
  50. publicvoidonClick(Viewv){
  51. //TODOAuto-generatedmethodstub
  52. if(v==startServiceButton){
  53. Intenti=newIntent();
  54. i.setClass(ServiceDemo.this,MyService.class);
  55. mContext.startService(i);
  56. }elseif(v==stopServiceButton){
  57. Intenti=newIntent();
  58. i.setClass(ServiceDemo.this,MyService.class);
  59. mContext.stopService(i);
  60. }elseif(v==bindServiceButton){
  61. Intenti=newIntent();
  62. i.setClass(ServiceDemo.this,MyService.class);
  63. mContext.bindService(i,mServiceConnection,BIND_AUTO_CREATE);
  64. }else{
  65. mContext.unbindService(mServiceConnection);
  66. }
  67. }
  68. }

第五步:修改AndroidManifest.xml代码(将我们新建的MyService注册进去如下代码第14行:)

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.tutor.servicedemo"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7. <activityandroid:name=".ServiceDemo"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <actionandroid:name="android.intent.action.MAIN"/>
  11. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  12. </intent-filter>
  13. </activity>
  14. <serviceandroid:name=".MyService"android:exported="true"></service>
  15. </application>
  16. <uses-sdkandroid:minSdkVersion="7"/>
  17. </manifest>

第六步:执行上述工程,效果图如下:

点击startServie按钮时先后执行了Service中onCreate()->onStart()这两个方法,打开Logcat视窗效果如下图:

我们这时可以按HOME键进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了一个服务,效果如下:

点击stopService按钮时,Service则执行了onDestroy()方法,效果图如下所示:

这时候我们再次点击startService按钮,然后点击bindService按钮(通常bindService都是bind已经启动的Service),我们看一下Service执行了IBinder()方法,以及TextView的值也有所变化了,如下两张图所示:

最后点击unbindService按钮,则Service执行了onUnbind()方法,如下图所示:

分享到:
评论

相关推荐

    AndroidService生命周期及用法[收集].pdf

    AndroidService生命周期及用法[收集].pdf

    Android中service基本用法,生命周期1

    startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...

    Android中service基本用法,生命周期2

    startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...

    Android课程第一次实验报告_Andorid应用程序Activity生命周期.docx

     对于应用开发者来说,理解不同的应用组件(特别是Activity、Service、Intent Receiver)对应用进程的生命周期的影响,这是非常重要的。如果没有正确地使用这些组件,将会导致当应用正在处理重要的工作时,进程却被...

    Android service类的应用及源码例子.rar

    Android service类的应用及源码例子,通过Android service类创建一个音乐服务模块,演示service类的创建、启动和方法使用,以及Service生命周期的说明,该例子继承service 然后重写onStart播放音乐 重写onDestry停止...

    疯狂Android讲义第10章源码(Android服务Service_详解)

     10.1.4 Service的生命周期 381  10.2 跨进程调用Service  (AIDL服务) 382  10.2.1 AIDL服务简介 382  10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383  10.2.4 客户端访问AIDLService 385  10.3...

    使用startservice方法启动服务,并检测服务的生命周期

    使用startservice方法启动服务,并检测服务的生命周期

    Android Service控件用法实例分析

    本文实例讲述了Android...定义一个Service比较简单,只要继承Service类,实现其生命周期的方法即可。一个定义好的Service必须在AndroidManifest.xml文件中通过&lt;service&gt;声明才能使用 &lt;service android:name=MyService&gt;

    Android应用开发详解

    Android 基本程序单元Activity,讲述了Android中重要组件Activity的创建、启动和生命周期等内容 第6章 Android组件之间的信使Intent Android 组件之间的信使Intent,讲述了Intent对象及其属性、Intent的实现策略和...

    Android中startService基本使用方法概述

    主要介绍了Android中startService基本使用方法,详细解释了startService的基本使用概述及其生命周期,需要的朋友可以参考下

    Android开发资料合集-World版!

    2.3.3、Service的生命周期 32 2.3.4、判断服务开启状态 33 2.3.5、获取启动的服务 34 2.4、CONTENT PROVIDER 35 3、ANDROID UI LAYOUT 35 3.1、概述 35 3.2、线性布局(LINEAR LAYOUT) 36 3.3、相对布局(RELATIVE ...

    android 开发技巧合集

    0、ANDROID常用类库说明 6 1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 ...2.3.3、Service的生命周期 32 2.3.4、判断服务开启状态 33 2.3.5、获取启动的服务 34 2.4、CONTENT PROVIDER 35

    Android开发之Service用法实例

    Service是一个生命周期较长而且没有界面的程序。 下面通过一个播放mp3的例子来学习。 先看MainActivity.java package com.example.servicetest; import android.app.Activity; import android.content.Intent; ...

    Android项目设计与开发:服务的概念.ppt

    嵌入式Android项目设计与开发 第八章 服务 —— 服务的概念 服务的概念 服务(Service)是Android中的四大组件之一,它能够长期在后台运行...使用不同的方法启动服务,服务的生命周期也会不同。 谢谢 请专家批评指正!

    Android开发案例驱动教程 配套代码

    13.1.1 本地Service生命周期 317 13.1.2 远程Service生命周期 318 13.2 本地Service 319 13.2.1 本地Service案例 319 13.2.2 编写AudioService 320 13.2.3 调用Service 322 13.2.4 重构案例 323 13.3 远程...

    android开发资料大全

    两分钟彻底让你明白Android Activity生命周期(图文)! Android 图形系统剖析 Android 立体效果图片 NDK动态库的调用 Android 姿态传感器 Android 很酷的图像旋转 Android 添加音频 在Android中实现多线程断点下载 ...

    《Android系统源代码情景分析》

    2.5 开发Android应用程序来使用硬件访问服务 第3章 智能指针 3.1 轻量级指针 3.1.1 实现原理分析 3.1.2 应用实例分析 3.2 强指针和弱指针 3.2.1 强指针的实现原理分析 3.2.2 弱指针的实现原理分析 ...

    Android实验五.doc

    掌握 Service 的启动和停止方法,熟悉 Service 的生命周期,掌握 NotificationManager的使用方法。 【实验要求】 1、 练习使用两种方式启动 Service,并通过 Logcat 观察 Service 的生命周期 2、 练习使用 ...

Global site tag (gtag.js) - Google Analytics