绑定服务场景:应用内其他地方需要调用服务中的方法。
例子1,Binder中的所有方法都可以被调用:
public class BindService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new ServiceBinder();
}
public class ServiceBinder extends Binder {
public void callServiceMethod() {
sayHello();
}
}
public void sayHello() {
System.out.println("Hello bindService!");
}
}
服务要在manifest中注册。
调用:
public class MainActivity extends Activity {
private ServiceBinder mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind();
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mService != null) {
mService.callServiceMethod();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unBind();
}
private void bind() {
Intent service = new Intent(this, BindService.class);
bindService(service, mConnection, Context.BIND_AUTO_CREATE);
}
private void unBind() {
if (mConnection != null) {
unbindService(mConnection);
}
mService = null;
}
ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("进程挂了或服务被异常杀死时调用");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = (ServiceBinder) service;
System.out.println("綁定成功");
}
};
}
例子2,binder中有自己的私有方法不想被外部调用,则需要添加接口,把外部可以访问的方法写到接口中。
public interface IServiceBinder {
public void callServiceMethod();
}
服务:
public class BindService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new ServiceBinder();
}
public class ServiceBinder extends Binder implements IServiceBinder {
@Override
public void callServiceMethod() {
sayHello();
}
// 不想被外部调用的方法
private void sayGoodBye() {
System.out.println("bye bye BindService!");
}
}
public void sayHello() {
System.out.println("Hello BindService!");
}
}
调用:
public class MainActivity extends Activity {
private IServiceBinder mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind();
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mService != null) {
mService.callServiceMethod();
}
}
});
}
private void bind() {
Intent service = new Intent(this, BindService.class);
bindService(service, mConn, Context.BIND_AUTO_CREATE);
}
private void unBind() {
if (mConn != null) {
unbindService(mConn);
}
mService = null;
}
protected void onDestroy() {
super.onDestroy();
unBind();
};
ServiceConnection mConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = (IServiceBinder) service;
}
};
}