我有两项活动,A& B.服务从B开始,代码如下:
startService(new Intent(this, PlayerService.class));
Intent connectionIntent = new Intent(this, PlayerService.class);
bindService(connectionIntent, mp3PlayerServiceConnection, Context.BIND_AUTO_CREATE);
private ServiceConnection mp3PlayerServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
mp3Service = ((LocalBinder) binder).getService();
Thread t = new Thread() {
public void run() {
mp3Service.playSong(getApplicationContext(),url);
}
};
t.start();
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
};
当我在活动A(B关闭但播放音乐)时,我需要有可能关闭服务。如何从A onDestroy()调用StopService?需要我解开它,如果是的话,如何以及在哪里?
简单地将stopService(new Intent(this,PlayerService.class));
导致错误:活动B已泄露服务连接...最初绑定在此处。 (但B已经关闭)
答案 0 :(得分:4)
你应该在B onStop()中取消绑定服务,然后你可以在A中调用stopService。
答案 1 :(得分:3)
所以要澄清一些事情。服务可以有两种类型,不一定是互斥的。
这两种类型是开始和有界的。
STARTED服务是以startService()
开头的服务,通常用于完成与活动流程有些独立的后台操作。例如,下载远程数据的服务可以独立于创建它的活动运行,然后在准备好后立即返回结果。
启动的服务会一直运行,直到它自行停止。
BOUNDED服务更像是客户端 - 服务器IPC模式。例如,音频媒体播放器应该是绑定服务,以便活动能够向服务查询媒体播放器的状态,例如,曲目名称,长度...
绑定服务只要有绑定的组件就会存在。
因此,如果您的服务已启动,则应使用stopSelf()
或stopService()
从服务实施中停止服务。如果它被绑定,当没有更多的组件绑定它时它会停止。您使用unbindService()
取消绑定服务。请注意,服务可以是启动服务也可以是绑定服务!
有关详细信息,请参阅:
http://developer.android.com/guide/components/services.html
考虑在您的应用程序中使用IntentService
而不是Service
,因为您似乎不需要将您的服务设置为多线程。
答案 2 :(得分:1)
在销毁Unbind
之前,您需要service
Activity
。 unbindService(myConnection);
答案 3 :(得分:1)
在unbindService()
onStop()