【255期門診集錦】一起步入Android應用開發的神奇世界

  技術門診是51CTO社區品牌欄目,每週邀請一位客座專家,爲廣大技術網友解答疑問。從熱門技術到前沿知識,從技術答疑到職業規劃。每期一個主題,站在最新最熱的技術前沿爲你引航!

 本期特邀資深C、C#、Android技術專家、暢銷書作者薛小龍老師以及資深Android、塞班技術專家朱桂英老師針對Android應用開發問題給予解答,歡迎網友積極提問,與專家一起討論!

查看本期門診精彩實錄:http://doctor.51cto.com/develop-269.html

參與最新技術門診: 雲時代,讓端到端的應用暢通無阻

精選本期網友提問與專家解答,以供網友學習參考。

 

Q:

老師您好,

        問一個android方面的問題,就是在android裏面有什麼方式可以讓系統馬上釋放被finish()掉的資源嗎?比如activity

還有就是在activity之間使用Intent進行傳遞值的時候,比如說從activityAactivityB,由於activityA需要接受activityB的返回值,可以使用startActivityForResult來跳轉到activityB,然後等activityB執行完以後,在activityA中執行回調方法接受activityB返回的值,但是現在就有能有一種情況,假如說在activityB執行的時候,由於系統資源緊張,activityA被回收掉了,那當B執行完的時候,還會不會返回到activityA,如果返回到了activityA,那這個activityA是棧裏面的還是重新生成的一個,如果是重新生成的,那activityA上面的一些參數怎麼得到的或者說就是丟了的.....謝謝老師解答

A:

第一個問題是釋放資源的問題,是當前android程序員多次面對的問題。我們知道每次使用過的對象,如果現在不用了,但是別的對象還繼續持有它,那麼這個對象就是垃圾,而且回收不掉。一般一個對象持有另一個對象,如果以後程序不用了,我們應該將其設置爲null,這樣垃圾收購器就能回收掉。

你的第二個問題有很多學生問過我,很具有代表性。安卓是一個神奇的系統,他會出於回收內存的考慮關閉一個Activity。但是對於我們用戶來說,會期望當他再次回到那個Activity的時候,它仍保持着上次離開時的樣子。爲了獲取Activity被殺死前的狀態,我們應該爲Activity實現方法onSaveInstanceState()。這樣Android會在Activity有可能被銷燬之前(即onPause()調用之前)調用此方法,它會將一個以“名稱-值對”的方式記錄了Activity動態狀態的Bundle對象傳遞給該方法。這樣當Activity再次啓動時,這個Bundle會傳遞給onRestoreInstanceState(),所以它們兩個都可以恢復捕獲的狀態。

 

Q:

老師好,我01年計算機專業畢業。有穩定工作。愛好編程,業餘時間做asp.net方面的web應用開發多年。asp.net c#   sql 等相關技術 的應用和麪向對象開發的實現原理以及前端開發技術css div js jquery很熟悉。喜歡研究用戶界面ui的設計。 對uml 設計模式 等等理論也有所涉及,並在逐步學習和了解。 不斷融合實踐到我的設計中來。近幾年,隨着社會發展,我不斷感覺,未來必然是移動應用的天下,更能豐富和改變人們的生活。所以很想學習Android平臺移動應用的開發,並把它和web應用融合起來。我個人認爲java c#原理上有共通之處。但我沒有具體學習過java 所以我想知道學習android開發,對我這種情況而言,難度有多大。該如何開始,大致什麼步驟。請各位老師指點。謝謝!

A:

通過你的簡單描述,可以知道你的強項是Web開發,並且精通前端技術。其實你不必急於想從事於安卓開發的工作,想着去學習Java。其實你可以重點學習安卓的前端-本地技術,努力的掌握在安卓開發Web技術。這是當前的一大熱點,需要HTML 5css div js jquer等技術的支持,正好很適合你。

至於Java,你可以稍稍放後,編程並不是學得越多越好,而是精通最重要。

 

Q:

