- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个简单的音乐播放器,我已经创建了一个播放服务,它实现了一个 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;
}
我想知道的是:
提前致谢。
编辑:这里是 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/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!