2014-03-03 123 views
3

令人驚訝的是,互聯網上沒有人需要創建低優先級的Android服務,但我確實需要。該服務可能偶爾需要做一些密集的CPU或數據庫工作,所以我希望它具有儘可能低的優先級。如果它有什麼區別,我需要該服務從數據庫中一次讀取條目(可能有幾千條),然後遍歷列表並添加和減去一些值。這是非常重要的,這會創造儘可能最低的CPU負載,我不在乎它是在1秒或10秒內完成的。創建低優先級的Android服務

Android開發文檔提供一個例子是這樣的:

@Override 
    public void onCreate() { 
    // Start up the thread running the service. Note that we create a 
    // separate thread because the service normally runs in the process's 
    // main thread, which we don't want to block. We also make it 
    // background priority so CPU-intensive work will not disrupt our UI. 
    HandlerThread thread = new HandlerThread("ServiceStartArguments", 
      Process.THREAD_PRIORITY_BACKGROUND); 
    thread.start(); 

    // Get the HandlerThread's Looper and use it for our Handler 
    mServiceLooper = thread.getLooper(); 
    mServiceHandler = new ServiceHandler(mServiceLooper); 
    } 

完整的示例(http://developer.android.com/guide/components/services.html)涉及一個服務處理器和一個打環器,其未在此實施例中說明。這些都是必要的,使服務低優先級或是這只是開發文檔複雜的事情,還有另一種方法來確保服務是低優先級?

回答

3

對於您的用例來說,重要的是在您使用Process.THREAD_PRIORITY_BACKGROUND創建的線程中處理信息。您也可以在您調用Thread.setPriority的另一個線程中處理事情。 (請參閱the docs on Thread

將命令發送到另一個線程的android慣例使用的是HandlerLooper,但您不需要使用它們來確保低優先級。 Handler爲您提供了一種將消息發送到要一次處理的線程的約定。它還給出了發佈項目的約定,以便在某些延遲後運行或在一段時間後運行。處理程序與一個Looper相關聯,它負責分派消息給處理程序。

+0

但是我應該在哪裏做這項工作? http://developer.android.com/guide/components/services.html#ExtendingService中的示例有一個handleMessage()方法,但是有哪些消息?該服務沒有收到任何東西,它已經啓動,它已經知道該怎麼做。在那個例子中,我應該把所有讀取和添加數據庫中的東西的代碼放在哪裏? – TimSim

+1

替換handleMessage中它正在與您想要做的工作睡覺的部分。任何時候一個活動調用啓動服務,處理程序將被觸發。特別是這行'mServiceHandler.sendMessage(msg);'正在發送一條消息給處理程序處理。 –

+0

太棒了,這很合理,謝謝。 – TimSim

3

我嘗試了很多不同的方法,但是這段代碼幫助我完成了相同的過程。

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); 
+0

這一套是爲後臺服務設置的。有用! – Harpreet