如果我们想调用服务里面的方法,这个是不允许的,我们可以通过绑定服务间接地调用服务的serviceConnection实现类获取服务开启和停止的消息。当服务成功被绑定的时候会执行OnBind方法,返回一个IBinder的代理对象,代理对象里面有个方法可以间接的调用到服务的方法。
Activity类:
public class MainActivity extends Activity {
private Button bindButton;
private Button unBindButton;
private Button serviceMethod;
private IService binder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindButton = (Button) findViewById(R.id.button1);
unBindButton = (Button) findViewById(R.id.button2);
serviceMethod = (Button) findViewById(R.id.button3);
// 绑定服务
bindButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TestService.class);
bindService(intent, new ServiceConnections(), BIND_AUTO_CREATE);
}
});
// 解除绑定
unBindButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TestService.class);
unbindService(new ServiceConnections());
}
});
// 调用服务的方法
serviceMethod.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
binder.classInServiceMethod();
}
});
}
class ServiceConnections implements ServiceConnection {
// 当服务成功绑定后调用该方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (IService) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
Service类:
public class TestService extends Service {
@Override
public IBinder onBind(Intent intent) {
// 服务成功绑定,返回一个代理对象
return new MyBinder();
}
/**
* 为什么要定义成private呢,安全起见,只能让他调用接口中的方法
*
* @author Administrator
*
*/
private class MyBinder extends Binder implements IService {
// 代理人间接地调用服务的方法
@Override
public void classInServiceMethod() {
serviceMethod();
}
}
// 服务里面的方法
private void serviceMethod() {
Toast.makeText(getApplicationContext(), "我是服务里面的方法,你不能直接调用我 ", 1).show();
}
@Override
public void onCreate() {
System.out.println("服务创建了");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("服务销毁了");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("服务解除了绑定");
return super.onUnbind(intent);
}
}
记住配置service:
<service android:name="com.alan.bindservice.TestService" ></service>
布局就是三个按钮而已,还有一个就是IService接口,里面就只有一个方法。这样就实现了调用服务里面的方法 。