以下是与我的问题相关的代码 //活性
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函数。谁知道那里发生了什么?
答案 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)
我对此的两点看法:
在计时器的文档here中,调用Timer#cancel
只会丢弃计划任务。取消方法不会干扰当前正在执行的任务(如果存在)。
话虽如此,在你的Timer任务中坚持引用你的服务可以防止它被破坏。
如果服务当前正在其onCreate(),onStartCommand()或onDestroy()方法中执行代码,那么托管进程将是一个前台进程,以确保此代码可以执行而不会被杀死。
因此,您可以在上述方法中执行长时间运行的代码(在服务开始时)延迟onDestroy
被调用(尽管最终在 意图时调用它传递给stopService(<intent>)
的 最终传递完毕。)