2013-07-16 27 views
6

我有2个活动,A & B.该服务在B开始有这样的代码:如何停止Android中的其他活动的服务?

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闭合,但音乐播放)。如何从OnDestroy()调用StopService?需要我解除它,如果是的话,如何以及在哪里?

简单地把stopService(new Intent(this,PlayerService.class));导致一个错误:活动B泄漏了服务连接...这是最初绑定在这里。 (但是,B是已经关闭)

回答

4

你应该B中的onStop()解除绑定的服务,那么你可以调用stopService在A.

+0

谢谢,我会尝试 – Tramway11

+0

startService在onCreate中绑定onStart并在onStop中解除绑定。 –

+0

似乎是工作,如果只有多次运行B并返回到A不会导致一些问题(例如,连接没有及时进行/关闭,一些并发问题)。 – Tramway11

1

你需要摧毁你的Activity之前UnbindserviceunbindService(myConnection);

+0

I.e. B中的onDestroy()我必须放置Unbind? – Tramway11

+0

是的,这是对的。如果它不会工作使用onStop() – Oli

1

尝试unbindService()onStop()

3

因此,要明确一些事情。服务可以有两种类型,不一定是相互排斥的。

这两种类型是开始和有界的。

STARTED服务是从startService()开始的服务,通常用于完成与活动流程有些独立的后台操作。例如,充足的下载远程数据的服务可以独立于创建它的活动运行,然后在准备就绪时返回结果。

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

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

只要存在与其绑定的组件,绑定服务就会一直存在。

因此,如果您的服务已启动,您应该在stopSelf()stopService()的服务实施中停止它。如果绑定,当没有更多组件绑定到它时,它会自行停止。您通过unbindService()取消绑定服务。请注意,服务既可以是已启动的服务,也可以是已绑定的服务!还可以考虑使用一个IntentService,而不是在你的应用程序Service,因为它似乎你不需要你的服务是多线程

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

有关详细信息,请参阅本。