2014-01-21 102 views
0

我從AlarmManager onReceive調用服務,下面是實現。我想知道這個喚醒鎖的執行是否正常,它是否足以滿足我的需求?在服務上實現喚醒鎖

這是我的服務類在onStart功能:

@Override 
public void onStart(Intent intent, int startId) { 
    WakeLock wakeLock = null; 
    try{ 
     PowerManager mgr = (PowerManager)getApplicationContext() 
      .getSystemService(Context.POWER_SERVICE); 
     wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
     wakeLock.acquire(); 
     //For time consuming an long tasks you can launch a new thread here 
     Toast.makeText(this, " Service Started", Toast.LENGTH_LONG).show(); 
    }catch(Exception e){ 
    }finally{ 
     wakeLock.release(); 
    } 
} 
+0

你真的嘗試過嗎?如果是這樣,它工作嗎?你還沒有解釋過你的服務是如何工作的,或者你的「需求」是什麼,或者你的「需求」是什麼。另外'onStart(...)'在API 5中已被棄用 - 您應該使用'onStartCommand(...)'。 – Squonk

+0

是的,我已經嘗試過了,這就是爲什麼我在這裏發佈它以知道我是否缺少了一些東西,這在正常情況下工作,但發佈的主要原因是要知道它在「正常」情況以外的情況下的執行情況。 – User3

+0

請參閱您指出的棄用:)我已將代碼隔離到第二個項目中,以檢查功能,現在該服務僅顯示一個Toast消息,但在實際的程序中它將被執行以執行一些巨大的數據庫操作,打算在後臺線程中做,也在這種情況下,我想知道我是否可以使用異步任務並取消postExecute中的wakelock? – User3

回答

0

是的,這應該工作正常。雖然如果你啓動一個新的線程,它將無法工作,在這種情況下,wakelock.release()將在線程完成之前調用。

你可能要檢查CommonsWare的Wakeful service雖然。該服務爲您處理喚醒鎖,確保您在服務期間擁有喚醒鎖,並在您停止服務後立即釋放它。

+0

感謝您的洞察力隊友的具體例外:)我可以實現異步任務,只是取消onPostExecute喚醒鎖? – User3

+1

@ user2822178:是去[WakefulIntentService(https://github.com/commonsguy/cwac-wakeful) - 不要重新發明輪子 - 而且有各種細微的問題:http://stackoverflow.com/questions/20074035/wakefulintentservice-implementation-clarifications –

+0

謝謝,這是一篇富有洞察力的文章! – User3