gpt4 book ai didi

java - 从 Activity 到 Service 的本地服务绑定(bind)代码

转载 作者:行者123 更新时间:2023-12-01 05:34:17 24 4
gpt4 key购买 nike

用于绑定(bind)到服务的客户端代码,通常位于 Activity 类中;我正在尝试将其移至服务类,以便 Activity 类尽可能干净且小。

即基本上试图合并the code in the second box here into the first box = as much of it into the service class as possible

Activity 中的单行用于绑定(bind)到服务

public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Bind to service with this line only:
AService.bindService(this);
}
}

静态bindService和ServiceConnection移至Service

public class AService extends Service {

public String test = "I want to see this";
public static AService aService;
private static boolean isBound;
private static Context context;

// ... IBinder, onBind etc also here on service side

public static void bindService(Context context) {
try {
Log.i(TAG, "bindService Start");
if (!isBound && context != null) {
Log.i(TAG, "Binding");
context.bindService(new Intent(context, AService.class),
serviceConnection, Context.BIND_AUTO_CREATE);
isBound = true;
Log.i(TAG, "Bound");
}
} catch (Exception e) {
Log.e(TAG, "bindService", e);
}
}

private static ServiceConnection serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
try {
Log.i(TAG, "onServiceConnected Start");
aService = ((AService.LocalBinder) service).getService();
if (aService != null)
Log.i(TAG, aService.test);
Log.i(TAG, "onServiceConnected Finish");
} catch (Exception e) {
Log.e(TAG, "onServiceConnected", e);
}
}

public void onServiceDisconnected(ComponentName className) {
try {
Log.i(TAG, "onServiceDisconnected");
aService = null;
} catch (Exception e) {
Log.e(TAG, "onServiceDisconnected", e);
}
}
};


public static void unbind() {
try {
Log.i(TAG, "unbind start");
if (isBound && context != null) {
Log.i(TAG, "Unbinding");
context.unbindService(serviceConnection);
isBound = false;
context = null;
Log.i(TAG, "Unbound");
}
} catch (Exception e) {
Log.e(TAG, "unbind", e);
}
}

}

但是 onServiceConnected 从未被调用过?

日志显示以下所有内容:

...
Bound
  • 但是不在ServiceConnected Start或之后
  • 无一异常(exception)。
  • 请注意,当相同的代码在 Activity 中时,它会起作用(当使用 MyActivity.this 调用时)

我做错了什么?

最佳答案

是这个吗

AService.bindService(this);

比这个好得多吗?

bindService(new Intent(context, AService.class),
serviceConnection, Context.BIND_AUTO_CREATE);

ServiceConnection 实现位于 Activity 中真的让您很烦恼吗?我不信。

我认为没有必要将所有内容集中到 Service 中,然后在实际 Service 中调用静态方法来从 Activity 启动此 Service。最佳实践是遵循 Google 建议的标准做事方式,按照您的方式这样做,您的代码会变得晦涩难懂,并使其他人在阅读您的代码时感到困惑(如果您在团队中工作)。在我看来,这没有任何意义。

与其把所有的精力都花在将服务与 Activity 隔离开来,我宁愿更多地考虑如何将业务逻辑与 Activity 隔离并集中到服务中,让 Activity 主要关注 UI 的东西。

真心希望对您有帮助。

关于java - 从 Activity 到 Service 的本地服务绑定(bind)代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423049/

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