一个继承Service的TestService类,里面有一个changeTest(String name)方法,要在activity中调用这个方法改变服务中的一些状态,进行一下设计。
public class TestService extends Service {
//服务被成功绑定的时候会调用该方法
@Override
public IBinder onBind(Intent arg0) {
System.out.println("服务被成功的绑定了");
//返回自定义的代理人
//步骤2.服务成功绑定的时候,调用onBind方法,返回一个IBinder对象
return new MyBinder();
}
private class MyBinder extends Binder implements IService{
public void bindChange(String name){
changeTest(name);
}
}
public void changeTest(String name){
System.out.println("这是服务里面的方法"+name);
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("服务被创建");
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("服务被销毁");
}
}
public class MainActivity extends Activity {
//步骤4:在activity里面得到服务Ibinder对象的引用
private IService myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startService(View view){
Intent intent = new Intent(this, TestService.class);
startService(intent);
}
public void stopService(View view){
Intent intent = new Intent(this, TestService.class);
stopService(intent);
}
/**
* 采用绑定的方式开启服务,在TestService中会自动调用onBind方法,该方法返回一个IBinder对象
* 在MainActivity里面实现onServiceConnected()方法,传递进来IBinder参数,这样
* IBinder对象就充当service和activity之间的代理人的角色
* @param view
*/
public void bindService(View view){
//intent激活服务的意图
//conn 代理人,中间人对象用来跟服务建立联系,不能为空
Intent intent = new Intent(this, TestService.class);
//步骤1.采用绑定服务的方法开启服务
bindService(intent, new MyConn(), 0);
}
private class MyConn implements ServiceConnection{
//Called when a connection to the Service has been established
@Override
public void onServiceConnected(ComponentName arg0, IBinder service) {
System.out.println("service的代理人被返回回来了");
//步骤3:服务返回的IBinder对象会传递个MyConn的回调方法onServiceConnected方法
myBinder = (IService)service;
}
//Called when a connection to the Service has been lost
//只有在程序异常终止的时候会自动调用
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
}
//步骤5:利用IBinder对象间接的调用了服务里面的方法
public void changeService(View view){
myBinder.bindChange("仁者无敌");
}
}
public interface IService {
public void bindChange(String name);
}
服务里面的MyBinder类需受到保护,不可以随便让外部代码访问,所以需为private,但是activity中要拿到MyBinder类,故此处定义一个接口IService,MyBinder类实现了这个接口,在activity中
private IService myBinder;
myBinder = (IService)service;
通过接口拿到MyBinder的对象,这样通过这个对象调用的bindChange方法就是实现IService接口的MyBinder类里面实现的方法。