6

我有 2 个活动,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));导致一个错误:Activity B has leaked Service connection ... 最初绑定在这里。(但 B 已经关闭)

4

4 回答 4

4

你应该在 B 的 onStop() 中解绑服务,然后你可以在 A 中调用 stopService。

于 2013-07-16T20:01:50.060 回答
3

所以要澄清一些事情。服务可以有两种类型,不一定是互斥的。

这两种类型是有界的。

STARTED 服务是一种启动服务startService(),通常用于完成在某种程度上独立于活动流程的后台操作。例如,一个下载远程数据的服务可以独立于创建它的活动运行,然后在准备好时简单地返回结果。

启动的服务会一直运行,直到它自己停止。

BOUNDED 服务更像是客户端-服务器 IPC 模式。例如,音频媒体播放器应该是绑定服务,以便活动能够查询有关媒体播放器状态的服务,例如曲目名称、长度...

只要有绑定的组件,绑定服务就会存在。

stopSelf()因此,如果您的服务已启动,您应该使用或从您的服务实现内部停止它stopService()。如果它被绑定,它会在没有更多的组件绑定到它时停止自己。您使用 取消绑定服务unbindService()。请注意,服务既可以是启动服务,也可以是绑定服务!

有关更多信息,请参阅:

http://developer.android.com/guide/components/services.html

还可以考虑在您的应用程序中使用 anIntentService而不是 a Service,因为您似乎不需要您的服务是多线程的。

于 2013-07-16T20:36:31.970 回答
1

试试 unbindService()你的onStop()

于 2013-07-16T20:07:49.923 回答
1

你需要Unbindservice销毁你的Activity.unbindService(myConnection);

于 2013-07-16T20:02:23.740 回答