stopService()不会进入onDestroy()

时间:2017-04-04 01:37:08

标签: android service

以下是与我的问题相关的代码 //活性

Button startButton = (Button) findViewById(R.id.startService);
startButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(UnbindService.this,StartService.class);
        startService(intent);
    }
});

Button endButton = (Button) findViewById(R.id.stopService);
endButton.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(UnbindService.this,StartService.class);
        stopService(intent);
        System.out.println("312");
    }
});

//服务

@Override
public void onDestroy(){

    Log.d("DEBUGSERVICE", "Stop Button pressed");
    timer.cancel();
    timer.purge();

    System.out.println("in on destroy");
    handler.removeMessages(0);
    Toast.makeText(this,"end server", Toast.LENGTH_SHORT).show();
    super.onDestroy();
}

我尝试用一​​些println()进行调试,发现当我点击stopService按钮时,它没有进入onDestroy函数。谁知道那里发生了什么?

3 个答案:

答案 0 :(得分:0)

根据您对Phan Van Linh's回答的评论,我开始了解您的计时器一直在继续播放消息。

我已经测试了您的代码,但没有发现任何错误。

声明一个全局boolean变量,该变量将保存服务是否正在运行。在destroy内设置值false。并在烘烤之前检查布尔value

答案 1 :(得分:0)

@Override
 public void onDestroy(){
 super.onDestroy();
Log.d("DEBUGSERVICE", "Stop Button pressed");
timer.cancel();
timer.purge();

System.out.println("in on destroy");
handler.removeMessages(0);
Toast.makeText(this,"end server", Toast.LENGTH_SHORT).show();

 }

试试这个。

这是一份文档。

调用服务的onDestroy()方法并有效终止服务。从onDestroy()返回时,应完成所有清理(停止线程,取消注册接收器)。

答案 2 :(得分:0)

我对此的两点看法:

  1. 在计时器的文档here中,调用Timer#cancel只会丢弃计划任务。取消方法不会干扰当前正在执行的任务(如果存在)。 话虽如此,在你的Timer任务中坚持引用你的服务可以防止它被破坏。

  2. 根据Android Service docs

  3.   

    如果服务当前正在其onCreate(),onStartCommand()或onDestroy()方法中执行代码,那么托管进程将是一个前台进程,以确保此代码可以执行而不会被杀死。

    因此,您可以在上述方法中执行长时间运行的代码(在服务开始时)延迟onDestroy被调用(尽管最终在 意图时调用它传递给stopService(<intent>) 最终传递完毕。)