【ALearning】第五章 Android相关组件介绍(二)Service

Service是Android中的四大组件之一,所以在Android开发过程中起到非常重要的作用。下面我们来看一下官方对Service的定义。

Service is
an application component thatcan perform long-running operations in the background and does not provide auser interface. Another application component can start a service and it willcontinue to run in the background even if the user switches to anotherapplication.
Additionally, a component can bind to a service to interact withit and even perform interprocess communication (IPC). For example, a servicemight handle network transactions, play music, perform file I/O, or interactwith a content provider, all from the background.

对应的中文就是:Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。

【博客专栏:http://blog.csdn.net/column/details/alearning.html

Service有两种状态,“启动”和“绑定”。

在上一部分我们介绍了Activity生命周期,在介绍Service的过程中,我们同样需要介绍Service的生命周期的概念。

以下是Service的生命周期图:

Service服务:

       是一段长生命周期,没有用户界面的程序,可以用来开发监控类程序。较好的例子是:正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有很多歌Activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的Activity,因为使用者当然会认为在导航到其他屏幕时音乐应该是持续播放的。在这个例子中,媒体播放器这个Activity会使用Context.startService()来启动一个service,从而可以再后台保持音乐的播放。同时,系统也将保持这个service一直执行,知道这个service运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service还没有运行将启动它)。当连接到一个service之后,我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。

Service的使用步骤

1、继承Service类

2、AndroidManifast.xml配置清单文件中<application>节点里对服务进行配置

<span style="font-size:18px;"><!-- 注册Service服务 -->
        <service
            android:name="cn.mahaochen.app.alearning.chapter5.TestService"
            android:enabled="true" >
        </service>
</span>

服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务。

通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart();

如果服务已经启动再次调用只会触发onStart()方法。使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的。onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-->onDestory();

想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory()。

测试代码:TestService

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class TestService extends Service {

	// 定义Tag标签
	private static final String TAG = "TestService";
	private MyBinder mBinder = new MyBinder();  

	@Override
	public IBinder onBind(Intent intent) {
		Log.e(TAG, "TestService start IBinder .");
		return mBinder;
//		return null;
	}

	@Override
	public void onCreate() {
		Log.e(TAG, "TestService start onCreate .");
		super.onCreate();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		Log.e(TAG, "TestService start onStart .");
		super.onStart(intent, startId);
	}

	@Override
	public void onDestroy() {
		Log.e(TAG, "TestService start onDestroy .");
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		Log.e(TAG, "TestService start onUnbind .");
		return super.onUnbind(intent);
	}

	public class MyBinder extends Binder {
		public TestService getService() {

			return TestService.this;
		}
	}
}

ServiceActivity

import android.app.Activity;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class ServiceActivity extends Activity {

	private TestService testService;
	private Button stopServiceButton; // 停止Service按钮
	private Button bindServiceButton; // 绑定Service按钮
	private Button unBindServiceButton; // 解除绑定Service按钮
	// 这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到
	private ServiceConnection mServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			testService = ((TestService.MyBinder) service).getService();
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置主布局文件XML
		setContentView(R.layout.activity_chapter5_service);
		initViews();
	}

	// 初始化视图
	private void initViews() {
		stopServiceButton = (Button) findViewById(R.id.stopService_button);
		bindServiceButton = (Button) findViewById(R.id.bindService_button);
		unBindServiceButton = (Button) findViewById(R.id.unBindService_button);
		SrvActOnClickListener clickListener = new SrvActOnClickListener();
		stopServiceButton.setOnClickListener(clickListener);
		bindServiceButton.setOnClickListener(clickListener);
		unBindServiceButton.setOnClickListener(clickListener);
	}

	// 内部类,由于本类只有ServiceActivity自己使用,所以采用内部类,然而内部的使用场景不局限于此
	private class SrvActOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.stopService_button:
				Toast.makeText(ServiceActivity.this, "stopService",
						Toast.LENGTH_SHORT).show();

				break;
			case R.id.bindService_button:
				Toast.makeText(ServiceActivity.this, "bindService",
						Toast.LENGTH_SHORT).show();

				break;

			case R.id.unBindService_button:
				Toast.makeText(ServiceActivity.this, "unBindService",
						Toast.LENGTH_SHORT).show();

				break;

			default:
				break;
			}
		}
	}
}

参考资料

