首页 > 代码库 > 【ALearning】第五章 Android相关组件介绍(二)Service

【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

      2AndroidManifast.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;
			}
		}
	}
}

 

参考资料

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

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

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