【问题标题】:How to stop Service from another activity in Android?如何从 Android 中的另一个活动中停止服务?
【发布时间】:2013-07-16 19:58:42
【问题描述】:

我有 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已经关闭了)

【问题讨论】:

    标签: android service android-activity unbind


    【解决方案1】:

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

    【讨论】:

    • 在onCreate中启动Service,在onStart中绑定,在onStop中解除绑定。
    • 似乎可以正常工作,只要多次运行 B 并返回 A 不会导致一些问题(例如,连接没有及时建立/关闭,一些并发问题)。
    • 在您的服务布尔 mIsPlaying 中设置一个标志,并在 onServiceConnected 中检查此标志。如果 mIsPlaying 为真,则什么也不做。
    • 对不起,问题变得烦人了。我希望仅在 A 活动对话框中停止服务,仅当用户想要离开应用程序时,在对话框中确认,音乐不会在后台播放。所以在这种情况下,我将停止服务。在其他情况下,例如,第二次来到 B 时,我收到错误:Activity B has leaked Service connection ... that original bound here.
    • 嗯,好像又开始工作了……搬进app的案例很多。现在将绑定移至 onStart,再次调用活动不会导致此类错误。
    【解决方案2】:

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

    这两种类型是有界的。

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

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

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

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

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

    更多信息,请参考:

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

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

    【讨论】:

      【解决方案3】:

      在销毁您的Activity 之前,您需要Unbind serviceunbindService(myConnection);

      【讨论】:

      • 即在 B 中的 onDestroy() 我必须解除绑定?
      【解决方案4】:

      在您的onStop() 中尝试unbindService()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-28
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        相关资源
        最近更新 更多