调用stopService()时服务不会停止

时间:2016-05-13 01:08:41

标签: android

我在Android应用程序中创建了一个Service,它运行正常。但是当我点击stopButton时,我想阻止它(完全被杀)。为此,我编写了此代码,但是当我单击stopButton时,此代码不会停止服务。所以请帮忙。

服务

public class HelloService extends Service {

    static boolean isRunning  = false;

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

    @Override
    public void onCreate() {
        super.onCreate();
        isRunning = true;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    try{Thread.sleep(3000);}catch(Exception e){}
                    Log.e("Update", i + "", new Exception());
                }
            }
        }).start();
        return Service.START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        isRunning = false;
        stopSelf();
    }

}

MainActivity

Button startButton = (Button)findViewById(R.id.start);
startButton.setOnClickListener(this);
startButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent startServiceIntent = new Intent(MainActivity.this, HelloService.class);
            startService(startServiceIntent);
        }
    }
);


Button stopButton = (Button)findViewById(R.id.stop);
stopButton.setOnClickListener(this);
stopButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent stopServiceIntent = new Intent(MainActivity.this, HelloService.class);
            stopService(stopServiceIntent);
        }
    }
);

2 个答案:

答案 0 :(得分:0)

我认为你误解了线程和服务。

new Thread(new Runnable() {}).start();之后,Runnable中的内容正在另一个线程中运行,因此如果调用者停止,它将不会停止。

如果您需要内部服务计时器,请创建默认处理程序而不是新线程。

答案 1 :(得分:0)

为了停止你的线程,你需要调用Thread.interrupt()里面的onDestroy方法,但要做到这一点,你必须有一个来自该线程的全局引用,因为它位于你的{{ 1}}。在调用iterrupt后,将抛出异常,并且从onStartCommand我们将立即终止Thread的生命周期。

为了更好地理解我的意思:

catch block