一、Service的概念
Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。
二、Service的生命周期
Service对象不能自己启动,需要通过某个Activity、Service或者其他Context对象来启动。启动的方法有两种,Context.startService和Context.bindService()。两种方式的生命周期是不同的,具体如下所示。
Context.startService方式的生命周期:
启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()
Context.bindService方式的生命周期:
绑定时,bindService -> onCreate() –> onBind()
解绑定时,unbindService –>onUnbind() –> onDestory()
三、实例:控制音乐播放的Service
下面我们用一个可以控制在后台播放音乐的例子来演示刚才所学知识,同学们可以通过该例子可以明显看到通过绑定方式运行的Service在绑定对象被销毁后也被销毁了。
下面把代码分享如下:
1、建立一个新项目名字叫 Lesson14_HelloService,Activity起名叫MainHelloService.java
2、res/layout/main.xml中代码写成
01 < ?xml version="1.0" encoding="utf-8"?>
02 <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent">
03 <textview android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="音乐播放服务" android:textsize="25sp" android:layout_margintop="10dp">
04 <button android:text="开启音乐播放服务" android:textsize="20sp"android:id="@+id/Button01" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
05 </button>
06 <button android:text="停止音乐播放服务" android:textsize="20sp"android:id="@+id/Button02" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
07 </button>
08
09 <button android:text="绑定音乐播放服务" android:textsize="20sp"android:id="@+id/Button03" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
10 </button>
11 <button android:text="解绑定音乐播放服务" android:textsize="20sp"android:id="@+id/Button04" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
12 </button>
13 </textview></linearlayout>
在AndroidManifest.xml中描述如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.basic.lesson14"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainHelloService"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".MusicService">
</service>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
2、在res目录中建立一个raw目录,并把一个音乐文件babayetu.mp3拷贝进来
3、在Activity的同目录新建一个service文件MusicService.java
01 package android.basic.lesson14;
02
03 import android.app.Service;
04 import android.content.Intent;
05 import android.media.MediaPlayer;
06 import android.os.IBinder;
07 import android.util.Log;
08 import android.widget.Toast;
09
10 public class MusicService extends Service {
11
12 //为日志工具设置标签
13 String tag ="MusicService";
14
15 //定义音乐播放器变量
16 MediaPlayer mPlayer;
17
18 //其他对象通过bindService方法通知该Service时该方法会被调用
19 @Override
20 public IBinder onBind(Intent intent) {
21 Toast.makeText(this,"MusicService onBind()",Toast.LENGTH_SHORT).show();
22 Log.i(tag, "MusicService onBind()");
23 mPlayer.start();
24 return null;
25 }
26
27 //其他对象通过unbindService方法通知该Service时该方法会被调用
28 @Override
29 public boolean onUnbind(Intent intent){
30 Toast.makeText(this, "MusicService onUnbind()", Toast.LENGTH_SHORT).show();
31 Log.i(tag, "MusicService onUnbind()");
32 mPlayer.stop();
33 return false;
34 }
35
36 //该服务不存在需要被创建时被调用,不管startService()还是bindService()都会在启动时调用该方法
37 @Override
38 public void onCreate(){
39 Toast.makeText(this, "MusicService onCreate()", Toast.LENGTH_SHORT).show();
40 //创建一个音乐播放器对象
41 mPlayer=MediaPlayer.create(getApplicationContext(), R.raw.babayetu);
42 //设置可以重复播放
43 mPlayer.setLooping(true);
44 Log.i(tag, "MusicService onCreate()");
45 }
46
47 //用startService方法调用该服务时,在onCreate()方法调用之后,会调用改方法
48 @Override
49 public void onStart(Intent intent,int startid){
50 Toast.makeText(this,"MusicService onStart",Toast.LENGTH_SHORT).show();
51 Log.i(tag, "MusicService onStart()");
52 mPlayer.start();
53 }
54
55 //该服务被销毁时调用该方法
56 @Override
57 public void onDestroy(){
58 Toast.makeText(this, "MusicService onDestroy()", Toast.LENGTH_SHORT).show();
59 mPlayer.stop();
60 Log.i(tag, "MusicService onDestroy()");
61 }
62 }
4、MainHelloService.java中的代码:
01 package android.basic.lesson14;
02
03 import android.app.Activity;
04 import android.content.ComponentName;
05 import android.content.Context;
06 import android.content.Intent;
07 import android.content.ServiceConnection;
08 import android.os.Bundle;
09 import android.os.IBinder;
10 import android.util.Log;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
14 import android.widget.Toast;
15
16 public class MainHelloService extends Activity {
17
18 //为日志工具设置标签
19 String tag = "MusicService";
20
21 /** Called when the activity is first created. */
22 @Override
23 public void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.main);
26
27 //输出Toast消息和日志记录
28 Toast.makeText(MainHelloService.this, "MainHelloService onCreate", Toast.LENGTH_SHORT).show();
29 Log.i(tag, "MainHelloService onCreate");
30
31 //定义组件对象
32 Button b1= (Button)findViewById(R.id.Button01);
33 Button b2= (Button)findViewById(R.id.Button02);
34 Button b3= (Button)findViewById(R.id.Button03);
35 Button b4= (Button)findViewById(R.id.Button04);
36
37 //定义服务链接对象
38 final ServiceConnection conn = new ServiceConnection(){
39
40 @Override
41 public void onServiceConnected(ComponentName name, IBinder service) {
42 Toast.makeText(MainHelloService.this, "ServiceConnection onServiceConnected", Toast.LENGTH_SHORT).show();
43 Log.i(tag, "ServiceConnection onServiceConnected");
44
45 }
46
47 @Override
48 public void onServiceDisconnected(ComponentName name) {
49 Toast.makeText(MainHelloService.this, "ServiceConnection onServiceDisconnected", Toast.LENGTH_SHORT).show();
50 Log.i(tag, "ServiceConnection onServiceDisconnected");
51
52 }};
53
54 //定义点击监听器
55 OnClickListener ocl= new OnClickListener(){
56
57 @Override
58 public void onClick(View v) {
59 //显示指定intent所指的对象是个Service
60 Intent intent = newIntent(MainHelloService.this,android.basic.lesson14.MusicService.class);
61 switch(v.getId()){
62 case R.id.Button01:
63 //开始服务
64 startService(intent);
65 break;
66 case R.id.Button02:
67 //停止服务
68 stopService(intent);
69 break;
70 case R.id.Button03:
71 //绑定服务
72 bindService(intent,conn,Context.BIND_AUTO_CREATE);
73 break;
74 case R.id.Button04:
75 //解除绑定
76 unbindService(conn);
77 break;
78 }
79 }
80 };
81
82 //绑定点击监听器
83 b1.setOnClickListener(ocl);
84 b2.setOnClickListener(ocl);
85 b3.setOnClickListener(ocl);
86 b4.setOnClickListener(ocl);
87
88 }
89
90 @Override
91 public void onDestroy(){
92 super.onDestroy();
93 Toast.makeText(MainHelloService.this, "MainHelloService onDestroy", Toast.LENGTH_SHORT).show();
94 Log.i(tag, "MainHelloService onDestroy");
95 }
96 }
Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。