老師你好:

        在學校一直想做開發,可進入社會,作爲一名網絡管理人員已經3年了,能搭建Linux一些服務,C有些皮毛,玩過一段時間的51單片機(僅能做些數碼管等類的小實驗),如果我這種情況轉開發有必要嗎?如果轉開發,是首選Android還是應用或是網站,以哪種語言爲切入點,又如何找相關的開發工作。我想這一系列的問題,可能代表了很多人的心聲吧。

A:

這得看你的基礎,從你的描述看,掌握一些Linux、單片機、C的知識,但是從你的描述看,都只是皮毛。要想轉型做開發,你所提出的兩條路:

1android:如果做應用方面,需要先學習Java,然後學習android的知識;如果做底層開發,需要學習LinuxC等方面的知識。整個學習過程有一點漫長,需要付出較多的汗水,但是就業前景好。

2)網站開發:這方面相對來說上手較容易,ASP.NETPHPJava Web都可以選擇,並且前兩者只需幾個月的時間便可有成就。這方面的工作社會需求大,同樣競爭也激烈。

 

Q:

剛剛提了個定製的問題,現在還有一個問題就是本地appweb app的應用如何更好地結合?web app我看網絡上有很多都是用一些js的移動開發框架,看着那麼多的框架,選擇起來感覺有點兒費事。html5的推出,會不會更好地的定製我們所需要的功能。如何更好更加快速的進入web app的開發當中呢?

A:

本地app的優勢是強大設備的處理能力,這樣開發出功能更加強大的應用。web app的優勢是一個巨大的平臺,有着無與倫比的普及性。由此可見,要想實現兩者的更好結合,就需要通過一箇中間媒介來將兩者串聯起來,這樣可以做到在本地實現和外界的接軌,在web端調用本地的強大功能。在這一方面,js是最佳選擇。正是因爲這樣,所以現實中存在了很多js的移動開發框架,這說明這些框架把握住了現實需求。

HTML 的推出,確實在web端更加強大了,至於能否強大到可以捨棄本地端 ,我想是不大可能。建議你當前的任務的是,多瞭解HTML 5的新功能,並利用HTML 5開發出更加強大的功能。並學習知名的js移動框架,做到熟練運用,這樣即可在web app中做到遊刃有餘。

 

Q:

專家您好,我從事J2EE開發3年了。近期想轉Android開發自己的工具類應用(SNS),我有幾個困惑:我需要從哪兒入手快速開始?怎樣應對Andriod頻繁的版本升級?有什麼好的參考書推薦(編碼驅動的)?謝謝!

A:

你好,因爲你已經有相關開發經驗了。所以建議你掌握基本的Android知識後,先從源碼分析開始,瞭解每一個Android控件是怎麼樣實現的。其實每一個控件就是一個谷歌程序員們編寫的類,分析高手們的源碼對你的SNS有很大的高出。

版本升級你無需考慮太多,谷歌的每一次大的升級,都是針對一整個框架而言的。而除了這些變化的框架之外,其他的細節沒有什麼變化。從目前情況來看,谷歌定期一年有一個相對比較大的變動,沒有剛發佈時那麼頻繁了。

編碼驅動的書籍相對來說比較少,建議參閱電子工業出版社的新書《Android底層開發技術實戰詳解:內核、移植和驅動 》,希望會對你有所幫助。

 

Q:

老師您好,再次麻煩您了。以前,不知道通過USB 數據線怎麼實現android手機和電腦之間互相讀取數據傳輸文件的?以前查資料說是通過USB HOST編程實現的,是什麼串口編程,在android3.0版本以後,手機上以及支持android主從機模式,也查了一些資料,研究了一個多星期,沒有結果。不知道您能不能解釋一下,是什麼原理或者單純的數據線連接電腦時,怎麼實現讀取到手機數據的?

還有一個問題,我想做一個網站的客戶端的話,該怎麼做?就比如51CTO的博文,我就只是想把博文這一個版塊在自己的客戶端顯示出來,大概是要用到JSON解析網頁,然後自己封裝展示,請問一下,怎麼解析?要每一篇都解析嗎?思路不太清晰,請老師指點一下。

