bindService的使用方法

bindService用于绑定一个服务。这样当bindService(intent,conn,flags)后,就会绑定一个服务。这样做可以获得这个服务对象本身,而用startService(intent)的方法只能启动服务。

    bindService方式的一般过程:

1.新建Service类BindService。在BindService类里新建内部类MyBinder,继承自Binder(Binder实现IBinder接口)。MyBinder提供方法返回BindService实例。

    public class MyBinder extends Binder{
       
       
public BindService getService(){
           
return BindService.this;
        }
    }

实例化MyBinder得到mybinder对象;

重写onBind()方法:

 @Override

 public IBinder onBind(Intent intent) {
  return mybinder;
 }

2.在Activity里,实例化ServiceConnection接口的实现类,重写onServiceConnected()和onServiceDisconnected()方法

ServiceConnection conn=new ServiceConnection(){

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
  }

};

3.在Activity的onCreate()方法里,新建Intent,并绑定服务

        Intent intent=new Intent(MainActivity.this,BindService.class);
        bindService(intent, conn,BIND_AUTO_CREATE);

 

4.在Activity的onDestroy里面,添加

unbindService(conn);

如果不加这一步,就会报android.app.ServiceConnectionLeaked: ******.MainActivity has leaked ServiceConnection的异常。

 

bindService()的执行过程如下:

bindService(intent,conn,flag)->Service:onCreate()->Service:onBind()->Activity:onServiceConnected()


code

 1:调用者

package com.zhf.local;

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

/**
 * 此例的目的就是拿到MyService的引用,从而可以引用其内部的方法和变量
 * 
 * @author Administrator
 * 
 */
public class LocalServiceActivity extends Activity {
	/** Called when the activity is first created. */
	private MyService myService;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Intent intent = new Intent(this, MyService.class);
		bindService(intent, connection, Context.BIND_AUTO_CREATE);
	}

	private ServiceConnection connection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			myService = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			myService = ((MyService.MyBinder) service).getService();
			System.out.println("Service连接成功");
			// 执行Service内部自己的方法
			myService.excute();
		}
	};

	protected void onDestroy() {
		super.onDestroy();
		unbindService(connection);
	};
}

2:服务者

package com.zhf.local;

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

public class MyService extends Service {
	private final IBinder binder = new MyBinder();

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

	public class MyBinder extends Binder {
		MyService getService() {
			return MyService.this;
		}
	}

	public void excute() {
		System.out.println("通过Binder得到Service的引用来调用Service内部的方法");
	}

	@Override
	public void onDestroy() {
		// 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		// 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
		System.out.println("调用者退出了");
		return super.onUnbind(intent);
	}
}






发布了20 篇原创文章 · 获赞 4 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览