Android 之 Service服务

使用Service 进行后台服务

1、Service 简介:
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可
视化界面,运行与后台的一种服务程序;

What is Service?
Service就是系统中的服务:
特点:
* 无法与用户直接进行交互;
* 必须由用户或者其他程序显示的来启动,优先级比较高;
* 比处于前台的应用优先级低,但是比后台的其他应用程序优先级高;

When?
当需要某些程序在后台运行的时候就使用Service;当Activity的生命周期结束的时候,
Service还是存在的;

2、Service的分类:本地service  和  远程service;
本地service:就是和当前的应用在同一个进程的service,彼此之间有共同的内存区域,
所以对于某些数据的共享特别的方便和简单;

远程service:主要牵扯到不同进程间的service访问。因为android的系统安全的原因导致
了我们在不同的进程间无法使用一般的方式共享数据。因此:android为我们提供了一个AIDL
(android interface description language)接口描述语言;

3、Service生命周期:
service的生命周期相比于Activity比较简单:

onCreate() ---> onStart() ---> onDestroy() 这三个方法;

注:在一次生命周期中,服务只能被创建一次,销毁一次,但是可以启动多次;

在Activity中与service有关的方法为:

情况一:
startService(Intent intent); 启动一个service
stopService(Intent intent); 停止一个service

情况二:当想使用service中的一些数据的或者访问其中的一些方法时:
bindService(Intent intent,ServiceConnection conn,int flags);
unbindService(ServiceConnection conn);

参数说明:
参1:跳转到service的intent;
参2:conn 代表一个与service连接状态的类,当连接service成功或失败
时会主动触发其(ServiceConnection)内部的onServiceConnected()或者
onServiceDisconnected()方法,如果想要访问service的数据,那么可以
在onServiceConnected()方法中进行;
小贴士:
使用服务绑定,当acitivity生命周期结束后service的生命周期也跟着结束,
他们的关系时同存亡的;

4、service的使用步骤:
①:创建一个类继承service这个类;
②:每一个组件都要在androidManifest.xml中进行注册;
③:在Activiy中进行启动、绑定、解绑、或者精致service;

案例:实现音乐后台播放;


Activity代码部分:
package com.example.service;

import com.example.service.MyServiceForData.MyBinder;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
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;



/* service 使用 测试 */
public class MainActivity extends Activity {

   /*  生命组件对象  */
	private Button startService;
	private Button stopService;
	private Button bindService;
	private Button unbindService;
	private Button getData;
	
	private Intent intent;
	private Intent intentForData;
	
	/* 声明一个Binder对象, 用于指引到service中onBind()返回的Binder对象 */
	private MyBinder binder=null;
	
	/* 表示与service连接状态的类 :ServiceConnection */
	public ServiceConnection conn = new ServiceConnection() {
		
		/* 表示连接service失败 */
		public void onServiceDisconnected(ComponentName name) {
			
		}
		
		/* 表示连接service成功 */
		/* 参1:连接到service组件的名称 ; 参2:在service中返回的IBinder对象 */
		public void onServiceConnected(ComponentName name, IBinder service) {
			binder = (MyBinder) service; 
		
		}
	};
	
	
	/* 获得组件对象 */
	protected void init(){
		startService = (Button) findViewById(R.id.startService);
		stopService = (Button) findViewById(R.id.stopService);
		bindService = (Button) findViewById(R.id.bindService);
		unbindService= (Button) findViewById(R.id.unbindService);
		getData = (Button) findViewById(R.id.getData);
	}
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        /* 调用init()方法 , 初始化组件对象 */
        init();
        
        /* new一个Intent对象,实现service的调用 ,交互 */
        intent = new Intent(MainActivity.this,MyService.class);
        intentForData = new Intent(MainActivity.this,MyServiceForData.class);
        
        
        /* 为startService写OnClickListener事件,开启service */
        startService.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				/* 启动服务 */
				startService(intent);		
			}
		});
        
        /* stopService的OnClickListener事件,关闭service */
        stopService.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				/* 停止service */
				stopService(intent);
				
			}
		});
        
        /* 邦定service */
        bindService.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				/* 绑定service , bindService(); */
				bindService(intentForData, conn, Service.BIND_AUTO_CREATE);
				
			}
		});
        
        /* 解除绑定 */
        unbindService.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				/* 解绑service,unbindService()  */
				unbindService(conn);		
			}
		});
        
        /* 获取数据 */
        getData.setOnClickListener(new OnClickListener() {
			
        	/* 查看从service中或得到的数据 */
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, ""+binder.getCount(), 1000).show();
				
			}
		});
        
    }


    
}


service代码部分:
package com.example.service;
import android.R;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

/* 创建自己的service , 要继承Service这个类; *//* 测试启动过程  */
public class MyService extends Service {

	/* 声明一个媒体对象 */
	private	MediaPlayer mediaPlayer ;

	/* 当用户显示的call startService之后首先调用 */
	/* 创建service */
	public void onCreate() {
		super.onCreate();
		
		/* service创建的时候就获取MediaPlayer的对象 *//* 参1:上下文对象;参2:音乐文件资源ID*/
//		mediaPlayer = MediaPlayer.create(this, 2);
		
		Log.i("MyService", "onCreate()..创建service..");
	}

	/* 启动service  */
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		
		/* service启动的时候打开音乐 */
//		mediaPlayer.start();
		Log.i("MyService", "onStart()..开始service..");
	}

	/* 停止服务 */
	public void onDestroy() {
		super.onDestroy();
		/* service停止的时候关闭音乐 */
//		mediaPlayer.stop();
		Log.i("MyService", "onDestroy()..停止service..");
	}

	/* 绑定服务 */
	public IBinder onBind(Intent intent) {
		return null;
	}
}


service与activity进行数据交互:
package com.example.service;

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

/* 测试访问service中的数据 *//* 案例:获取该服务中变量的值  */
/*  需要实现方法:onBind(); onUnbind(); onCreate(); onDestroy(); */

public class MyServiceForData extends Service {
	
	/* service中的变量  */
	private int count = 0 ; 
	private boolean flags;
	
	/* 创建MyBinder对象,用于onBind()方法返回一个Binder对象 */
	MyBinder myBinder = new MyBinder();
	
	/* 内部类:创建一个类MyBinder, 继承Binder */
	public class MyBinder extends Binder{
		/* 该内默认有个无参的构造方法 */
		public MyBinder(){}
		
		/* 获取count的值 */
		public int getCount(){
			return count;
		}
	}

	/* 创建service */
	public void onCreate() {
		super.onCreate();
		Log.i("MyServiceForData", "onCreate()...创建service..");
		
		/* service创建时,启动一个线程,用于完成对count值的改变 */
		new Thread(){
			/* run()方法里面程序就时现成执行的程序; *//*  该现成用于改变count的值 */
			public void run(){
				super.run();
				while(!flags){
					count++;
				}
			}
		}.start();
		
	}

	/* 绑定service */
	public IBinder onBind(Intent intent) {
		Log.i("MyServiceForData", "onBind()...绑定service..");

		return myBinder;
	}

	/* 解绑service */
	public boolean onUnbind(Intent intent) {
		Log.i("MyServiceForData", "onUnbind()...解绑service..");
		return super.onUnbind(intent);
	}
	
	/* 停止service */
	public void onDestroy() {
		super.onDestroy();
		Log.i("MyServiceForData", "onDestroy()...停止service..");
	}

}



猜你喜欢

转载自sunzone.iteye.com/blog/1872375