A:

Android支通過兩種模式來支持Android USB外設 (實現了Android 外設協議的硬件):
(1)USB 外設模式:外部USB 硬件(裝有Android的設備要連接的外部設備)充當USB 主機,例如機器人、擴展插座、診斷和音樂設備、電子報亭、讀卡器等。

(2)USB主機模式:裝有Android 的設備扮演着主機的角色,例如數碼像機,鍵盤,鼠標和遊戲手柄。
USB驅動連接的知識你可以閱讀AndroidUSB驅動程序源碼,源碼路徑是/kernel/drivers/usb/gadget/,在這目錄下,保存了USB驅動文件的實現C文件。Android USB驅動是實現過程是連接並讀取複合設備、cdrom/u盤設備、網絡設備和adb驅動的過程,在gadget目錄下的文件很好的說明了這一點。

 

Q:

老師,您好,我是一名在校的學生,接觸android也大概有一年時間了,但是總感覺對android的掌握程度還很小,一直在做android應用開發,也都是一些比較小的應用,想在做應用的基礎上,試試往android的底層和網絡方面延伸呢,我是一個對學習尤其是沒接觸過的東西很有興趣的人,在此想問問老師能不能給點意見;還有就是,當學完java課程的時候,我還是想再自己看看相關的知識點呢,畢竟在android的開發中,java語言還是比較重要的,也希望兩位老師在jav深入學習這方面能夠給我一些寶貴意見或者建議,學生感激不盡。謝謝兩位老師!

A:

首先肯定你喜歡鑽研的品格,值得鼓勵。android應用開發比較容易上手,既然你已經有一定基礎了,建議你繼續深入下去,做到學一門,精通一門。在此基礎上,可以進一步向網絡方面發展。Java對於android非常重要,建議你繼續瞭解一些虛擬機、多線程和Socket等方面的知識,因爲這些知識對於android來說非常重要。

底層和應用是兩個獨立的領域,需要具備linuxC等方面的知識。畢竟我們的精力是有限的,建議底層作爲的第二目標,等經過android應用知識後再掌握這方面的知識也不遲啊。

 

Q:

老師您好,

有機會向您請教真是榮幸,我知道有很多庫可以實現即時通信,但是對於原理方面瞭解不多,也不曾深入瞭解過,想趁這個機會問一下。兩個局域網通過互聯網相互通信,靠的是tcp/ip但是,

1、兩臺終端是怎樣通過socket進行綁定的呢?

2、我知道局域網和互聯網通信可能用到nat,難道這些協議也是通過nat找端口?是怎麼實現的?在有就是服務器在這個時候是起的什麼樣的作用呢?

3、一臺終端能夠即時的獲得消息,是從另一臺終端獲得的消息嗎?還是通過服務器轉發?這臺終端是否一直佔用着socket一個端口?難道是一直在輪詢?

因爲對這一塊很感興趣,請不吝賜教

A:

第一個問題就不回答了,因爲十分簡單,只是一個使用socket實現連接、交互和關閉這三個階段的過程。

第二個問題:NAT只是一箇中間媒介,起一個翻譯的作用,翻譯的對象是外部因特網網的地址,因爲在使用時已經有了外部地址,所以不需要查找端口操作。如果爲了追求系統的可擴展性和穩定性,則需要添加找端口機制,但是此時最好對應添加服務器代理,因爲這樣做的效率會更高。由此可見,這個時候服務器的作用就是處理翻譯尋址工作,做一些存儲工作。

第三個問題:當然可以從另一臺終端獲得的消息,但是這樣會佔用更多資源,所以最合理做法是服務器轉發。在一個端口只能用一種方式,例如只能用輪詢。一隻佔用是不好的做法,現在硬件設備都支持輪詢,因爲這樣會更加節約資源,甚至andoridios等移動設備都支持輪詢。當然也會有人反駁說:移動設備的資源有限,所以才選擇用輪詢。如果硬要這麼反駁,那麼在追求效率和利用率的今天,這些工作就沒有意義了!


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章