首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓: BoundService和泄露的ServiceConnection

安卓: BoundService和泄露的ServiceConnection
EN

Stack Overflow用户
提问于 2014-08-20 20:23:28
回答 1查看 579关注 0票数 2

我很困惑。

我有一个我认为需要实现服务的应用程序。此服务是特定于应用程序的;当应用程序实际死亡或手动终止时,服务可能会消失。应用程序将与服务保持不断的通信,最好是通过服务本身的活动调用方法。

这对我来说意味着服务应该是绑定服务。

但是,当我在绑定了服务后旋转电话时,主活动调用onStop(),并得到一个泄漏的serviceConnection应答。我认为服务的全部目的不是在应用程序旋转或失去焦点时对自己进行核弹,等等。

我想我可以简单地禁用应用程序中的旋转功能,但是这不是最优的,因为对于不同的方向有不同的布局是非常需要的。这样做似乎也是很糟糕的形式,因为如果其他应用程序占据了重点,我仍然会遇到同样的问题。

我认为(但我不确定),如果这是一个启动服务,那么对onStop()的调用将被规避,但是我不能在它上调用方法。

如何在实践中做到这一点:如何实现服务,使我可以直接调用方法,但不让操作系统抱怨,当我旋转电话?是否有方法在活动中启动方法,然后绑定到它?那能行吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-20 21:02:23

我认为服务的全部目的不是在应用程序旋转或失去焦点时对自己进行核弹,等等。

这是正确的。然而,你遇到的问题却是微妙的不同。假设您的ServiceConnection在您的Activity中类似于以下内容..。

代码语言:javascript
复制
MyService mService = null;
boolean mBound = false;

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
        mBound = false;
    }
};

...you可以看到,mService保存了对Service对象的引用。当你旋转你的手机,系统试图破坏和重新创建你的Activity,但除非你‘取消’mService引用(通过解除绑定),然后它会导致一个泄漏的ServiceConnection。因此,您需要相应地绑定/取消绑定,例如,分别在onStartonStop中。

为了防止Service在未绑定时被杀死,只需确保始终在Activity中的某个点调用startService(...)。这确保了Service将继续运行,直到使用stopService(...)显式停止为止,或者如果Service调用自己的stopSelf()方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25413777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档