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

Pri*_*alj 11 service android

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

活动:

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;
}
Run Code Online (Sandbox Code Playgroud)

服务:

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

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

我究竟做错了什么?

May*_*jak 14

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

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

  • 我正确使用它,但仍未调用onDestroy().:/ (6认同)
  • 另外,如果您正在使用Eclipse(我认为大多数人使用的是Android),请尝试养成使用"Source-> Override/Implement Methods"菜单命令的习惯 - 这将为函数创建一个存根为了你填写,你将不能错误的名称. (4认同)

Ngu*_*Dat 9

首先,您需要弄清Android中有多少种服务类型。AFAIK,有:

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

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

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

    <application>
        //....
        <service android:name=".services.catchingStopService" 
             android:stopWithTask="false" /> 
        //....
    </application>
    
    Run Code Online (Sandbox Code Playgroud)

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

    @Override 
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent); 
        // Your job when the service stops. 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 绑定:您需要通过bindService()和自己处理unbindService(),您会发现它starService()和和完全一样stopService()

  • 目的:此类服务在完成工作时会自行停止。您可以ResultReceiver用来在服务与活动或片段之间进行通信。类似于BroadcastReceiver。您可以轻松地在Google上搜索例如。

简介:根据您的目的,选择满足您需求的服务类型。他们都同意:

  • 不要指望onDestroy()服务何时停止,因为有时它会被称为地下服务。更准确地说,在调用stopService()或stopSelf()时调用onDestroy(我认为,BoundService的工作方式相同,但是通过类似的方法,也许是unBind(),我尚未进行测试)。
  • 请使用属性android:stopWithTask =“ false”,而不是知道服务何时真正停止。
  • 当设备关闭时,所有类型的服务都会停止;如果设备内存泄漏,则操作系统会杀死它。
  • 您还应该查看标志返回,onStartCommand()以便能够在服务停止时进行处理,例如重新启动服务或其他。以下是一些您可以搜索的关键字:
    • START_STICKY
    • <action android:name="android.intent.action.BOOT_COMPLETED" />
    • <action android:name="android.intent.action.ACTION_SHUTDOWN" />
    • <actionandroid:name="android.intent.action.QUICKBOOT_POWEROFF" />

  • 它是`stopSelf()`,而不是`stopItself()`。 (2认同)

jam*_*rez 8

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

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

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