1、http://blog.csdn.net/ryantang03/article/details/7770939

2、http://blog.csdn.net/android_tutor/article/details/5789203

时间: 2024-10-07 05:45:36

【ALearning】第五章 Android相关组件介绍(二)Service的相关文章

【ALearning】第五章 Android相关组件介绍(一)Activity

Android应用程序由一些零散的有联系的组件组成,通过一个工程manifest绑定在一起.在manifest中,描述了每一个组件以及组件的作用,其中有6个组件,它们是Android应用程序的基石. Activities(活动) Service(服务) Content Provider(内容提供者) Intent(意图) Broadcast Receiver(广播接收器) Notification(通知) 在这里我们提到了组件(Component)的概念,组件(Component)是对数据和方法

【ALearning】第四章 Android Layout组件布局(二)

前面我们分别介绍和学习了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoluteLayout(绝对布局).这次我们要进行RelativeLayout(相对布局)和TableLayout(表格布局)的学习.这部分是很重要的知识点.RelativeLayout是开发过程中强烈建议使用的,而TableLayout是满足一些特定需求时(常见表格显示,但不局限于此)需要使用. [博客专栏:http://blog.csdn.net/column/details/alearn

【ALearning】第二章 Android工程相关知识介绍

本章主要初步介绍Android工程开发环境的搭建,以对Android项目整体的认识与了解.本章包括Android开发环境搭建.第一个Android项目Hello World与Android项目的文件目录结构介绍. Android开发环境搭建 Android开发环境的搭建方式有两种,分别是Eclipse/MyEclipse+ADT+Android SDK和Android Developer Tools.前者方式的开发环境搭建,参看[http://blog.sina.com.cn/s/blog_4e

Android学习笔记—第四章 Android开发组件2

第四章 Android开发组件2 列表类组件 (1)ListView组件:以垂直列表的形式列出需要显示的列表项 相关属性: a. android:divider  用于为列表视图设置分隔条,可以用颜色或者图片资源 b. android:dividerHeight  设置分隔条的高度 c. android:entries  通过数组资源为ListView指定列表项 d. android:footerDividersEnabled  设置是否在footerView之前绘制分隔条,默认为true. e

【Android的从零单排开发日记】之入门篇(五)——Android四大组件之Service

这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的级别差不多,但不能自己运行只能后台运行.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等, 总之服务总是藏在后台的. ps:Service运行在主线程中的,所

Android学习笔记—第二章 Android四大组件

第二章 Android四大组件 Activity(活动窗口): Android程序中最基本的模块,为用户操作而展示的可视化用户界面.一个Android应用程序可以只有一个Activity,也可以包含多个Activity,数量及每个Activity的作用取决于应用程序及其设计. (1)Activity的生命周期 创建→运行   onCreate   onStart   onResume 运行→销毁   onPause    onStop    onDestory 运行→停止(不可见  不可操作)

我的Android第三章:Android的组件介绍

小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数据并连同相关资源打包进一个Android 包内,它是一个以.apk 为后缀的压缩文件. 一个 .apk 文件中的 所有代码就是一个程序.这个.apk文件就用于在Android设备上安装这个程序. 一旦安装成功,这个Android程序就拥有了自己独立的运行沙盒(沙盒是在受限的安全环境中运行应用程序的一

【ALearning】第四章 Android Layout组件布局(一)

在本章中,我们将Android学习组件布局.在前面的章节,我们也开始使用LinearLayout布局.然后我们在布局文件更加具体的学习和理解,会. Android的界面是有布局和组件协同完毕的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件依照布局的要求依次排列.就组成了用户所看见的界面. Android的五大布局各自是LinearLayout(线性布局).FrameLayout(单帧布局).RelativeLayout(相对布局).AbsoluteLayout(绝对布局)和Table

Thinking In Java笔记(第五章 初始化与清理(二))

第五章 初始化与清理(二) 5.5 清理:终结处理和垃圾回收 清理的工作常常被忽略,Java有垃圾回收器负责回收无用对象占据的内存资源.但也有特殊情况:假定对象(并非使用new)获得了一块"特殊"的内存区域,由于垃圾回收器只知道释放那些由new分配的内存,所以不知道如何释放特殊内存.Java允许在类中定义一个名为finalize()的方法,工作原理"假定"是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,首先调用其finalize()方法,并且在下一次垃圾回收动