今天我们重点讲下服务的绑定与解绑,还有如何调用服务中的方法。我们直接看代码吧,其中都有很详细的描述。
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);
}
}