不要在Activity销毁时销毁绑定的Service。

6

目前,我需要一个绑定(音乐)服务,因为我需要与它进行交互。但是我也希望即使所有组件都解除绑定,它也不会停止

正如Android开发者指南所说:

"[...] 多个组件可以同时绑定到服务中,但当它们全部解除绑定时,该服务将被销毁。"

指南还说:

"[...] 您的服务可以双向工作 - 它可以启动(无限期运行)并且允许绑定。"

在我的应用程序中,服务在应用程序启动时启动。我希望只有用户单击我在自定义通知中显示的关闭按钮才能销毁此服务。但是当前,当我销毁我的MainActivity时,服务也会停止。

这是我现在的情况,在我想创建我的服务时调用:

public void createServiceConnection(){
     musicConnection = new ServiceConnection(){
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MusicService.MusicBinder binder = (MusicService.MusicBinder)service;
            musicSrv = binder.getService();
            attachMusicService();
        }
    };
}

...调用了这个函数:

public void attachMusicService(){
    playerFragment.setMusicService(musicSrv);
    musicSrv.attach(context); //need this for my listeners, nevermind
    bindService(context);
}

...它调用了这个函数:

    public void bindService(Context act){
        if(playIntent==null){
            playIntent = new Intent(act, MusicService.class);
            act.startService(playIntent);

            act.bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        }else{
            act.startService(playIntent);
            act.bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        }

//finished. I can do stuff with my Service here.
    }

我是否理解错误? 我觉得服务应该在活动被销毁后继续运行,因为我首先创建了一个已启动的服务,然后绑定到它。

2个回答

0

代码似乎是正确的。

根据这个问题,我发现我的问题在于我显示的通知,这非常有趣

看起来一个无限运行的服务需要有一个通过startForeground(NOTIFY_ID, notification);显示的通知。

我之前使用notificationmanager.notify(NOTIFY_ID, notification);显示了我的通知,现在我已经

 `notificationmanager.notify(NOTIFY_ID, notification);
  startForeground(NOTIFY_ID, notification);`

在我的所有绑定的活动被销毁后,该服务将不再停止。


首先你说:“看起来我的代码是正确的。”然后你证明它其实并不正确 :) - Wukash
抱歉,我的意思是“我发布的代码”。“问题”并未包含在我在问题中展示的代码中。 - Dominik Seemayr
是的,我知道,这让我微笑了一下 :). 我确信你已经在调用startForeground了,因为那是最重要的部分 - 让服务后台运行。 - Wukash

0

从自定义应用程序类绑定到您的服务。我认为在绑定到它的活动被销毁(调用onDestroy时)后,您无法保持服务处于活动状态。如果从服务中调用startForeground,则可以在活动暂停(onPause)时保持服务处于活动状态。


1
我读到过,当我使用“startService()”启动服务时,它会遵循已启动服务的生命周期。因此,我可以随时绑定和解除绑定,而不会销毁服务。但是回到您的答案: 您指的是“自定义Application类”?您确切是什么意思? - Dominik Seemayr
你可以像这样扩展Application类:public class MyApplication extends Application。然后在你的清单文件中的application标签中添加这个:android:name=".MyApplication"。重写你的Application的onCreate方法并从那里绑定服务。 - Wukash
听起来很有趣,你以前尝试过类似的东西吗?但我刚刚找到了问题所在,现在它可以工作了。如果你对这个话题感兴趣 - 我已经发布了答案 - 无论如何谢谢你! - Dominik Seemayr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接