【Android学习】Android服务之Service(2)--绑定本地Service

再上一篇博客中,简单的介绍了Service的用法,也就是Service的启动与关闭。不过,当程序通过startService()和stopService()启动、关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service与访问者之间无法进行通信、数据交换。就如同平时我们寄信,当信寄出去后,我们无法得到信是否送达、在送信过程中的状况等等,当我们想得到这些信息时,也就是当我们想Service与访问者之间进行方法调用以及数据交换时,就应该用到bindService()和unbindService()方法来启动、关闭Service。


Context的bindService()方法的完整命名为:bindService(Intent service,ServiceConnection conn,int flags)

service:该参数通过Intent指定要启动的Service

conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接状态。当访问者访问者与Service之间连接成功时将回调该ServiceConnection对象的onServiceConnected(ComponentName name,Ibinder service)方法;当Service所在的宿主进程由于异常中止或其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。

flags:指定绑定时是否主动创建Service(如果Service还未创建)。该参数可以是0(不自动创建)或BIND_AUTO_CREATE(自动创建).

------当调用者主动通过unBindService方法断开与Service的连接时,ServiceConnection对象的onServiceDisconnected(ComponentName name)方法不会被调用。


ServiceConnection对象的onServiceConnected方法中有一个Ibinder对象,该对象即可实现与被绑定Service之间的通信。


下面的例子示范了如何在Activity中绑定本地Service,并获取Service的运行的状态,即与Service通信。

BinderService.java:

package com.ye_yun_lin.binderserviceactivity;

import android.R.integer;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class BinderService extends Service{
	private int count;
	private boolean quit;
	private MyBinder myBinder=new MyBinder();
	
	public class MyBinder extends Binder{
		public int getcount(){
			return count;
		}
	}

	@Override
	public IBinder onBind(Intent intent) {
		System.out.println("Service is binded");
		return myBinder;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("Service is created");
		new Thread(){

			@Override
			public void run() {
				while (!quit) {
					try {
						Thread.sleep(1000);
					} catch (Exception e) {
						
					}
					count++;
				}
			}
			
		}.start();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		this.quit=true;
		System.out.println("Service is Destroyed");
	}

	@Override
	public boolean onUnbind(Intent intent) {
		System.out.println("Service is unbinded");
		return super.onUnbind(intent);
	}

}

配置Service:

        <service android:name="com.ye_yun_lin.binderserviceactivity.BinderService">
            <intent-filter>
                <action android:name="com.ye_yun_lin.binderserviceactivity.BinderService.local"/>
            </intent-filter>
        </service>

MainActivity.java:

package com.ye_yun_lin.binderserviceactivity;

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

public class MainActivity extends Activity {
	private Button bindButton,unbindButton,buttonStatusButton;
	BinderService.MyBinder binder;
	
	private ServiceConnection conn=new ServiceConnection() {
		
		//当该Activity与Service断开连接时回调该方法
		@Override
		public void onServiceDisconnected(ComponentName name) {
			System.out.println("--Service Didconnected--");
		}
		//当该Activity与Service连接成功时回调该方法
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			System.out.println("--Service Connected--");
			binder=(BinderService.MyBinder) service;
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		bindButton=(Button)findViewById(R.id.bindservice);
		unbindButton=(Button)findViewById(R.id.unbindservice);
		buttonStatusButton=(Button)findViewById(R.id.servicestatus);
		
		final Intent intent=new Intent();
		intent.setAction("com.ye_yun_lin.binderserviceactivity.BinderService.local");
		
		bindButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				bindService(intent, conn, Service.BIND_AUTO_CREATE);
			}
		});
		
		unbindButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				unbindService(conn);
			}
		});
		
		buttonStatusButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, "Service的count值为:"+binder.getcount(), Toast.LENGTH_SHORT).show();
			}
		});
	}
}

结果:



通过上面两个例子,我们可以得到Service的生命周期:


【Android学习】Android服务之Service(2)--绑定本地Service,,5-wow.com

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