我很困惑。
我有一个我认为需要实现服务的应用程序。该服务特定于应用程序;当应用程序实际死亡或被手动终止时,该服务就会消失。应用程序将与服务保持持续通信,最好是通过服务本身的 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),例如,分别在 onStart
和 onStop
中。
要防止 Service
在未绑定(bind)时被杀死,只需确保您始终在 Activity< 中的某个时刻调用
。这确保 startService(...)
/Service
将继续运行,直到使用 stopService(...)
显式停止它,或者 Service
调用它自己的 >stopSelf()
方法。
关于Android:BoundService 和泄漏的 ServiceConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25413777/