如何从Android中的其他活动停止服务?

时间:2013-07-16 19:58:42

标签: android service android-activity unbind

我有两项活动,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已经关闭)

4 个答案:

答案 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 ActivityunbindService(myConnection);

答案 3 :(得分:1)

unbindService()

中尝试onStop()