好的,我有这个问题。我有一个播放mp3文件的服务。我也可以通过AIDL功能暂停和停止mp3。这很完美。我可以按下主页按钮然后重新启动活动,我仍然可以控制服务。
但是,如果我按后退键然后打开活动,我将无法再控制服务。
我认为应该可以在重新启动活动时重新绑定到控件。但正在发生的事情是该服务的新实例已启动,我无法阻止正在播放的mp3。不过我可以播放新的mp3。我做错了什么?
答案 0 :(得分:4)
我想我明白你想做什么。启动活动并开始播放mp3后,您将退出活动。然后,下次打开它时,您希望绑定到现有服务,而不是启动该服务的另一个实例。
要实现此目的,您必须使用已启动的活动,然后绑定到它。也就是说,按下按钮时使用 startActivity(Intent),然后在下一行中,执行 bindService(Intent,connection,Context.FLAG_AUTO_CREATE); 。这会绑定服务,然后您可以在onDestroy(推荐)或onPause中取消绑定。此外,由于这是一个已启动的服务,因此在解除绑定时不会被破坏。您必须明确调用 stopService(意图)或 stopSelf()来停止此服务。
在您的活动的onResume中,您应该检查服务是否正在运行,然后使用以下代码再次绑定它: bindService(Intent,connection,0);
连接对象是每次绑定或取消绑定到服务时触发的已注册ServiceConnection。
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
}
public void onServiceDisconnected(ComponentName className) {
}
};
此外,您可以使用Messenger服务从活动中发送和接收来自mp3歌曲播放时间的消息。
请参阅this link以了解有关使用Messenger的更多信息。
希望这有帮助。
答案 1 :(得分:0)
我认为应该可以在重新启动活动时重新绑定到控件。
我真诚地希望您不受服务约束,因为您不应在没有解除约束的情况下通过onDestroy()
活动。
但正在发生的事情是该服务的新实例已启动,我无法阻止正在播放的mp3。
这表明您确实解除了与服务的绑定,但该服务在销毁时并未停止播放音乐。
我做错了什么?
大多数音乐播放器都设计为在用户退出活动后允许播放。因此,音乐播放器不应该使用绑定模式,因为绑定模式不支持在用户退出活动后继续运行的服务。
相反,请使用命令模式:call startService()
启动音乐播放,可能使用Intent
个附加功能来控制播放的内容。致电stopService()
以停止播放音乐。 Here is a sample project演示了这一点,实际音乐播放被删除了(正如我在另一本书中所述)。
答案 2 :(得分:0)
这是一个相当古老的问题,但我目前正在解决相关问题。我发现绑定到服务意味着其他应用程序也可以绑定到您的服务并利用其功能。
这是一个好的模式,它可能适用于您的应用程序。
我认为你应该做什么,因为我找不到重新绑定服务的方法;是检查服务是否正在运行(可以通过服务类中的静态布尔值轻松完成,运行时更改为true并在销毁时更改为false)并使用该布尔值来阻止应用程序的onCreate重新启动新的服务意图。然后,您可以再次绑定它并使用其功能。
另外,如果当时只有一首歌的可能性,你可能想要将所有这些变量改为静态,这样任何绑定的应用程序都可以影响它的变量(想想音量等),并从它的变量中读取(想想时间玩,标题等)
希望这有点帮助!