二、Service的生命周期
Service对象不能自己启动,需要通过某个Activity、Service或者其他Context对象来启动。启动的方法有两种,Context.startService和Context.bindService()。两种方式的生命周期是不同的,具体如下所示。
Context.startService方式的生命周期:
启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()
Context.bindService方式的生命周期:
绑定时,bindService -> onCreate() –> onBind()
解绑定时,unbindService –>onUnbind() –> onDestory()
三、实例:控制音乐播放的Service
下面我们用一个可以控制在后台播放音乐的例子来演示刚才所学知识,同学们可以通过该例子可以明显看到通过绑定方式运行的Service在绑定对象被销毁后也被销毁了。

下面把代码分享如下:
1、建立一个新项目名字叫 Lesson14_HelloService,Activity起名叫MainHelloService.java
2、res/layout/main.xml中代码写成
01 < ?xml version="1.0" encoding="utf-8"?>
02 <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent">
03 <textview android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="音乐播放服务" android:textsize="25sp" android:layout_margintop="10dp">
04 <button android:text="开启音乐播放服务" android:textsize="20sp"android:id="@+id/Button01" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
05 </button>
06 <button android:text="停止音乐播放服务" android:textsize="20sp"android:id="@+id/Button02" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
07 </button>
08
09 <button android:text="绑定音乐播放服务" android:textsize="20sp"android:id="@+id/Button03" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
10 </button>
11 <button android:text="解绑定音乐播放服务" android:textsize="20sp"android:id="@+id/Button04" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
12 </button>
13 </textview></linearlayout>
在AndroidManifest.xml中描述如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.basic.lesson14"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainHelloService"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".MusicService">
</service>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
2、在res目录中建立一个raw目录,并把一个音乐文件babayetu.mp3拷贝进来
3、在Activity的同目录新建一个service文件MusicService.java
01 package android.basic.lesson14;
02
03 import android.app.Service;
04 import android.content.Intent;
05 import android.media.MediaPlayer;
06 import android.os.IBinder;
07 import android.util.Log;
08 import android.widget.Toast;
09
10 public class MusicService extends Service {
11
12 //为日志工具设置标签
13 String tag ="MusicService";
14
15 //定义音乐播放器变量
16 MediaPlayer mPlayer;
17
18 //其他对象通过bindService方法通知该Service时该方法会被调用
19 @Override
20 public IBinder onBind(Intent intent) {
21 Toast.makeText(this,"MusicService onBind()",Toast.LENGTH_SHORT).show();
22 Log.i(tag, "MusicService onBind()");
23 mPlayer.start();
24 return null;
25 }
26
27 //其他对象通过unbindService方法通知该Service时该方法会被调用
28 @Override
29 public boolean onUnbind(Intent intent){
30 Toast.makeText(this, "MusicService onUnbind()", Toast.LENGTH_SHORT).show();
31 Log.i(tag, "MusicService onUnbind()");
32 mPlayer.stop();
33 return false;
34 }
35
36 //该服务不存在需要被创建时被调用,不管startService()还是bindService()都会在启动时调用该方法
37 @Override
38 public void onCreate(){
39 Toast.makeText(this, "MusicService onCreate()", Toast.LENGTH_SHORT).show();
40 //创建一个音乐播放器对象
41 mPlayer=MediaPlayer.create(getApplicationContext(), R.raw.babayetu);
42 //设置可以重复播放
43 mPlayer.setLooping(true);
44 Log.i(tag, "MusicService onCreate()");
45 }
46
47 //用startService方法调用该服务时,在onCreate()方法调用之后,会调用改方法
48 @Override
49 public void onStart(Intent intent,int startid){
50 Toast.makeText(this,"MusicService onStart",Toast.LENGTH_SHORT).show();
51 Log.i(tag, "MusicService onStart()");
52 mPlayer.start();
53 }
54
55 //该服务被销毁时调用该方法
56 @Override
57 public void onDestroy(){
58 Toast.makeText(this, "MusicService onDestroy()", Toast.LENGTH_SHORT).show();
59 mPlayer.stop();
60 Log.i(tag, "MusicService onDestroy()");
61 }
62 }
4、MainHelloService.java中的代码:
01 package android.basic.lesson14;
02
03 import android.app.Activity;
04 import android.content.ComponentName;
05 import android.content.Context;
06 import android.content.Intent;
07 import android.content.ServiceConnection;
08 import android.os.Bundle;
09 import android.os.IBinder;
10 import android.util.Log;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
14 import android.widget.Toast;
15
16 public class MainHelloService extends Activity {
17
18 //为日志工具设置标签
19 String tag = "MusicService";
20
21 /** Called when the activity is first created. */
22 @Override
23 public void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.main);
26
27 //输出Toast消息和日志记录
28 Toast.makeText(MainHelloService.this, "MainHelloService onCreate", Toast.LENGTH_SHORT).show();
29 Log.i(tag, "MainHelloService onCreate");
30
31 //定义组件对象
32 Button b1= (Button)findViewById(R.id.Button01);
33 Button b2= (Button)findViewById(R.id.Button02);
34 Button b3= (Button)findViewById(R.id.Button03);
35 Button b4= (Button)findViewById(R.id.Button04);
36
37 //定义服务链接对象
38 final ServiceConnection conn = new ServiceConnection(){
39
40 @Override
41 public void onServiceConnected(ComponentName name, IBinder service) {
42 Toast.makeText(MainHelloService.this, "ServiceConnection onServiceConnected", Toast.LENGTH_SHORT).show();
43 Log.i(tag, "ServiceConnection onServiceConnected");
44
45 }
46
47 @Override
48 public void onServiceDisconnected(ComponentName name) {
49 Toast.makeText(MainHelloService.this, "ServiceConnection onServiceDisconnected", Toast.LENGTH_SHORT).show();
50 Log.i(tag, "ServiceConnection onServiceDisconnected");
51
52 }};
53
54 //定义点击监听器
55 OnClickListener ocl= new OnClickListener(){
56
57 @Override
58 public void onClick(View v) {
59 //显示指定intent所指的对象是个Service
60 Intent intent = newIntent(MainHelloService.this,android.basic.lesson14.MusicService.class);
61 switch(v.getId()){
62 case R.id.Button01:
63 //开始服务
64 startService(intent);
65 break;
66 case R.id.Button02:
67 //停止服务
68 stopService(intent);
69 break;
70 case R.id.Button03:
71 //绑定服务
72 bindService(intent,conn,Context.BIND_AUTO_CREATE);
73 break;
74 case R.id.Button04:
75 //解除绑定
76 unbindService(conn);
77 break;
78 }
79 }
80 };
81
82 //绑定点击监听器
83 b1.setOnClickListener(ocl);
84 b2.setOnClickListener(ocl);
85 b3.setOnClickListener(ocl);
86 b4.setOnClickListener(ocl);
87
88 }
89
90 @Override
91 public void onDestroy(){
92 super.onDestroy();
93 Toast.makeText(MainHelloService.this, "MainHelloService onDestroy", Toast.LENGTH_SHORT).show();
94 Log.i(tag, "MainHelloService onDestroy");
95 }
96 }
发表评论
-
startActivityForResult 简介
2011-03-29 15:55 1284依次打开Activity A1--A2--A3--A4 这时 ... -
startActivityForResult
2011-03-29 15:49 1146startActivityForResult 方法-- ... -
史上最全的Android的Tab与TabHost讲解
2011-03-28 11:22 1591Tab与TabHost 这就是Tab,而盛放Tab的 ... -
Android对话框
2011-03-25 11:21 1125Android 对话框(Dialog)大全 ... -
PreferenceActivity详解
2011-03-25 11:15 1442为了引入这个概率 首先从需求说起 即:现有某Activity专 ... -
TCP/UDP/HTTP
2011-03-25 11:09 1125先来一个讲TCP、UDP和HTTP ... -
9png
2011-03-25 11:08 1914今天学习了用9png图来优化横屏竖屏的UI,使用sdk自带的工 ... -
Notification
2011-03-25 11:07 939Android系统的状态栏(Status Bar)中有一个创新 ... -
一些技巧
2011-03-25 11:03 7871:查看是否有存储卡插入 String status=Envi ... -
布局像素单位
2011-03-25 11:03 827Android的layout文件中有时候可能会指定具体的单位, ... -
使用ActivityGroup来切换Activity和Layout
2011-03-25 11:02 1135在一个主界面中做Activity切换一般都会用TabActiv ... -
activitygroup
2011-03-25 11:01 1730说说tabhost和activitygroup 最近 ... -
线程
2011-03-25 11:01 1014今天在论坛上看到一些关于线程的帖子,我觉得与我理解的有些差异, ... -
类级框架
2011-03-25 11:00 744类集框架:Collection,Map,Iterator,En ... -
Intent打电话
2011-03-25 11:00 1217intent英文意思是意图,pending表示即将发生或来临的 ... -
Intent Uri
2011-03-25 10:59 1068进入联系人页面 1.Intent intent = new I ... -
Broadcast Receiver
2011-03-25 10:56 1948一、Broadcast Receiver简介 Android中 ... -
ContentProvider MIME类型
2011-03-25 10:55 1238Android程序的主要4部分 ... -
ContentProvider-1查询
2011-03-25 10:55 1237今天看了android的官方文档中ContentProvide ... -
ContentProvider-2modify data:insert,update,delete
2011-03-25 10:54 1200今天补充关于modify data ...
相关推荐
在安卓开发中,Service是一种用于在后台长时间运行的组件,它可以独立于用户界面执行任务,例如播放音乐、网络通信等。"不被杀死的 Service"指的是通过特定技术手段实现的Service,它能够在设备清理内存或者用户关闭...
在Android开发中,Service是四大组件之一,它在后台运行,不与用户界面直接交互,常用于执行长时间的任务,如播放音乐、网络通信等。本篇文章将深入解析"android service 简单实例源代码",帮助你理解如何在Android...
Service是Android系统中的一个重要组件,它负责在后台执行长时间运行的操作,不依赖于用户界面。在Android应用开发中,理解Service的启动与停止机制对于创建高效、稳定的后台服务至关重要。 一、Service概述 ...
在Android应用开发中,Service是用于执行长时间运行操作的一个组件,而Activity是用户与应用交互的界面。将Activity与Service绑定是一种常见的通信方式,尤其在需要在后台运行任务且需要与用户界面保持交互时。本...
### Oracle Service_Name 参数详解 #### 一、概述 在Oracle数据库管理中,`service_name`是一个重要的参数,它用于标识数据库实例所提供的服务名称。通过设置正确的`service_name`,可以确保客户端应用程序能够...
在Android开发中,Service是一种可以在后台长时间运行的组件,它不具有用户界面,但可以执行各种后台任务,如播放音乐。本示例的"通过Service播放音频的代码"旨在教你如何利用Service组件来实现音乐播放功能,使得...
Java Service Wrapper 使用总结 Java Service Wrapper 是一种可以将 Java 应用程序发布为可安装的服务的解决方案,它提供了一种简单的方式来将 Java 应用程序打包成一个独立的服务。下面是 Java Service Wrapper ...
在这个"android 录音机 service 例子"中,我们将深入探讨如何结合Service和MediaRecorder来创建一个能够后台录制音频的应用。 1. **Service基础** Service组件是Android应用开发中的关键部分,它可以在没有用户...
在Android应用开发中,Service和Activity是两个非常重要的组件。Service用于在后台执行长时间运行的任务,而Activity则负责用户界面交互。在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中...
ServiceNow是当今流行的企业服务管理平台,它提供了一个集成的系统,允许用户在一个统一的界面中管理和自动化企业内部的各种工作流程。ServiceNow平台的基础手册涵盖了该平台的基本使用方法,包括如何导航、管理记录...
在Android应用开发中,Service是四大组件之一,用于在后台长时间运行操作,比如播放音乐、网络通信等。然而,如果不加以控制,用户或者系统可能会多次启动同一个Service,导致不必要的资源消耗和服务的异常行为。本...
在Android应用开发中,`Service`和`Activity`是两个重要的组件。`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如...
在Android应用开发中,Activity和Service是两个关键组件。Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本...
在Android系统中,Service是一种可以在后台长时间运行的组件,它不提供用户界面,但可以执行各种任务,如播放音乐、网络通信等。当设备启动时,我们有时希望某些Service能够自动启动,以便立即开始执行预定的任务,...
在Android开发中,Service是应用程序组件之一,用于在后台执行长时间运行的操作,即使用户与应用程序交互界面不直接关联。在某些情况下,我们可能需要启动多个Service来执行不同的任务,但问题在于,如果这些Service...
JavaService-2.0.10 是一个针对Java应用程序的服务包装工具,它允许开发者将Java应用程序作为Windows服务来运行。这个版本提供了32位和64位两种版本,以适应不同操作系统环境的需求。 在Windows系统中,服务是一种...
"解决 Service Broker 未启动的问题" Service Broker 是 SQL Server 中的一个组件,用于实现异步消息传递。它允许数据库管理员创建可靠的、可扩展的消息应用程序。但是,有时可能会遇到 Service Broker 未启动的...
区分Action、Service和Dao功能 在软件开发中,Action、Service和Dao都是常用的架构模式,但是很多开发者对这些概念的理解和使用却存在一定的混淆。因此,本文将对Action、Service和Dao的功能进行详细的区分和解释。...
在Android开发中,Service是应用程序组件之一,用于在后台执行长时间运行的操作,即使用户与应用程序交互的界面已关闭。本篇文章将深入探讨Android中的Service,分析不同类型的Service及其特性,并对比它们之间的...
"Android系统在新进程中启动自定义服务过程(startService)的原理" 在 Android 系统中,startService 函数是一个非常重要的函数,它允许开发者在新进程中启动自定义服务。这项技术可以将一些计算型逻辑从主进程中...