Android:stopService()不调用onDestroy()!

时间:2012-01-31 20:22:34

标签: android service

我在停止播放音频文件的服务方面遇到了很大问题。我想在播放另一个文件之前停止当前的服务。

的活动:

public void playTrack(View view){       
    Intent i=new Intent(this,playService.class);
    i.setAction("com.c0dehunterstudios.relaxer.PLAY");

    if(isPlaying){ 
          stopService(i);   
          isPlaying=false;
          Log.v("ACTIVITY", "Stopping..");
    }

    startService(i);
    isPlaying=true;
}

服务:

public void OnDestroy(){
    Log.v("SERVICE","Service killed");
    player.stop();
    super.onDestroy();  
}

但遗憾的是它不起作用 - 实际上它甚至没有归结为OnDestroy()中的“服务被杀”。

我做错了什么?

4 个答案:

答案 0 :(得分:14)

首先,它是onDestroy,而不是OnDestroy。其次,您必须使用@Override注释进行编译时检查,因此您的服务代码应该看起来像这样:

@Override
public void onDestroy(){
    Log.v("SERVICE","Service killed");
    player.stop();
    super.onDestroy();  
}

答案 1 :(得分:8)

即使正确设置了onDestroy,我也遇到了类似的问题 - 这个问题的答案对于访问此页面的人来说非常有用。对我来说,在stopService期间没有立即调用onDestroy,有时会持续很长时间 - 让服务在应该停止的时候正在工作。

答案是这是预期的行为 - 我可以猜测,但不知道为什么。所以我在这种情况下的解决方案是创建一个公共静态方法来手动停止服务的操作,这在调用时发生,然后stopService()将在它自己的好时间调用onDestroy ...

在这个例子的情况下(可能已经很久了,我可能会决定让服务保持运行,直到它应用到相当的应用程序,但是提供了更改音频文件的方法,同时服务仍处于活动状态。

答案 2 :(得分:3)

首先,您需要阐明Android中有多少种类型的服务。 AFAIK,有:

  • 前台服务。
  • 后台服务。
  • 绑定服务。
  • 意图服务。

这些服务以不同方式停止。

  • 前景:只有当您通过在活动或片段中调用stopService()来启动该服务或在其自己的服务中呼叫stopSelf()时,才会停止。请注意,只有这些方法会触发服务onDestroy()
  • 背景:stopService()stopSelf()的工作方式与前景相同。此外,您应该知道此服务与调用它的活动或片段位于同一个线程中,因此如果您销毁活动或片段,此服务也将停止,但不会调用onDestroy()。它基本上摧毁了地下。因此,如果您希望捕获此服务何时停止,则需要在Manifest文件中声明服务时添加android:stopWithTask="false",如下所示:

    <application>
        //....
        <service android:name=".services.catchingStopService" 
             android:stopWithTask="false" /> 
        //....
    </application>
    

    现在在您的服务类中,您可以覆盖此方法,该方法会在此服务停止时触发:

    @Override 
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent); 
        // Your job when the service stops. 
    }
    
  • 限制:您需要通过bindService()unbindService()自己处理,您会发现它与starService()和{{1}完全相同}}

  • 意图:这种类型的服务在完成其工作时自行停止。您可以使用stopService()在服务和活动或片段之间进行通信。它与ResultReceiver类似。您可以轻松地在Google上搜索示例。

总结:根据您的目的,选择满足您的服务类型。他们都同意:

  • 不要依赖onDestroy()来了解服务何时停止,因为它 有时被称为地下;更准确地说,onDestroy调用 当stopService()或stopSelf()调用时(BoundService在 同样,我认为,但通过类似的方法,也许unBind(),我没有 测试)。
  • 使用属性android:stopWithTask =&#34; false&#34;,而不是知道何时 服务真的停止了。
  • 当设备关闭或操作系统将其杀死时,所有类型的服务都会停止 设备泄漏内存。
  • 你还应该看一下BroadcastReceiver的标志返回 能够处理服务何时停止,如重新启动服务或再次 一些东西。以下是您可以搜索的关键字:
    • onStartCommand()
    • START_STICKY
    • <action android:name="android.intent.action.BOOT_COMPLETED" />
    • <action android:name="android.intent.action.ACTION_SHUTDOWN" />

答案 3 :(得分:0)

在我的情况下,我在onDestroy中打印了一个日志而它没有打印日志,当我调用stopService时,我认为onDestroy没有调用。但是在 Android工作室中很多次都不会打印日志,所以你可以一次仔细检查或验证调试或吐司