安卓開發:JobService中的兩個返回值,讓多少安卓程式設計師頭暈轉向

2020-12-17 AI互聯社

今天周六本來想好好一覺,一想到還有文章要更就只能隨便披件大襖子不懼寒冷繼續創作一篇咯。儘管閱讀量不是很高但是看到有幾位同學收藏分享了,也算是對得起自己「不辭勞苦」地付出了吧,哈哈。

前面幾個章節我們把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中的兩個返回值,安卓程式設計師們現在還頭暈轉向嗎?

相關焦點

  • 零基礎學安卓開發的3個步驟、N本好書
    ——好了,這只是每個中二少年都有過的熱血理想……(比如我Step 1:Java 入門從語言上說,Android應用開發基於的是Java語言,其實NDK開發中也涉及到了C語言。不過少年,你還是先學會走再開始跑吧。
  • 安卓開發:談談JobInfo中的設備空閒約束以及探討如何測試此方法
    今天早上特地來公司早了一個小時,趕緊把昨天沒說完的關於JobInfo中的幾個約束條件結束掉,儘管時間緊張閱讀量也不怎麼可觀,但是還是不能斷是吧,萬一真的有哪位同學就等著講完約束條件呢?況且才更新了幾天安卓技術類文章自己都養成習慣了。
  • 虛擬機為安卓流暢度背鍋,是因為關係數十萬程式設計師飯碗?
    導讀:虛擬機相當於應用程式在不同運行環境中的翻譯。虛擬機表示:為安卓流暢度背這口鍋,也是為了廣大程式設計師的飯碗著想!解開這個梗,先要搞懂什麼是虛擬機,以及虛擬機有什麼用。簡單說,虛擬機是一種消除計算機硬體差異的機制,它可以提供一種穩定的運行環境,讓相同的應用程式在不同的作業系統和硬體上運行。
  • 安卓Q新手勢操作曝光,返回鍵即將消失
    10開發版本系統深入發掘,發現谷歌已經在測試新版的手勢操作功能,在多任務鍵被取代後返回鍵也將成為歷史,所有操作都被集中在底部的藥丸型主頁鍵上。一直以來安卓都是擁有菜單(多任務)、主頁、返回三大按鍵,即使是改用虛擬按鍵之後也是如此,不過隨著全面屏逐漸普及,安卓也開始引入更合適的手勢操作。在安卓P中,多任務鍵的功能開始被手勢操作取代,只剩下返回鍵和被稱作「藥丸」的新版主頁鍵。
  • 安卓開發面試:onRestart何時被調用?這樣回答更能讓面試官滿意
    相信對於一年經驗以上的安卓開發者來說,Activity的生命周期應該耳熟能詳了,從onCreate到onDetroy的完整生命周期方法調用鏈,也是安卓初學者面試時的必考題。當用戶按返回鍵從B回到A時,也會調用startActivity方法,在此方法的最後階段會調用TransactionExecutor的performLifecycleSequence方法,這個方法有兩個參數,一個是被啟動的Activity(A),另一個就是用數組表示的A的生命周期調用隊列。
  • 言C語言陷阱與技巧第21節,函數只能返回一個值嗎?有多個返回值怎麼...
    如今幾乎找不到只專注於一門程式語言的程式設計師了。大多數程式設計師在自己平時的工作和生活中,一般都使用不止一門程式語言,例如小編在工作中主要使用的是C語言,但是有時候驗證算法也會使用 matlab 和 python,在業餘做別的項目時還會用到 C#。
  • 騰訊IOT安卓開發初探
    目錄騰訊IOT 安卓開發初探 Tecent IOT 開發平臺的使用 新建項目創建產品添加自定義功能設備開發微信小程序配置 面板配置新建設備使用設備安卓開發 前置配置 data.jsonapp-config.json權限配置連接平臺代碼安卓頁面配置Activity代碼微信小程序使用總結 參考騰訊IOT
  • 夜神安卓模擬器:安卓環境開發、測試三步搞定
    眾所周知,在遊戲開發者進行遊戲開發之前,需要先搭建相應的安卓環境,但是目前在Windows上搭建Android開發環境,需要反反覆覆的不斷設置,比如,在百度經驗搜索安卓環境搭建,出現了相應的搭建教程,但是卻顯示有八個步驟,繁瑣和複雜程度不言而喻。
  • 學習安卓開發[2]-在Activity中託管Fragment
    在上一篇學習安卓開發[1]-程序結構、Activity生命周期及頁面通信中,學習了Activity的一些基礎應用,基於這些知識,可以構建一些簡單的APP了,但這還遠遠不夠,本節會學習如何使用Activity託管Fragment的方式來進行開發
  • 安卓系統是哪個國家開發的 手機安卓系統屬於哪個國家?
    安卓系統是哪個國家開發的 手機安卓系統屬於哪個國家? 並且現在這個系統是沒有中文的,只不過方便國人記憶,憑藉音譯過來就變成了安卓。 但是Android 並不是一開始就屬於GOOGEL的,也是他們收購了Andy Rubin開發的這個軟體,從而加工更新得來。 得到了ANDROID系統之後的谷歌開始了他們的一系列動作,先是大肆尋找加盟商與手機科技的人才,共同運營,匯集了眾多才子的安卓這時候已經基本成型了。
  • 安卓開發學習的路線
    Android應用程式開發是以Java語言為基礎的,所以沒有紮實的Java基礎知識,只是機械的照抄別人的代碼,是沒有任何意義的。下面給各位介紹一下安卓開發學習的路線。很多朋友一上手就開始學習Android,似乎太著急了一些。Android應用程式開發是以Java語言為基礎的,所以沒有紮實的Java基礎知識,只是機械的照抄別人的代碼,是沒有任何意義的。
  • 谷歌禁止中國使用安卓系統?
    安卓系統是開源的,是全球程式設計師的共同勞動成果,為什麼總有人認為谷歌可以禁用安卓?安卓是基於Linux系統開發的,而Linux是一款免費的作業系統(有GNU GPL授權證約束,要求免費),任何人可以免費獲得,並參與修改,從這個角度說Linux是全球程式設計師的共同勞動成果。當然這麼說安卓有點不對。安卓的系統架構有四層,分別為應用程式層、應用程式框架層、系統運行庫層和Linux內核層。從這裡可以看出,安卓是以Linux為地基搞出的新作業系統,有Linux的基因,但已經不是Linux。
  • 向返回鍵說拜拜,安卓10向全面屏手勢繼續邁進
    蘋果手機在iPhone X上已經實現了全手勢操作,經典Home鍵已被剔除,而原生安卓系統則在去年的Pie上正式加入手勢操作。在原生的安卓9系統中,點擊導航欄的小「藥丸」就可以返回桌面,長按會啟動谷歌助理,左右滑動能夠切換最近打開的程序,上拉則能夠呼出程序抽屜,在易用性方面還是做得不錯。除此之外,「藥丸」鍵左邊還有一個返回按鍵。
  • 安卓應用開發頂級框架大盤點,總有一款適合你
    原生開發工具包原生開發工具包,或者叫NDK,被認為是最好的安卓框架之一。它使得開發人員可以使用C和C++來為安卓設備編寫代碼。它很少用於整個項目。開發人員在必須處理應用程式中的性能問題時經常使用它。由於NDK旨在優化應用程式的性能,因此它附帶了很多用C和C++編寫的代碼庫。開發人員可以在構建新應用程式時使用這些功能。
  • Android年度總結 | 安卓巴士:砥礪前行 一心一意為開發者服務
    安卓巴士,中國最大的安卓程式設計師社區。各位安卓開發者,你們好。我是羊駝小編,是2017年年初剛剛加入安卓巴士大家庭一名工作人員。歡迎大家來安卓巴士官網觀光~年終了,按理說當然要出一篇高大上的年終總結。而是想對所有的程式設計師GG說幾句真心話,對所有對安卓巴士社區做出貢獻的博主們、版主們、合作夥伴們表達一些感謝。
  • 真安卓?華為鴻蒙系統驚現安卓ADB模式
    據發布會上介紹,鴻蒙首款落地產品是榮耀智慧屏,不過這兩天有人發現智慧屏的鴻蒙OS中出現了ABD調試授權模式,因此網上出現了許多質疑鴻蒙OS的文章。對此,有不少媒體質疑華為在走的是阿里雲OS的套路,本質上就是基於安卓系統開發的第三方OS,類似與小米MIUI。
  • 用了這麼對年安卓手機,卻還是不清楚安卓系統發展史?
    近幾年來,安卓系統市場佔有率穩定在60-70%,從誕生到擊敗Windows Phone(微軟)、Symbian(諾基亞)、BlackBerry OS(黑莓),安卓只用了非常短的時間。Android這個詞最先出現在法國作家維裡耶德利爾·亞當在1886年發表的科幻小說《未來夏娃》中,作者把外表像人類的機器起名為「安德羅丁」(android)。
  • 負面不斷的facebook,這回連安卓用戶的數據也盯上了?
    然而這種情況只發生在使用安卓設備的用戶身上,並且只有在獲得某些數據批准後才會發生。例如:幾年前我就開始轉用安卓系列的手機,但在我自己的Facebook數據下載中沒有相關的通話記錄。上周紐西蘭的程式設計師Dylan McKay在推特上發布了Facebook上收集的通話數據截圖,結果該截屏被瘋狂地轉發。
  • C++程式設計師轉向Java開發領域是否難度較大
    C++程式設計師轉向Java開發領域還是相對比較容易的,一方面C++語言與Java語言都同屬於面向對象程式語言,所以在編程思想上還是比較統一的,都是基於封裝、繼承和多態來組織代碼,另一方面Java語言在代碼編寫方式上與C++語言也有很多類似的地方,Java語言和C++語言也都可以歸為C語言體系。
  • 華為鴻蒙系統驚現ADB模式 兼容安卓還是抄襲安卓?
    對於鴻蒙系統,很多人最期待的是鴻蒙用於華為的手機,但是華為官方並不打算很快在智慧型手機上應用,目前還可以用安卓的情況下就使用安卓,只不過這個問題上繞不開的一個問題就是鴻蒙應不應該跟安卓兼容或者說怎麼跟安卓兼容才是最好的,不能被人當做一個安卓的改版,但同時還得支持安卓的生態系統,這才是最難的。