gpt4 book ai didi

java - 如何防止绑定(bind)服务在 Activity 的运行时更改时被破坏(例如 : orientation)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:51 25 4
gpt4 key购买 nike

我有一个绑定(bind)服务。一个 Activity 正在绑定(bind)它。它在 Activity 的 onStop() 方法上取消绑定(bind)服务。

问题是,如果 Activity 发生运行时更改(例如,方向更改),则会重新创建 Activity。因此,从 Activity 调用 onStop() 方法,并且 Activity 在该方法中解除绑定(bind) Service,这导致 Service 销毁(并重新启动它)。

我想防止服务在运行时更改中被破坏,同时在 Activity 不可见时保持服务停止。您可以说尝试 startService() 但它使服务在 Activity 不可见时不会停止。如果我添加 stopService Activity 的 onStop(),则结果与 bindService()unbindService() 相同。

Acitivity的 onStop()中的

PostDelaying unbindService()可以部分解决这个问题,但是延迟的时间是任意的,这样会导致Activity在某些时候无法获得GC时间。我想要一个更清晰的解决方案。

我不想要像 android:configChanges="orientation" 这样的解决方案,因为还有其他运行时更改,这是处理运行时更改的一种不受欢迎的方式。

简而言之,我希望服务像调用 setRetainInstance(true) 的 Fragment 一样工作。但是,Fragments 没有类似 bindService() 的东西。我该怎么办?

最佳答案

However, Fragments don't have something like bindService().

但是他们可以在 Application 上下文中使用 bindService():

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);
}
}

(如 this sample project 中所见,涵盖在 this book 中)

通过使用 Application 上下文,我们可以使用相同的 Context 进行绑定(bind)和解除绑定(bind)。通过保留 fragment ,我们可以避免在配置更改时取消绑定(bind)和重新绑定(bind)。

就个人而言,我只是尽量避免绑定(bind)模式。我是松耦合接口(interface)的粉丝,所以我更喜欢通过命令模式和 startService() 使用服务。

关于java - 如何防止绑定(bind)服务在 Activity 的运行时更改时被破坏(例如 : orientation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com