今天周六本來想好好一覺,一想到還有文章要更就只能隨便披件大襖子不懼寒冷繼續創作一篇咯。儘管閱讀量不是很高但是看到有幾位同學收藏分享了,也算是對得起自己「不辭勞苦」地付出了吧,哈哈。
前面幾個章節我們把JobInfo中的幾個約束條件都講完了,其實JobScheduler模塊還有一個難點或者說讓不少安卓程式設計師直接頭暈轉向的一點,那就JobService的兩個返回值。
在安卓開發過程中,經常會冒出幾個令為難以捉摸的返回值。趁著這個機會安卓說來考你一下,View#OnTouchEvent方法中什麼時候應該返回true,返回false又有什麼影響?Activity#onCreateOpionsMenu的返回值與menu的顯示有什麼關係?
也許開發一兩年的朋友們能夠很快地回答出來,但是剛接觸安卓的初學者估計得犯過幾次錯誤才能知曉其中複雜的邏輯關係。記得前段時間有個同事就因為不知道Touch事件的傳遞機制加班搞到晚上11點多才修復了BUG,所以說作為一個安卓開發者在開發過程中千萬別對返回值掉以輕心。
做了這麼多鋪墊,終於可以轉到今天要討論的主題上面了。今天我們要探討的正是JobService中的返回值,如果對JobService沒有概念的話可以先看看前面幾個章節的內容。其實使用JobService與普通Service沒什麼不同,只是有兩返回值需要加以留心。
第一個就是onStartJob中的返回值,在開發過程中有同事反映為什麼自己的約束滿足了代碼也執行到了onStartJob裡,為什麼約束條件不滿足時不執行onStopJob方法呢?比方說一個僅添加了充電約束(setRequiresCharging)的任務已經被JobScheduler入隊後進入就緒狀態後,如果此時設備確實是充電狀態的話那就直接執行了。
按照OnStopJob的說明如果約束條件不再滿足就會調用此方法,於是不少安卓開發者就拔掉了充電線想看看此方法會不會執行,令他感到遺憾的是OnStopJob方法並沒有執行,原來onStartJob返回了false。
這位粗心的同學肯定沒有仔細看官網解釋,在onStartJob方法注釋中明確寫到了如果這個方法返回false的話表示這個任務已經結束了,並且關於這個job的wakelock已經被釋放掉,在這種情況下onStopJob是不會執行的,就別再重複插拔數據線啦。
那麼有同學反映如果在返回false的情況下,在onStartJob方法中執行jobFinished會調用onStopJob嗎?很顯然也不會,至於原因在下一章節源碼分析中會講到。
好了,講完onStartJob我們再來看下與之對應的onStopJob方法。首先我們看下這個方法什麼時候會被調用,從注釋來看,如果系統認為這個任務沒機會執行就會調用onStopJob。但是,重要的事情說三遍,一個大前提就是JobFinished方法沒有被調用。換句話說如果已經調用了JobFinished,那麼onStopJob也不會再調用。
經安卓說測試可知,在JobFinished調用之前調用JobScheduler的cancel方法就可以回調onStopJob方法。
最後我們再來講下onStopJob的返回值,從官網上來講返回為true表示把任務重新調度執行,那麼是如何調用執行的呢?以及調度的原理是什麼,我們在後面章節會陸續講到。
好了,本節就到此為止吧,那麼關於JobService中的兩個返回值,安卓程式設計師們現在還頭暈轉向嗎?