当调用stopService方法时服务不会停止
我目前有一个服务,运行良好,当我启动它,但是当我试图阻止它使用stopService方法的onDestroy方法不会被调用。
这里是我用来停止服务的代码
stop_Scan_Button =(Button)findViewById(R.id.stopScanButton);
stop_Scan_Button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ Log.d("DEBUGSERVICE", "Stop Button pressed"); Intent service = new Intent(CiceroEngine. CICERO_SERVICE); releaseBind(); Log.d("Stop_Scan_Button", "Service: " + service.toString()); stopService(service); Log.d("Stop_Scan_Button", "Service should stop! "); } });
我正确地认为,当使用stopService时,它调用服务的onDestroy方法? 当我按停止扫描button时,我的服务中的onDestroy()
方法不会被调用。
还有什么我错过了,我应该停止服务?
编辑:添加onServiceConnected()
得到调用时stopService运行,而不是onServiceDisconnected()
,为什么会发生这种情况?
编辑: 添加更多信息关于绑定
我在onCreate()方法中调用bindService,然后使用releaseBind()方法解除绑定服务。
这是该方法的代码:
public void releaseBind(){ unbindService(this); }
所以我认为解绑不是我的问题?
我将猜测你有一个方法调用releaseBind()
意味着你以前在这个服务上调用了bindService()
,而releaseBind()
调用了unbindService()
。 如果我的猜测不正确,请忽略此答案。
所有bindService()
调用都有相应的unbindService()
调用后,服务将closures。 如果没有绑定的客户端,那么当且仅当有人在服务上调用了startService()
时,服务还需要stopService()
。
所以,这里有一些可能性:
- 你仍然有绑定的客户端(例如,其他活动),在这种情况下,你不能停止服务,直到他们解除绑定
- 由于
unbindService()
和stopService()
都是asynchronous的,所以在某些情况下,如果从ServiceConnection
的onServiceDisconnected()
方法中调用stopService()
另外,请记住,被销毁的服务的确切时间取决于Android,可能不是立即的。 所以,举例来说,如果你依靠onDestroy()
来让你的服务停止正在完成的工作,考虑使用另一个触发器(例如,通过服务绑定接口调用stopDoingStuff()
方法的活动)。
你所有的绑定closures了吗?
服务可以以两种方式使用。 这两种模式并不完全分开。 您可以绑定到使用startService()启动的服务。 例如,背景音乐服务可以通过调用startService()来启动,该Intent对象标识要播放的音乐。 只有在以后,当用户想要对播放器进行一些控制或者获得关于当前歌曲的信息时,可以通过调用bindService()来build立与服务的连接。 在这种情况下,stopService()不会实际上停止服务, 直到最后一个绑定closures
。
对于最近的答案,海先生抱歉,但据我所知,我已经成功地停止了这个代码中的服务:你可以在这里查看链接 。
public void onClick(View src) { switch (src.getId()) { case R.id.buttonStart: Log.d(TAG, "onClick: starting srvice"); startService(new Intent(this, MyService.class)); break; case R.id.buttonStop: Log.d(TAG, "onClick: stopping srvice"); stopService(new Intent(this, MyService.class)); break; } }
并在服务类:
public class MyService extends Service { private static final String TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); Log.d(TAG, "onCreate"); } @Override public void onDestroy() { Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); Log.d(TAG, "onDestroy"); } @Override public void onStart(Intent intent, int startid) { Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); } }