Android开发四大组件之Service(实例篇)

关于Service的开发详解已经在上一篇:Android开发四大组件之Service(详解篇)讲的很清楚了,本篇主要对Service的开发实例做下讲解。

程序运行效果图:


程序代码:

BindService:


package com.jph.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
/**
 * Describe:</br>
 * Service子类
 * BindService实现了Service并重写了父类的
 * onBind、onCreate、onDestroy、onUnbind
 * 以及onDestroy等方法。
 * 并在onCreate方法中创建并启动一个线程,动态修改count变量值,
 * 创建Binder的子类LocalService类,用于作为绑定该Service时,
 * 回调方法的返回对象。
 * @author JPH
 * Date:2014.07.21 
 * */
public class BindService extends Service {
	private int count=0;
	private boolean	isQuit=false;
	//定义getService方法返回的对象
	public  LocalService localService=new LocalService();
	//创建Binder子类
	public class LocalService extends Binder{
		public int getCount() {			
			return count;			
		}
		public BindService getService() {			
			return BindService.this;			
		}
	}
	//Service子类必须实现的方法,绑定该Service时回调的方法
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return localService;
	}
	//Service被创建是调用该方法
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		System.out.println("Service is Created.");
		//创建并启动一个线程,动态修改count变量值
		new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while (!isQuit) {
					try {
						Thread.sleep(1000);//使得当前线程休眠1000毫秒
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					count++;
				}
			}			
		}.start();
		super.onCreate();
	}
	//在所有onUnbind被回调之后调用
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		System.out.println("Service is Destroyed.");
		isQuit=true;
		super.onDestroy();
	}
	//定义一个返回实例名的方法
	public String getDemoName() {
		return "Service实例";
	}
	//在所有与Service绑定的客户端都解除绑定之后被回调
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("Service is Unbind.");
		return true;//表示下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind())
	}
	
}
ServiceDemo:


package com.jph.servicedemo;

import com.jph.servicedemo.BindService.LocalService;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/**
 * Describe:</br>
 * Service实例
 * 本实例简单实现了绑定Service并与之通信 
 * @author JPH
 * Date:2014.07.21 
 * */
public class ServiceDemo extends Activity {
	Button btnBind,btnUnBind,btnGetServiceStatus;
	BindService bindService;
	LocalService localService;
	private boolean isBind=false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btnBind=(Button)findViewById(R.id.btnBind);
		btnUnBind=(Button)findViewById(R.id.btnUnBind);
		btnGetServiceStatus=(Button)findViewById(R.id.btnGetServiceStatus);
		OnClickListener listener=new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				switch (v.getId()) {
				case R.id.btnBind:
//					Intent intent=new Intent();
//					intent.setAction("com.jph.servicedemo.BIND_SERVICE"); //隐式启动Service
					Intent intent=new Intent(ServiceDemo.this,BindService.class);//显示启动Service
					//绑定指定的Service
					bindService(intent, serviceConnection, BIND_AUTO_CREATE);
					isBind=true;
					break;
				case R.id.btnUnBind:
					if (isBind) {
						//解除绑定Service
						unbindService(serviceConnection);
						isBind=false;		
						bindService=null;
						Toast.makeText(ServiceDemo.this,"--Service is Unbind.--"
								, Toast.LENGTH_LONG).show();
					}else {
						Toast.makeText(ServiceDemo.this,"--你还未绑定Service--"
								, Toast.LENGTH_LONG).show();						
					}					
					break;
				case R.id.btnGetServiceStatus:
					if (bindService==null) {
						Toast.makeText(ServiceDemo.this,"请先绑定Service"
								, Toast.LENGTH_LONG).show();
					}else {
						Toast.makeText(ServiceDemo.this,"App name:"+
								bindService.getDemoName()+"\n count:"+
								localService.getCount(), Toast.LENGTH_LONG).show();
					}					
					break;
				}
			}			
		};
		btnBind.setOnClickListener(listener);
		btnGetServiceStatus.setOnClickListener(listener);
		btnUnBind.setOnClickListener(listener);
	}
	//定义一个ServiceConnection对象
	private ServiceConnection serviceConnection=new ServiceConnection() {
		//当Activity与Service连接成功的时候回调该方法
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub				
				bindService=null;
				Toast.makeText(ServiceDemo.this,"--Service UnConnected.--"
						, Toast.LENGTH_LONG).show();			
		}
		//当Activity与Service通过非UnBind()方法断开连接的时候回调该方法
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub			
			//获取getService()方法返回的BindService对象
			localService=((LocalService)service);
			bindService=localService.getService();
			Toast.makeText(ServiceDemo.this,"--Service Connected.--"
					, Toast.LENGTH_LONG).show();
			System.out.println("--Service Connected.--");
		}
	}; 
}

AndroidManifest.xml:


<!-- 配置一个Service组件 -->
		<service android:name=".BindService">
			<intent-filter>
				<!-- 为该Service组件的intent-filter配置action -->
                <action android:name="com.jph.servicedemo.BIND_SERVICE"></action>
            </intent-filter>            
        </service>
实例分析:

通过DDMS的LogCat有如上图所示的输出:

    如果用户单击程序界面上的“绑定service”按钮即可看到上图所示的“Service is Created.”与“--Service Connected.--”的输出。当该Activity中绑定该Service之后,该Activity还可以通过LocalService对象获取Service的运行状态,如果用户单击程序界面上的“获取Service状态”按钮即可看到程序界面弹出的提示信息。如果我们单击“解除绑定”按钮,即可看到LogCat中的

输出信息:“Service is Unbind.”,“Service is Destroyed.”,当程序调用ubbindService()方法解除对某个Service的绑定时,系统会先回调Service的ubbindService()方法,然后回调onDestory()方法,这正验证了上一篇中讲到的onDestroy()是Service生命周期中最后一个被回调的方法。

     与多次调用startService()方法启动Service不同的是,多次调用bindService()方法并不会重复绑定。在这个实例中不管用户单击“绑定Service”对少次,系统只会回调Service的onBind()方法一次。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。