但是,Fragments 没有 bindService() 之类的东西。
但他们可以bindService()
从Application
上下文中使用:
public class BshFragment extends Fragment implements OnClickListener,
ServiceConnection {
private IScript service=null;
private Button btn=null;
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View result=inflater.inflate(R.layout.main, container, false);
btn=(Button)result.findViewById(R.id.eval);
btn.setOnClickListener(this);
btn.setEnabled(false);
setRetainInstance(true);
return(result);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getActivity().getApplicationContext()
.bindService(new Intent(getActivity(),
BshService.class), this,
Context.BIND_AUTO_CREATE);
}
@Override
public void onDestroy() {
getActivity().getApplicationContext().unbindService(this);
disconnect();
super.onDestroy();
}
@Override
public void onClick(View view) {
EditText script=(EditText)getView().findViewById(R.id.script);
String src=script.getText().toString();
service.executeScript(src);
}
@Override
public void onServiceConnected(ComponentName className, IBinder binder) {
service=(IScript)binder;
btn.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName className) {
disconnect();
}
private void disconnect() {
service=null;
btn.setEnabled(false);
}
}
(如本示例项目所示,本书涵盖)
通过使用Application
上下文,我们可以将其Context
用于绑定和解除绑定。通过保留片段,我们可以避免在配置更改时取消绑定和重新绑定。
就个人而言,我只是尽量避免绑定模式。我是松耦合接口的粉丝,因此我更喜欢通过命令模式和startService()
.