绑定服务并调用服务中的方法

今天我们重点讲下服务的绑定与解绑,还有如何调用服务中的方法。我们直接看代码吧,其中都有很详细的描述。

MainActivity:

package com.example.text02;

import com.example.text02.MyService.MyBind;

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.util.Log;
import android.view.View;
import android.widget.TextView;
/**
 * 客户端Activity页面想获取服务中的getRandom(),不能直接通过new对象完成方法的调用
 * 在服务中要通过:Ibind
 * 因为只要连通服务必定会调用服务端的onBind()方法,该方法就会返回一个IBinder对象
 * 客户端就会想办法接受服务端的IBinder对象--》就通过ServiceConnection中的onServiceConnected方法得到服务端的IBinder对象
 * 因为只要服务连通就将返回的IBinder对象给了该方法的第二个参数IBind Service,因此第二个参数就是服务端返回的IBinder对象
 * 
 * 所以客户端与服务端连接的桥梁就是IBinder
 * 
 * 只要考虑:将在服务端的某个方法或者数据放在IBinder中,而客户端收到的IBind中就会存在数据或方法了
 * 
 * 通常在服务端定义一个继承自Bind的子类,在该子类中定义一个公共的方法返回服务对象(因为客户端不能直接new服务对象)
 * 然后在onBind方法中创建这个继承自Bind的子类对象,,最后返回该对象
 * 
 * 在客户端中直接获取第二个参数并进行强转--》拿到MyService方法再调用geRandom方法
 * @author Administrator
 *
 */
public class MainActivity extends Activity {

	private MyConnection conn;
	private TextView tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		conn = new MyConnection();
		tv = (TextView) findViewById(R.id.tv);
	}

	public void bind(View view) {
		Intent intent = new Intent(this, MyService.class);
		/*
		 * 当想绑定服务的时候调用的方法 Intent service:指明要连接的服务是哪一个 ServiceConnection
		 * conn:监听服务中数据的变化,连通,没有连通 int flags:通过flags对服务做标记
		 */
		boolean flag = bindService(intent, conn, BIND_AUTO_CREATE);
		Log.i("main", "绑定是否成功?" + flag);
	}

	public void unbind(View view) {
		unbindService(conn);
		tv.setText("已解除绑定");
	}

	class MyConnection implements ServiceConnection {

		// 服务连通时回调的方法
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			Log.i("main", "onServiceConnected----》客户端连通了服务");
			// 获取服务端传来的IBinder对象
			MyBind bind = (MyBind) service;
			// 调用MyBind中的公共方法
			MyService myService = bind.getService();
			// 调用MyService中的getRandom方法
			int i = myService.getRandom();
			tv.setText("" + i);
		}

		// 服务没有连通时回调方法,但是通常表示意外中断连通的时候才会调用
		@Override
		public void onServiceDisconnected(ComponentName name) {
			Log.i("main", "onServiceConnected----》客户端没有连通服务");
		}

	}

}
MyService:

package com.example.text02;

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

public class MyService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		MyBind bind = new MyBind();
		return bind;
	}
	class MyBind extends Binder{
		public MyService getService(){
			return MyService.this;
		}
	}
	/**
	 * 普通类之间的方法的调用是通过new对象,通过对象.方法名()
	 * 但是:Service服务是不能直接new MyService();
	 * @return
	 */
	public int getRandom(){
		return (int) (Math.random() * 10);
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值