2013-04-18 38 views
12

我有一個意向服務,下載幾千兆的視頻。我有一個「停止」按鈕,如果意外點擊「開始」或其他什麼來停止下載。我知道這已被問了幾次,但沒有爲我工作的答案。如何強制停止意向服務進行中?

我嘗試調用stopService(),不能正常工作。那只是叫IntentService.OnDestroy()。 我試着打電話給stopSelf()onDestroy,也不管用。

我試着做一個像標誌一樣的東西,但是onHandleIntent如果它已經在運行,它不會被調用,它會等到當前的工作完成並執行。而且,即使這個會工作,我就必須有像一個巨大的if語句,即吸

是我唯一的選擇真的把它改寫到正規的服務?

//回答

public class SyncService extends IntentService { 

    boolean isCanceled; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     if (intent.hasExtra("action")) { 

      // Set the canceling flag 
      isCanceled= intent.getStringExtra("action").equals("cancel"); 

     } 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     // Clean up the possible queue 
     if (intent.hasExtra ("action")) { 
      boolean cancel = intent.getStringExtra ("action"). Equals ("cancel"); 
      if (cancel) { 
       return; 
      } 
     } 

     ... 

     Get your inputStream from HttpUrlConnection or whatever 

     ... 

     while ((bytesRead = in.read(buffer)) > 0) { 
      if (isCanceled) { 
       isCanceled = false; 
       break; 
      } 

      ... 
     } 

    } 
} 

而且隨着

Intent intent = new Intent(context, SyncService.class); 
intent.putExtra("action", "cancel"); 
context.startService(intent); 
+3

你可以考慮從你的問題刪除您的解決方案,而是提供它作爲一個解決方案。 – jbaums

回答

12

你有兩個不同的問題觸發的話,我會想:

  1. 如何停止當前下載

  2. 個如何停止排隊下載,應在當前操作後執行完成

第一個是要必須「像一個標誌」,你看看你下載的數據。否則,沒有什麼會阻止你的下載操作。如果您使用的是典型的HttpUrlConnection食譜,你檢查的標誌在你的循環,你從HTTP InputStream讀寫你FileOutputStream。您可以通過致電startService()並使用特定的Intent結構來設置該標誌,將其標識爲「取消」操作。您需要在IntentService中覆蓋onStartCommand(),查看Intent,如果它取消Intent,則使用它來設置標誌,或者鏈接到任何其他類別的Intent的超類。

如果你可能有其他命令排隊(場景#2),您需要檢查頂部的onHandleIntent()該標誌以及。

+0

完全如您所說。如果我將其重寫到服務中,我是否能夠強制關閉它,或者它會與此處一樣嗎? – urSus

+0

@VlastoBennyLava:或多或少會和這裏一樣。你可能會更好地使用'stopService()'和'onDestroy()'來設置標誌,但是你必須管理你自己的後臺線程和工作隊列。 – CommonsWare

+0

我編輯了我的問題並回答了僞代碼,您可能想要查看它。謝謝 – urSus

2

鑑於您沒有發佈如何您正在處理視頻下載的準確,這可能無法正常工作(onHandleIntent內將執行下載的某種循環)。您可以使用靜態類變量保存下載的停止/啓動狀態,以便它可以通過一個Activity設置的IntentService內。然後,在onHandleIntent內部,您必須定期檢查狀態,以便知道何時取消操作。