我很困惑。
我有一个我认为需要实现服务的应用程序。该服务特定于应用程序;当应用程序实际终止或手动终止时,该服务可能会消失。应用程序将与服务保持持续通信,最好是通过服务本身的活动调用方法。
在我看来,这意味着服务应该是绑定服务。
但是,绑定服务后旋转手机时,主要活动调用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
泄漏。因此,您需要相应地进行绑定/取消绑定,例如分别在onStart
和onStop
中。为了防止
Service
在未绑定时被杀死,只需确保始终在startService(...)
中的某个时刻调用Activity
。这样可以确保Service
将继续运行,直到使用stopService(...)
将其明确停止或Service
调用其自己的stopSelf()
方法为止。关于android - Android:BoundService和泄漏的ServiceConnection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25413777/