Android:BoundService和泄露的ServiceConnection

时间:2014-08-20 20:23:29

标签: android service

我很困惑。

我有一个应用程序,我相信需要实现一项服务。该服务特定于该应用程序;当应用程序实际死亡或手动终止时,该服务可能会消失。应用程序将与服务保持持续通信,理想情况是通过服务本身的活动调用方法。

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

然而,当我在绑定服务后旋转手机时,主要活动会调用onStop(),并且我得到一个泄漏的serviceConnection尖叫声。当应用程序轮换或丢失焦点等时,我认为服务的整个点是来自我核心。

我想我可以简单地禁用应用程序中的旋转功能,但这是次优的,因为非常需要为不同的方向设置不同的布局。这样做似乎也是一种糟糕的形式,因为如果其他一些应用程序成为焦点,我仍然会遇到同样的问题。

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

如何在实践中完成:如何实现服务以便我可以直接调用它上面的方法,但是当我旋转手机时操作系统没有抱怨?有没有办法在活动中启动方法然后绑定到它?这甚至会起作用吗?

1 个答案:

答案 0 :(得分:1)

  

我认为服务的重点不在于应用程序轮换或失去焦点等时自我核心。

这是正确的。但是,你遇到的问题却略有不同。假设您ServiceConnection中的Activity与以下内容相似......

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;
    }
};

...您可以看到mService包含对您的Service对象的引用。当您旋转手机时,系统会尝试销毁并重新创建Activity,但除非您“取消”mService引用(通过解除绑定),否则会导致泄露ServiceConnection。因此,您需要相应地绑定/取消绑定,例如分别在onStartonStop中。

要防止Service在未绑定时被杀死,请确保始终在startService(...)中的某个位置呼叫Activity。这可确保Service继续运行,直到使用stopService(...)明确停止,或Service调用自己的stopSelf()方法。