2014-05-23 92 views
1

我有一項服務,我從我的活動開始。 現在,serivce通過從onStartCommand()啓動一個新線程來執行一些任務() 我想在線程完成其作業後停止服務。如何在服務完成後停止服務?

我試圖用一個處理器這樣

public class MainService extends Service{ 

    private Timer myTimer; 
    private MyHandler mHandler; 


    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mHandler = new MyHandler(); 
     myTimer = new Timer(); 
     myTimer.schedule(new MyTask(), 120000); 
     return 0; 
    } 

    private class MyTask extends TimerTask{ 

     @Override 
     public void run() { 
      Intent intent = new Intent(MainService.this, MainActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intent); 
      mHandler.sendEmptyMessage(0); 
     } 

    } 

    private static class MyHandler extends Handler{ 
     @Override 
     public void handleMessage(Message msg) {    
      super.handleMessage(msg); 
      Log.e("", "INSIDE handleMEssage"); 
      //stopSelf(); 
     } 
    } 

首先,它是給我一個警告,如果處理類也不是一成不變的,將導致泄漏 後我做了靜態,stopSelf()不能被稱爲,因爲它非靜態的。

我的方法是正確的還是有一個更簡單的方法?

+0

您應該使用IntentService而不是服務。它在單獨的線程中自動啓動,並在任務完成時自行停止。 –

回答

3

您應該使用IntentService而不是服務。它在單獨的線程中自動啓動,並在任務完成時自行停止。

public class MyService extends IntentService { 

    public MyService(String name) { 
     super(""); 
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 

     // write your task here no need to create separate thread. And no need to stop. 

    } 

} 
+0

嘿你試過嗎? –

+0

如果你想驗證服務是否自動銷燬,只需重寫onDestory()sysout的東西,並看到日誌 –

+0

很高興知道這一點。 –

1

試試這個,

private static class MyHandler extends Handler{ 
     @Override 
     public void handleMessage(Message msg) {    
      super.handleMessage(msg); 
      Log.e("", "INSIDE handleMEssage"); 
      MainService.this.stopSelf();; 
     } 
    } 
+0

這是停止服務的標準方式嗎? – Ankit

+0

這可能不是標準方式,但肯定會工作 –

+0

這不起作用,因爲你不能在靜態環境中使用'this'。 '沒有可以在範圍內訪問類型MessengerService的封閉實例' –

2

使用IntentService對於處理需求的異步請求(表示爲意圖)服務的基類。客戶通過startService(Intent)呼叫發送請求;該服務根據需要啓動,使用工作線程輪流處理每個Intent,並在其停止工作時自行停止。

+0

所以你的意思是在意向服務的情況下根本不需要stopSelf()? – Ankit

+1

是不需要用IntentService停止服務。 –