一千萬個為什麽

搜索

服務在停止調用stopService()時停止

我在我的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);
        }
    }
);

最佳答案

為了停止你的線程,你需要在你的 onDestroy 裏面調用 Thread.interrupt()方法,但是為了做到這一點,你必須有一個來自該線程的全局引用,它在你的 onStartCommand 裏面。一旦調用了觸發器,就會拋出一個異常,並從該 catch塊中立即結束線程的生命周期。

為了更好地理解我所說的話:

public class HelloService extends Service {

    Thread ref;
    boolean isInterrupted = false;

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

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

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

    @Override
    public void onDestroy() {
        isInterrupted = true;
        ref.interrupt();
    }

}

轉載註明原文: 服務在停止調用stopService()時停止