如何停止后台服务?

How to stop a background service?

我正在开始 Android 开发,现在正在学习服务。
我创建了一个简单的服务来连续烤一个字符串。
我拿了两个按钮来启动和停止服务。
当我点击启动按钮时,服务启动并持续烘烤字符串。
但是当我去点击停止按钮停止服务时,它并没有停止。
它会继续不断地烘烤字符串。

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();

        doToast();

        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
    }


    public void doToast()
    {
        final Handler handler= new Handler();
        handler.postDelayed(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                Toast.makeText(MyService.this, "hi", 0).show();
                handler.postDelayed(this, 3000);
            }

        }, 3000);

    }

}

这是启动和停止服务的代码

startservice.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        startService(new Intent(getBaseContext(), MyService.class));
    }
});

stopservice.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        stopService(new Intent(getBaseContext(), MyService.class));
    }
});

正如 MD 所提到的,即使您正在停止服务,您也必须删除回调,因为可运行对象仍在消息队列中,等待再次 post 本身。即:

public class AwesomeService extends Service {
// other stuff
  private int DELAY = 2000;
  Handler mHandler = new Handler();
  Runnable toastRunnable;
  public void doToast() {
    mHandler.postDelayed(getToastRunnable(), DELAY);
  }
  private Runnable getToastRunnable() {
    Runnable r = new Runnable() { 
      @Override public void run() {
        // show toast
        // doToast()
      }
    };
    toastRunnable = r;
    return r;
  }
...
  // and to remove the callbacks,
  @Override public void onDestroy() {
    super.onDestroy();
    mHandler.removeCallbacks(toastRunnable);
  }
}