需要在服务端的onBind方法中返回一个IBinder对象,同时在客户端中调用bindService方法时传入ServiceConnection对象,通过ServiceConnection的回调方法得到服务端返回的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 {
public MyService getService() {
return MyService.this;
}
}
public int getRandomNumber() {
return new Random().nextInt(100);
}
}
客户端代码:
public class MainActivity extends AppCompatActivity {
private MyService myService;
private boolean isBound = false;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.MyBinder binder = (MyService.MyBinder) iBinder;
myService = binder.getService();
isBound = true;
Log.d(TAG, "Service connected");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
isBound = false;
Log.d(TAG, "Service disconnected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isBound) {
unbindService(connection);
isBound = false;
}
}
public void onClick(View view) {
if (isBound) {
int number = myService.getRandomNumber();
Toast.makeText(this, "Random number: " + number, Toast.LENGTH_SHORT).show();
}
}
}