调用stopService方法时,服务不会停止

时间:2010-02-01 11:43:12

标签: android service

我目前有一个运行正常的服务,但是当我尝试使用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方法?当我按下停止扫描按钮时,我的服务中的onDestroy()方法不会被调用。

我还缺少其他任何我应该停止服务的内容吗?

编辑:要在运行stopService而不是onServiceConnected()时调用onServiceDisconnected(),为什么会发生这种情况?

编辑:添加更多关于绑定的信息

我在onCreate()方法中调用bindService,然后让releaseBind()方法取消绑定服务。

以下是该方法的代码:

 public void releaseBind(){
    unbindService(this);
  }

所以我认为解除绑定不是我的问题?

3 个答案:

答案 0 :(得分:43)

我猜你有releaseBind()方法调用意味着您之前曾在此服务上调用bindService()releaseBind()正在调用unbindService()。如果我的猜测不正确,请忽略此答案。


在所有bindService()个来电都有相应的unbindService()来电后,服务会关闭。如果没有绑定的客户端,那么当且仅当有人在服务上调用stopService()时,该服务还需要startService()

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

  1. 您仍然绑定了客户(例如,其他活动),在这种情况下,您无法停止服务,直到他们解除绑定
  2. 由于unbindService()stopService()都是异步的,因此可能会因时间问题而陷入困境,如果您从{{1}调用stopService(),您可能会获得更好的运气} ServiceConnection方法
  3. 另外,请记住,服务被销毁的确切时间取决于Android,可能不会立即生效。因此,例如,如果您依靠onServiceDisconnected()使您的服务停止正在完成的某项工作,请考虑使用另一个触发器(例如,通过服务绑定器调用onDestroy()方法的活动接口)。

答案 1 :(得分:10)

您的所有绑定都已关闭吗?

  

A service can be used in two ways.这两种模式不是   完全   分离。您可以绑定到服务   那是从startService()开始的。   例如,背景音乐   可以通过调用来启动服务   带有Intent对象的startService()   识别要播放的音乐。   只有在以后,可能是用户   想要控制一下   玩家或获取有关的信息   当前的歌,将是一项活动   建立与服务的连接   通过调用bindService()。在案件   像这样,stopService()不会   实际上停止服务直到   最后一个绑定已关闭

答案 2 :(得分:4)

对于迟到的回答,我很抱歉,但据我所知,我已成功停止此代码中的服务:您可以在此处查看link

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");

}
}