我很困惑。

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

在我看来,这意味着服务应该是绑定服务。

但是,绑定服务后旋转手机时,主要活动调用onStop(),并且出现泄漏的serviceConnection提示。我认为服务的重点不是在应用程序旋转或失去焦点等时自嘲。

我想我可以在应用程序中简单地禁用旋转功能,但这是次优的,因为非常需要针对不同方向使用不同的布局。这样做似乎也很糟糕,因为如果其他某个应用程序获得了关注,我仍然会遇到相同的问题。

我认为(但不确定)如果这是一项启动的服务,则将绕过对onStop()的调用,但后来我无法在其上调用方法。

在实践中如何做到这一点:如何实现服务,以便可以直接在其上调用方法,但旋转手机时不会让操作系统抱怨?是否可以在活动中启动方法然后绑定到方法?那行得通吗?

最佳答案

我认为服务的重点不是在应用程序旋转或失去焦点等时自嘲。


那是对的。但是,您遇到的问题略有不同。假设您的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()方法为止。

关于android - Android:BoundService和泄漏的ServiceConnection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25413777/

10-11 05:05