Android四大组件之—— 使用服务进行后台操作

什么是服务

服务是一个没有可视化界面的组件,它可以在后台长期运行并进行各种操作。

服务的创建

我们只需要继承Service类并实现相应的方法即可创建服务

要想启动服务,还得在AndroidManifest中注册服务

服务类的示例代码

package com.whathecode.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class ExtendsionService extends Service
{

	/**
	 * 当服务第一次被创建的时候调用此方法
	 */
	@Override
	public void onCreate()
	{

		super.onCreate();
		Toast.makeText(getBaseContext(), "服务被创建了", Toast.LENGTH_SHORT).show();
	}

	/**
	 * 当通过startService方法启动服务时此方法被调用
	 */
	@Override
	public int onStartCommand(Intent intent, int flags, int startId)
	{
		Toast.makeText(getBaseContext(), "服务被启动了", Toast.LENGTH_SHORT).show();
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public IBinder onBind(Intent intent)
	{
		return null;
	}

	@Override
	public void onDestroy()
	{
		super.onDestroy();
	}

}

使用startService启动服务

主界面的逻辑代码:


package com.whathecode.servicedemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity
{

	Intent service = null;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//创建服务
		service = new Intent(this, ExtendsionService.class);
	}

	public void start(View view)
	{
		//启动服务
		startService(service);
	}

	public void stop(View view)
	{
		//停止服务
		stopService(service);
	}
}

注册服务:

<service android:name="com.whathecode.servicedemo.BackgroundService"></service>

运行效果:

注意:

当我们第一次点击启动服务按钮的时候,onCreate方法和onStartCommand方法依次执行,

但在第二次点击启动服务按钮的时候,这个服务已经处于运行状态,onCreate方法不再执行第二次,

而onStartCommand方法总是在调用startService启动服务的时候执行。

onDestroy方法在stopService方法被调用后执行。

除了使用startService方法启动服务外,我们还可以使用Bind的方式启动服务。

前者和后者的不同在于:

服务的生命周期不依赖于启动者。服务被启动后一直在后台运行直到调用stopService被停止。

使用Bind方式启动服务,服务的生命周期依赖于启动者。即服务在启动者退出后自动销毁。

使用Bind方式启动服务

主要使用bindService方法启动服务,unbindService方法销毁服务。

使用此方式启动服务的好处是,bind定成功的时候服务返回一个IBinder对象,

我们可以通过在服务类里面实现这个对象,从而访问服务里面的具体方法。

从而达到和服务沟通的目的。

注意:

我们不能以直接实例化服务的方式调用里面的方法。

另外:

如果在退出服务的时候没有解绑,那么程序就会抛出异常IllegalArgumentException异常。

因此,每次调用bindService启动服务,完成后需要退出服务都需要使用unbindService 解绑。

示例代码:

package com.whathecode.servicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

public class MainActivity extends Activity
{

	Intent service = null;
	IReceptionist rpst;

	/**
	 * bindService和unbindService方法使用的参数
	 */
	private ServiceConnection conn = new ServiceConnection()
	{

		//此方法在服务连接被意外终止的时候被调用,
		@Override
		public void onServiceDisconnected(ComponentName name)
		{

		}

		//当服务被连接上的时候自动调用这个方法,第二个参数是服务类onBind方法中返回的对象
		@Override
		public void onServiceConnected(ComponentName name, IBinder service)
		{
			rpst = (IReceptionist) service;
			rpst.callExtendsionNumber();
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//创建服务
		service = new Intent(this, ExtendsionService.class);
	}

	public void start(View view)
	{
		//启动服务
		startService(service);
	}

	public void stop(View view)
	{
		//停止服务
		stopService(service);
	}

	public void bind(View view)
	{
		//绑定服务
		bindService(service, conn , BIND_AUTO_CREATE);
	}

	public void unBind(View view)
	{
		//解绑服务
		unbindService(conn);
	}
}

继承ServiceBinder对象,并实现自定义接口:

通过这个方式,我们可以暴露只需要的方法,实现代码的保护。

IReceptionist接口代码:

package com.whathecode.servicedemo;

public interface IReceptionist
{
	public void callExtendsionNumber();
}

ExtendsionService服务类代码:

package com.whathecode.servicedemo;

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

public class ExtendsionService extends Service
{

	private static final String TAG = "ExtendsionService";

	/**
	 * 当服务第一次被创建的时候调用此方法
	 */
	@Override
	public void onCreate()
	{

		super.onCreate();
		Toast.makeText(getBaseContext(), "服务被创建了", Toast.LENGTH_SHORT).show();
	}

