Android:BoundService 和泄漏的 ServiceConnection

标签 android service

我很困惑。

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

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

但是,当我在绑定(bind)服务后旋转手机时,主要 Activity 调用 onStop(),我得到了一个泄漏的 serviceConnection 尖叫声。我认为服务的全部意义在于在应用程序旋转或失去焦点等时 self 攻击。

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

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

这在实践中是如何实现的:如何实现一个服务,以便我可以直接调用它的方法,而不是让操作系统在我旋转手机时提示?有没有办法在 Activity 中启动方法然后绑定(bind)到它?那还能行吗?

最佳答案

I thought the whole point of services was not to nuke themselves when application rotated, or lost focus, etc.

没错。但是,您遇到的问题略有不同。假设您的 Activity 中有一个类似于以下内容的 ServiceConnection...

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 引用(通过解除绑定(bind)),否则它会导致泄漏服务连接。因此,您需要相应地绑定(bind)/取消绑定(bind),例如,分别在 onStartonStop 中。

要防止 Service 在未绑定(bind)时被杀死,只需确保您始终在 Activity< 中的某个时刻调用 startService(...)/。这确保 Service 将继续运行,直到使用 stopService(...) 显式停止它,或者 Service 调用它自己的 >stopSelf() 方法。

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

相关文章:

java - Dropdown android - 仅当用户更改其值时才调用 setOnItemSelectedListener

android - 防止触摸屏幕时出现android状态栏

android - 在不丢失与设备的连接的情况下将蓝牙连接实现到服务或应用程序类

Android - 多项服务未按预期运行

linux - Spring Boot 应用程序即服务

android - 混淆器错误 : Expecting class path seperator - not sure where I need to put a path in quotes

java - 如何在启动时将数据写入文件

android - dropbox api - 我应该选择哪个保管箱图标?

ruby-on-rails - 在 AngularJS 服务中包装参数以更新 API 请求

从 Windows 服务调用批处理文件