gpt4 book ai didi

java - 什么时候应该使用 unbindService(),我应该如何正确使用它来解除与使用 AIDL 接口(interface)的远程服务的绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:18 24 4
gpt4 key购买 nike

我正在编写一个简单的音乐播放器,我已经创建了一个播放服务,它实现了一个 AIDL 接口(interface)来与客户端绑定(bind),一个是简单的轨道浏览器,另一个是更简单的播放器 Activity 。该服务控制 MediaPlayer 对象,而这两个 Activity 使用 ServiceConnections 获取与该服务的连接。

这包含在两个 Activity 的 onStart() 方法中:

@Override
public void onStart()
{
super.onStart();
Intent i = new Intent(this, PureService.class);
startService(i);
bindService(i, mConnection, 0);
}

我这样做是为了让服务不会在解除绑定(bind)后立即停止。当然,这实际上并不是问题,因为我的 Activity 根本拒绝与服务解除绑定(bind)。每当我的应用程序在这些 Activity 中的任何一个中进入 unbindService 时,unbindService 每次都会抛出 IllegalArgumentException,无一异常(exception)(呵呵)。

在 onStop 方法中:

@Override
public void onStop()
{
super.onStop();

if (mBound) {
try {
unbindService(mConnection);
} catch (java.lang.IllegalArgumentException e)
{
//Print to log or make toast that it failed
}
}
mBound = false;
}

我想知道的是:

  • 我应该在 onStop() 方法中调用 unbindService() 吗?或者根本没有?
  • 我的调用正确吗?
  • 我应该了解的启动/绑定(bind)服务的方式有什么特别之处吗?
  • 我做的事情是不是彻底、完全错误了?我是 Android 编程的新手,所以这当然不是不可能的。

提前致谢。

编辑:这里是 ServiceConnection 覆盖

public void onServiceConnected(ComponentName className, IBinder service) {
mBound = true;
mService = IPureService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}

播放器 Activity 中有一些额外的代码,但它与绑定(bind)本身无关。

最佳答案

首先,除非您确实需要跨进程调用此服务(即从其他 .apk 调用,或者出于某种原因您正在使用 android:process 将您自己的 .apk 拆分为多个进程),否则我真的建议放弃使用 aidl。这是没有好处的更复杂。服务文档中的“本地服务示例”显示了如何执行此操作:http://developer.android.com/reference/android/app/Service.html

其次,在开始的同时进行绑定(bind)强烈表明设计中存在一些基本缺陷。启动服务和绑定(bind)到服务在语义上非常不同,因此将根据这些不同的语义在不同的地方完成。也就是说,如果两者都完成了……实际上,您同时使用同一个服务的启动和绑定(bind)是一种不寻常的情况。

在用于播放音乐的服务的类实现中,它会在主动执行播放时使用 start(因此当用户不再主动与应用程序的 UI 交互时,它的进程不会被系统杀死) .当用户进入 UI 时启动服务可能会导致痛苦,因为现在服务的启动/停止状态没有明确定义——它可能因为正在播放或因为用户恰好进入应用程序的用户界面,现在什么时候是停止它的合适时间?这会很麻烦。

现在至于何时取消绑定(bind)——您只需要确保始终将 unbindService() 与之前的 bindService() 相匹配。从您的代码 fragment 来看,您似乎正在这样做,但其中有一些奇怪的事情,比如 mBound 从未被设置过。事实上,如果您始终在 onStart() 中绑定(bind)并在 onStop() 中取消绑定(bind),则永远不需要 mBound 来决定是否取消绑定(bind),因为 onStop() 总是在 onStart() 之后调用。

因此,使用您在此处提供的代码,看起来没有问题。但是,如果您遇到异常,那么很明显它可能在您的应用程序的其他地方。为了帮助缩小问题范围,您可以在调用 bindService() 时使用此标志,以便在发生故障时在日志中获取其他信息:http://developer.android.com/reference/android/content/Context.html#BIND_DEBUG_UNBIND

关于java - 什么时候应该使用 unbindService(),我应该如何正确使用它来解除与使用 AIDL 接口(interface)的远程服务的绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6645254/

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