	/**
	 * 当通过startService方法启动服务时此方法被调用
	 */
	@Override
	public int onStartCommand(Intent intent, int flags, int startId)
	{
		Toast.makeText(getBaseContext(), "服务被启动了", Toast.LENGTH_SHORT).show();
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public IBinder onBind(Intent intent)
	{
		return new ServiceBinder();
	}

	@Override
	public void onDestroy()
	{
		Toast.makeText(getBaseContext(), "服务被销毁了", Toast.LENGTH_SHORT).show();
		Log.d(TAG, "服务被销毁了");
		super.onDestroy();
	}

	public void putExtendsion()
	{
		Toast.makeText(getBaseContext(), "正在帮你转接分机", Toast.LENGTH_SHORT).show();
	}

	/**
	 *
	 * 继承Binder并实现IReceptionist接口
	 * 继承Binder类的目的是onBind方法中需要返回这个类型的对象
	 *
	 * 实现IReceptionist接口是暴露方法的需要
	 */
	private class ServiceBinder extends Binder implements IReceptionist
	{
		public void callExtendsionNumber()
		{
			putExtendsion();
		}

		private void otherMethod()
		{

		}
	}
}

运行效果:

注意看上图,我们在按下返回键的时候,Activity被销毁,由它启动的服务也跟着被销毁。

这样的服务貌似作用不大,有没有办法在退出Activity的时候不退出服务呢?

答案是有的:Android允许我们先启动一个服务,然后再调用bindService绑定到服务,

这样,我们既可以达到和服务沟通的目的,也可以使服务长期在后台运行。

看下图:

通过下面的图,就可以更清楚地理解上面代码的工作原理:

时间: 2024-10-10 17:42:41

Android四大组件之—— 使用服务进行后台操作的相关文章

深入剖析Android四大组件(二)——Service服务之启动与绑定

如果说Activity通常都会提供一个用户界面UI的话,那么服务则不会提供任何用户界面,尽管如此,服务的作用仍然非常重要,它为我们提供了一种类似守护线程的手段来维持一些希望在退出以后仍然能持续运行的程序. 1.服务 既然服务的作用如此重要,本篇主要讲解如何使用服务和声明应用程序服务,下一节讲解怎么高效率的运用服务. ①何为服务 服务是一个应用程序组件,它在后台执行运行时间比较长的操作,不提供用户界面.它可以被其他应用程序组件启动或停止,并且当用户切换到另一个应用程序时,它仍然在后台持续的运行.另

Android四大组件之一Service介绍-android学习之旅(十二)

基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService启动并把绑定该组件进行通信. 使用场景 后台下载文件,以及播放音乐等 注意 service运行在主线程中,他不会创建属于自己的线程,也不是运行在独立的线程中,所以在使用的时候,需要自己创建线程,而不应该直接使用,这样会造成ANR错误. service的两种形式 started service 其他组

Android四大组件之服务

创建一个服务,并与活动绑定 作为安卓四大组件之一的服务,毫无例外也要在manifast中进行注册 新建服务类继承于Service,并覆盖onBind( )方法,用于与活动绑定 public class MySevice extends Service { //创建DownloadBinder对象mBinder private DownloadBinder mBinder = new DownloadBinder(); //创建DownloadBinder类,实现服务中需要等待活动指示来执行的方法

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个

android四大组件

Activity 为应用提供了可视化用户界面,与用户进行交互 启动模式 standard singleTop singleTask singleInstance ContentProvider内容提供者 共享数据,为跨应用的数据交换提供了一个标准 insert update delete query ContentResovler uri BroadcastReceiver广播接收者 用于接收程序(包括用户开发的程序和系统内建程序)所发出的broadcastReceiver 耗电量 开机启动 窃

Android四大组件及其应用--&gt;

android四大组件分别为:activity/service/content provider/broadcast receiver; 1.activity--> (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. 2.service--> (1)service用于在后台完成

Android四大组件——Service

Service相关链接 Service初涉 Service进阶 Service精通 Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行,并且可以和其他组件进行交互.Service是没有界面的长生命周期的代码.Service是一种程序,它可以运行很长时间,但是它却没有用户界面.这么说有点枯燥,来看个例子,打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android浏览器,这个时候虽然我们已经进入了浏览器程序,但是,歌曲播

android四大组件(详细总结)

Android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. 2.service (1)servic

Android 四大组件 与 MVC 架构模式

作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是一个设计模式,因为划分维度太大,所以MVC应该属于架构模式! 百度百科 —— MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显示分离的方法组织代码,将业务逻辑被聚集到一个部件