我很困惑。
我有一个应用程序,我相信需要实现一项服务。该服务特定于该应用程序;当应用程序实际死亡或手动终止时,该服务可能会消失。应用程序将与服务保持持续通信,理想情况是通过服务本身的活动调用方法。
这对我来说意味着服务应该是绑定服务。
然而,当我在绑定服务后旋转手机时,主要活动会调用onStop(),并且我得到一个泄漏的serviceConnection尖叫声。当应用程序轮换或丢失焦点等时,我认为服务的整个点是不来自我核心。
我想我可以简单地禁用应用程序中的旋转功能,但这是次优的,因为非常需要为不同的方向设置不同的布局。这样做似乎也是一种糟糕的形式,因为如果其他一些应用程序成为焦点,我仍然会遇到同样的问题。
我认为(但不确定)如果这是一个已启动的服务,对onStop()的调用将被规避,但我无法调用它上面的方法。
如何在实践中完成:如何实现服务以便我可以直接调用它上面的方法,但是当我旋转手机时操作系统没有抱怨?有没有办法在活动中启动方法然后绑定到它?这甚至会起作用吗?
答案 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
。因此,您需要相应地绑定/取消绑定,例如分别在onStart
和onStop
中。
要防止Service
在未绑定时被杀死,请确保始终在startService(...)
中的某个位置呼叫Activity
。这可确保Service
继续运行,直到使用stopService(...)
明确停止,或Service
调用自己的stopSelf()
方法。