1、 Android的四大組件是哪些,它們的作用? Activity:Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的一種,它需要為保持各界面的狀態,做很多持久化的事情,妥善管理生命周期以及一些跳轉邏輯 service:后臺服務于Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事物,定義好需要接受的Intent提供同步和異步的接口 Content PRovider:是Android提供的第三方應用數據的訪問方案,可以派生Content Provider類,對外提供數據,可以像數據庫一樣進行選擇排序,屏蔽內部數據的存儲細節,向外提供統一的借口模型,大大簡化上層應用,對數據的整合提供了更方便的途徑 BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型 2、 請介紹下Android中常用的五種布局。 FrameLayout(框架布局)LinearLayout (線性布局)RelativeLayout(相對布局)AbsoluteLayout(絕對布局)TableLayout(表格布局)。 一、FrameLayout:所有東西依次都放在左上角,會重疊,這個布局比較簡單,也只能放一點比較簡單的東西。 二、LinearLayout:線性布局,每一個LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。當垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。 三、AbsoluteLayout:絕對布局用X,Y坐標來指定元素的位置,這種布局方式也比較簡單,但是在屏幕旋轉時,往往會出問題,而且多個元素的時候,計算比較麻煩。 四、RelativeLayout:相對布局可以理解為某一個元素為參照物,來定位的布局方式。主要屬性有:相對于某一個元素android:layout_below、 android:layout_toLeftOf相對于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh。 五、TableLayout:表格布局,每一個TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個元素。每一個布局都有自己適合的方式,這五個布局元素可以相互嵌套應用,做出美觀的界面。 3、 android中的動畫有哪幾類,它們的特點和區別是什么 一種是Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。 4、 android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別。 答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕松些,但一些性能敏感的數據庫或手機上還是主要采用SAX方式,SAX讀取是單向的,優點:不占內存空間、解析屬性方便,但缺點就是對于套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML文件加載到內存中去,這里Android開發網提醒大家該方法在查找方面可以和XPath很好的結合如果數據量不是很大推薦使用,而PULL常常用在J2ME對于節點處理比較好,類似SAX方式,同樣很節省內存,在J2ME中我們經常使用的KXML庫來解析。 5、 ListView的優化方案 1、如果自定義適配器,那么在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView并返回,如果不為null則直接使用。在這個方法中盡可能少創建view。 2、給contentView設置tag(setTag()),傳入viewHolder對象,用于緩存要顯示的數據,可以達到圖像數據異步加載的效果。 3、如果listview需要顯示的item很多,要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。 6、 請介紹下Android的數據存儲方式。 SharedPreferences存儲數據;文件存儲數據;SQLite數據庫存儲數據;使用ContentProvider存儲數據;網絡存儲數據; Preference,File, DataBase這三種方式分別對應的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。 一:使用SharedPreferences存儲數據: Android提供的用來存儲一些簡單配置信息的一種機制,例如:登錄用戶的用戶名與密碼。其采用了Map數據結構來存儲數據,以鍵值的方式存儲,可以簡單的讀取與寫入,只是在寫入的時候有些區別:先調用edit()使其處于編輯狀態,然后才能修改數據,最后使用commit()提交修改的數據。實際上SharedPreferences是采用了XML格式將數據存儲到設備中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。使用SharedPreferences是有些限制的:只能在同一個包內使用,不能在不同的包之間使用。 二:文件存儲數據:一種較常用的方法,在Android中讀取/寫入文件的方法,與 java中實現I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件 三:網絡存儲數據:需要與Android 網絡數據包打交道 四:ContentProvider:好處是統一了數據訪問方式。 7、activity的啟動模式有哪些?是什么含義? 有4種activity的啟動模式,分別為: “standard” (默認) “singleTop” “singleTask” “singleInstance” 8、如何對Android性能進行分析 android 性能主要--響應速度 和UI刷新速度。 首先從函數的耗時來說,androidsdk自帶的工具TraceView,用于測量函數耗時的。 UI布局的分析,可以有2塊,一塊就是Hierarchy Viewer 可以看到View的布局層次,以及每個View刷新加載的時間。 這樣可以很快定位到那塊layout & View 耗時最長。 還有就是通過自定義View來減少view的層次。 9、 請描述下Activity的生命周期。 onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory(); 可見生命周期:從onStart()直到系統調用onStop() 前臺生命周期:從onResume()直到系統調用onPause() 10、 activity在屏幕旋轉時的生命周期 答:不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次;設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次;設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法 11、ANR是什么?如何避免和解決? ANR->application Not Responding 也就是在規定的時間內,沒有響應。怎么避免ANR ANR的關鍵 是處理超時,所以應該避免在UI線程,BroadcastReceiver 還有service主線程中,處理復雜的邏輯和計算,而交給work thread操作。 1)避免在activity里面做耗時操作,oncreate & onresume 2)避免在onReceiver里面做過多操作 3)避免在Intent Receiver里啟動一個Activity,因為它會創建一個新的畫面,并從當前用戶正在運行的程序上搶奪焦點。 4)盡量使用handler來處理UI thread & workthread的交互。 如何解決ANR首先定位ANR發生的log: 04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstartedCPUusage from 4361ms to 699ms ago ----CPU在ANR發生前的使用情況04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量從log可以看出,cpu在做大量的io操作。所以可以查看io操作的地方。 當然,也有可能cpu占用不高,那就是 主線程被block住了。 12、 注冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。 常駐型廣播(靜態注冊)當你的應用程序關閉了,如果有廣播信息來,你寫的廣播接收器同樣的能接收到,在AndroidManifast.xml 中注冊,這種方式可以理解為通過清單文件注冊的廣播是交給操作系統去處理的。非常駐型(動態注冊)當應用程序結束了,廣播自然就沒有了,比如在onCreate或者onResume中注冊廣播接收器在onDestory中卸載廣播接收器。這樣你的廣播接收器就一個非常駐型的了 13、 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系。 答:簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理. Message Queue(消息隊列):用來存放通過Handler發布的消息,通常附屬于某一個創建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列 Handler:可以發布或者處理一個消息或者操作一個Runnable,通過Handler發布消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息 Looper:是Handler和消息隊列之間通訊橋梁,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列里的消息廣播給所有的 Handler:Handler接受到消息后調用handleMessage進行處理 Message:消息的類型,在Handler類中的handleMessage方法中得到單個的消息進行處理 在單線程模型下,為了線程通信問題,Android設計了一個Message Queue(消息隊列), 線程間可以通過該Message Queue并結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹: 1. Message(消息)線程間交流的信息,處理數據后臺線程需要更新UI,則發送Message內含一些數據給UI線程。 2. Handler(處理者)是Message的主要處理者,負責Message的發送,Message內容的執行處理。后臺線程就是通過傳進來Handler對象引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。 3. Message Queue(消息隊列),用來存放通過Handler發布的消息,按照先進先出執行。 每個message queue都會有一個對應的Handler。Handler會向message queue通過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾并按先進先出執行。但通過這兩種方法發送的消息執行的方式略有不同:通過sendMessage發送的是一個message對象,會被 Handler的handleMessage()函數處理;而通過post方法發送的是一個runnable對象,則會自己執行。 4. Looper:是線程里的Message Queue的管家。 14、 簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver 答:一個activity呈現了一個用戶可以操作的可視化用戶界面;一個service不包含可見的用戶界面,而是在后臺運行,可以與一個activity綁定,通過綁定暴露出來接口并與其進行通信;一個broadcast receiver是一個接收廣播消息并做出回應的component,broadcast receiver沒有界面;一個intent是一個Intent對象,它保存了消息的內容。對于activity和service來說,它指定了請求的操作名稱和待操作數據的URI,Intent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基于manifest文件中的聲明)并激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。它是通過將Intent對象和目標的intent filter相比較來完成這一工作的;一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。 15、 說說mvc模式的原理,它在android中的運用,android的官方建議應用程序的開發采用mvc模式。何謂mvc? 模型(model)對象:應用程序的主體部分,所有的業務邏輯都應該寫在該層。 視圖(view)對象:應用程序中負責生成用戶界面的部分。也是整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入顯示處理結果。 控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。 android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下: 1)視圖層(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如果你對android了解的比較的多了話,就一定可以想到在android中也可以使用JavaScript+html等的方式作為view層,當然這里需要進行java和Javascript之間的通信,幸運的是,android提供了它們之間非常方便的通信實現。 2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。 3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model里面處理,當然對業務計算等操作也是必須放在的該層的。 16、 什么是ANR 如何避免它? ANR:Application Not Responding。在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應,當用戶操作的在5s內應用程序沒能做出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出現應用程序無響應對話框,這既是ANR。避免方法:Activity應該在它的關鍵生命周期方法(如onCreate()和onResume())里盡可能少的去做創建操作。潛在的耗時操作,例如網絡或數據庫操作,或者高耗時的計算如改變位圖尺寸,應該在子線程里(或者異步方式)來完成。主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。 17、 一條最長的短信息約占多少byte? 中文70(包括標點),英文160,160個字節。 18、 請解釋下Android程序運行時權限與文件系統權限的區別。 運行時權限Dalvik( android授權) 文件系統 linux 內核授權 19、 請介紹下ContentProvider是如何實現數據共享的。 一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。 要想使應用程序的數據公開化,可通過2種方法:創建一個屬于你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型并且有寫入Content provider的權限。 如何通過一套標準及統一的接口獲取其他應用程序暴露的數據? Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數據。 20、 Service和Thread的區別? 答:servie是系統的組件,它由系統進程托管(servicemanager);它們之間的通信類似于client和server,是一種輕量級的ipc通信,這種通信的載體是binder,它是在linux層交換信息的一種ipc。而thread是由本應用程序托管。1). Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位??梢杂?Thread 來執行一些異步的操作。 21、 Android本身的api并未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導致什么問題?如何解決? 答:會,比如nullpointerException。我遇到過,比如textview.setText()時,textview沒有初始化。會導致程序無法正常運行出現forceclose。打開控制臺查看logcat信息找出異常信息并修改程序。 22、 如果后臺的Activity由于某原因被系統回收了,如何在被系統回收之前保存當前狀態? 重寫onSaveInstanceState()方法,在此方法中保存需要保存的數據,該方法將會在activity被回收之前調用。通過重寫onRestoreInstanceState()方法可以從中提取保存好的數據 23、 android系統的優勢和不足 答:Android平臺手機 5大優勢: 一、開放性 在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開放性對于Android的發展而言,有利于積累人氣,這里的人氣包括消費者和廠商,而對于消費者來講,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。 二、掙脫運營商的束縛 在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什么功能接入什么網絡,幾乎都受到運營商的控制。從去年iPhone 上市 ,用戶可以更加方便地連接網絡,運營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動網絡的逐步過渡和提升,手機隨意接入網絡已不是運營商口中的笑談,當你可以通過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是不是像噩夢一樣?互聯網巨頭Google推動的Android終端天生就有網絡特色,將讓用戶離互聯網更近。 三、豐富的硬件選擇 這一點還是與Android平臺的開放性相關,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟件的兼容,好比你從諾基亞 Symbian風格手機 一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯系人等資料更是可以方便地轉移,是不是非常方便呢? 四、不受任何限制的開發商 Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android難題之一。 五、無縫結合的Google應用 如今叱詫互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成為連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。 再說Android的5大不足: 一、安全和隱私 由于手機 與互聯網的緊密聯系,個人隱私很難得到保守。除了上網過程中經意或不經意留下的個人足跡,Google這個巨人也時時站在你的身后,洞穿一切,因此,互聯網的深入將會帶來新一輪的隱私危機。 二、首先開賣Android手機的不是最大運營商 眾所周知,T-Mobile在23日,于美國紐約發布 了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知取得Android手機銷售權的僅有 T-Mobile和Sprint,其中T-Mobile的3G網絡相對于其他三家也要遜色不少,因此,用戶可以買賬購買G1,能否體驗到最佳的3G網絡服務則要另當別論了! 三、運營商仍然能夠影響到Android手機 在國內市場,不少用戶對購得移動定制機不滿,感覺所購的手機被人涂畫了廣告一般。這樣的情況在國外市場同樣出現。Android手機的另一發售運營商Sprint就將在其機型中內置其手機商店程序。 四、同類機型用戶減少 在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,并分享軟件資源。而對于Android平臺手機,由于廠商豐富,產品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統一機型的程序強化。舉個稍顯不當的例子,現在山寨機泛濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除了哪些功能異常搶眼、頗受追捧的機型以外。 五、過分依賴開發商缺少標準配置 在使用PC端的Windows xp系統的時候,都會內置微軟Windows Media Player這樣一個瀏覽器程序,用戶可以選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用默認的程序同樣可以應付多樣的需要。在 Android平臺中,由于其開放性,軟件更多依賴第三方廠商,比如Android系統的SDK中就沒有內置音樂 播放器,全部依賴第三方開發,缺少了產品的統一性。 |
新聞熱點
疑難解答