2010-08-02 40 views
15

在我的Android应用程序,我打电话都startServicebindService我是否需要为Android服务调用unbindService和stopService?

Intent intent = new Intent(this, MyService.class); 
ServiceConnection conn = new ServiceConnection() { ... } 

startService(intent) 
bindService(intent, conn, BIND_AUTO_CREATE); 

后来,我尝试都unbindService and stopService`:

unbindService(conn); 
stopService(intent); 

但是,我上调用unbindService异常。如果我删除了此通话,则该应用似乎可以通过stopService通话正常运行。

我做错了什么?我认为bindService呼叫必须与unbindService呼叫相关联,并且startService呼叫必须与stopService呼叫相关联。虽然这似乎并不是这种情况。

+0

你有没有想过这个?我遇到了同样的事情,并为我自己评论了unbindService(conn)。似乎没问题,但就像你一样,我的直觉说背景中的东西不会喜欢它。 – 2010-12-16 03:34:58

回答

24

为stopService的Android文档()指出:

注意,如果停止服务仍具有绑定到它与BIND_AUTO_CREATE集ServiceConnection对象,也不会被破坏,直到所有这些绑定被删除。有关服务生命周期的更多详细信息,请参阅服务文档。

所以打电话stopService()第一,然后unbindService()应该工作(它对我有用)。

+1

啊,所以这听起来像我的'unbindService'和'stopService'的顺序是倒退的,我明白了。 – 2011-02-20 21:04:20

+0

谢谢,这帮助了我!我有BIND_AUTO_CREATE使用和unbindService()帮助解决ServiceConnection泄漏的问题。 – lomza 2013-01-30 09:30:44

+0

@Matt哈金斯,所以你们的意思是首先解除绑定,然后停止? – 2014-11-19 12:40:35

5

正如你所见,here它取决于你想要达到什么以及你如何绑定服务。如果您想要长时间引用该服务,最好使用bindService而不是startService。如果在bindService方法中使用了标志BIND_AUTO_CREATE,那么您不必调用startService,因为服务在必要时自动启动。

如果您调用unBind服务,那么您对服务的关联将被删除。你不必'明确停止服务,但你可以。但需要注意的是,如果您调用unBind(),则该服务可以随时停止。

+1

谢谢,但我一直在那里,并不清楚我是否需​​要解除绑定并停止服务,如果我手动启动它,然后用BIND_AUTO_CREATE标志绑定到它。 – 2010-08-05 16:28:43

8

一个疑难杂症,我打这个:

确保您拨打unbindService上,你叫bindService相同的上下文。就我而言,我是做了以下绑定它:

Context c = getApplicationContext(); 
c.bindService(...); 

然后解除绑定,只是:

unbindService(...); 

确保两者绑定和取消绑定使用了相同的情况下解决了这个问题。

+1

谢谢 - 刚刚被这个绊倒了 – SteelBytes 2012-09-29 06:31:50

相关问题