2016-05-13 65 views
1

我已經創建了我的Android應用程序中的Service這是工作的罰款。但是當我點擊stopButton時,我想阻止它(完全死亡)。爲此,我編寫了此代碼,但是當單擊stopButton時,此代碼不會停止該服務。所以請幫助。服務不停止在調用stopService()

服務

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); 
     } 
    } 
); 
+1

我的理解是,你需要中斷/殺/停止該線程自己 –

+0

您的代碼看起來不錯,你是如何驗證該服務沒有停止? – jimmy0251

+0

'onStartCommand()'中的循環在調用'stopService()'時不會停止。 @ jimmy0251 –

回答

0

我想你誤會線程和服務。

new Thread(new Runnable() {}).start();後,了Runnable裏面的東西在另一個線程中運行,因此它不會停止,如果主叫方停止。

如果你需要一個內部服務計時器,創建一個默認的處理程序,而不是新的線程。

0

爲了停止線程,您需要在onDestroy中調用Thread.interrupt()方法,但要做到這一點,您必須從該線程獲取全局引用,因爲它位於onStartCommand的內部。一旦調用破解器,就會拋出一個異常,並且從那個catch block我們將立即結束您的線程的生命週期。

爲了更好地理解我說的話:

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(); 
    } 

}