当调用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()

所以,这里有一些可能性:

  1. 你仍然有绑定的客户端(例如,其他活动),在这种情况下,你不能停止服务,直到他们解除绑定
  2. 由于unbindService()stopService()都是asynchronous的,所以在某些情况下,如果从ServiceConnectiononServiceDisconnected()方法中调用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"); } }