【问题标题】:Service won't stop when stopService method is called调用 stopService 方法时服务不会停止
【发布时间】:2010-02-01 11:43:12
【问题描述】:

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

我还有什么遗漏的东西要停止服务吗?

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

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

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

这是该方法的代码:

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

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

【问题讨论】:

    标签: android service


    【解决方案1】:

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


    在所有bindService() 调用都有对应的unbindService() 调用后,服务将关闭。如果没有绑定的客户端,那么服务也需要stopService() 当且仅当有人在服务上调用startService()

    所以,这里有几种可能性:

    1. 您仍然有绑定的客户端(例如,其他活动),在这种情况下,您无法停止服务,直到它们解除绑定
    2. 由于unbindService()stopService() 都是异步的,因此时间可能会出现问题,在这种情况下,如果您从ServiceConnectiononServiceDisconnected() 方法调用stopService() 可能会获得更好的运气

    另外,请记住,服务被销毁的确切时间取决于 Android,可能不会立即生效。因此,例如,如果您依赖onDestroy() 导致您的服务停止正在完成的某些工作,请考虑为此使用另一个触发器(例如,通过服务绑定接口调用stopDoingStuff() 方法的活动)。

    【讨论】:

    • 我已经编辑了我的原始问题以包含有关我的绑定的信息,我确实将它绑定然后解除绑定
    • 嗯,该代码完全搞砸了,几乎肯定会导致您的问题。 bindService()unbindService() 是异步的,并且保证会以您使用它们的方式失败。不幸的是,我不知道你想在这里完成什么,所以我没有进一步的建议。
    • 它只是一个两个按钮的 UI,一个用于启动服务,一个用于停止服务。我已将 if 语句从 releaseBind() 方法中取出,只留下 unBindService(this);这似乎取消注册服务,因为当我第二次单击它时,我收到“服务未注册”错误。但是,stopService 似乎仍然没有在我的 Service 中调用 onDestroy() 方法,后台服务仍然起作用
    • 感谢您的输入,我现在可以正常工作了,感谢您指出我的编码中的缺陷。
    • 但是onServiceDisconnected() 是“在与服务的连接丢失时调用的。这通常发生在托管服务的进程崩溃或被终止时。” IE。当没有更多的活页夹时不应调用它。
    【解决方案2】:

    所有绑定都关闭了吗?

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

    .

    【讨论】:

    • 是的,我只绑定一次,然后调用 releaseBind() 解除绑定
    【解决方案3】:

    大家对迟到的答案感到抱歉,但据我所知,我已成功停止此代码中的服务:您可以在此处查看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");
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多