Android開發面試經——2.常見Android基礎筆試題

關注finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231 
正值跳槽的熱季,整理一下Android面試中最常考的筆試題,爲下次找工作時做好充分準備,這是Android的基礎部分:

1、Android四大組件是什麼?作用以及應用場景? 
Android 的四大組件分別是是Activity,Service,BroadcastReceiver和ContentProvider;

Activity: 
從字面上理解,Activity是活動的意思。一個Activity通常展現爲一個可視化的用戶界面,是Android程序與用戶交互的窗口,也是Android組件中最基本也是最複雜的一個組件。從視覺效果來看,一個Activity佔據當前的窗口,響應所有窗口事件,具備有控件,菜單等界面元素。從內部邏輯來看,Activity需要爲了保持各個界面狀態,需要做很多持久化的事情,還需要妥善管理生命週期,和一些轉跳邏輯。

Service 
服務是運行在後臺的一個組件,從某從意義上說,服務就像一個沒有界面的Activity。它們在很多Android的概念方面比較接近,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事件,定義好需要接受的Intent提供同步和異步的接口。

BroadcastReceiver 
廣播接收者,不執行任何任務,廣播是一種廣泛運用的在應用程序之間傳輸信息的機制 。而 BroadcastReceiver 是對發送出來的廣播進行過濾接收並響應的一類組件。Broadcast Receiver 不包含任何用戶界面。然而它們可以啓動一個Activity以響應接受到的信息,或者通過NotificationManager通知用戶。可以通過多種方式使用戶知道有新的通知產生:閃動背景燈、震動設備、發出聲音等等。通常程序會在狀態欄上放置一個持久的圖標,用戶可以打開這個圖標並讀取通知信息。在Android中還有一個很重要的概念就是Intent,如果說Intent是一個對動作和行爲的抽象描述,負責組件之間程序之間進行消息傳遞。那麼Broadcast Receiver組件就提供了一種把Intent作爲一個消息廣播出去,由所有對其感興趣的程序對其作出反應的機制。

Content Provider 
即內容提供者,作爲應用程序之間唯一的共享數據的途徑,Content Provider 主要的功能就是存儲並檢索數據以及向其他應用程序提供訪問數據。 
對應用而言,也可以將底層數據封裝成ContentProvider,這樣可以有效的屏蔽底層操作的細節,並且使程序保持良好的擴展性和開放性。Android提供了一些主要數據類型的Contentprovider,比如音頻、視頻、圖片和私人通訊錄等。可在android.provider包下面找到一些android提供的Contentprovider。可以獲得這些Contentprovider,查詢它們包含的數據,當然前提是已獲得適當的讀取權限。如果我們想公開自己應用程序的數據,可以創建自己的 Content provider 的接口。

2、android中的動畫有哪幾類,它們的特點和區別是什麼? 
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

3、後臺的activity被系統回收怎麼辦?如何在被系統回收之前保存當前狀態?

當一個Activity被pause或者stop的時候,這個Activity的對象實際上還是保存在內存中,因此這個Activity中的信息(成員和狀態信息)還可以重新獲取到. 
如果系統爲了整理內存而銷燬了Activity對象時,系統沒法簡單的原封不動地恢復先前的Activity對象及其狀態信息. 
Activity中提供了一個方法:onSavedInstanceState(Bundle obj).當系統銷燬一個Activity時,會將Activity的狀態信息已鍵值對形式存放在bundle對象中. 
第一次啓動Activity時,這個bundle對象是空的,null.如果Activity被系統銷燬了,然後用戶要回退回去看的話,系統會調用這個Activity的onCreate方法,並把bundle對象傳遞過去.

4. 請描述一下Activity 生命週期。 
這裏寫圖片描述 
5. 如何將一個Activity設置成窗口的樣式。 
在AndroidManifest.xml 中定義Activity的地方一句話android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就變成半透明的

6.註冊廣播有幾種方式,有何優缺點? 
有兩種,一種是代碼動態註冊: 
//生成廣播處理 
smsBroadCastReceiver = new SmsBroadCastReceiver(); 
//實例化過濾器並設置要過濾的廣播

IntentFilter intentFilter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);

//註冊廣播 
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter); 
一種是在AndroidManifest.xml中配置廣播

 <!--廣播註冊-->  
        <receiver android:name=".SmsBroadCastReceiver">  
            <intent-filter android:priority="20">  
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>  
        </receiver>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

兩種註冊類型的區別是: 
1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命週期 
2)第二種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。 
註冊的方法有兩種,一種是靜態註冊,一種是動態註冊。 
動態註冊優點: 在 Android 的廣播機制中, 動態註冊的優先級是要高於靜態註冊優先級的 , 因此在必要的情況下,我們是需要動態註冊廣播接收器的。 
靜態註冊優點:動態註冊廣播接收器還有一個特點,就是當用來註冊的 Activity 關掉後 ,廣播也就失效了。同時反映了靜態註冊的一個優勢,就是無需擔憂廣播接收器是否被關閉 , 只要設備是開啓狀態,廣播接收器就是打開着的。

7.IntentService有何優點? 
普通的service ,默認運行在ui main 主線程 
這是帶有異步處理的service類, 
異步處理的方法 OnHandleIntent() 
OnHandleIntent() 處理耗時的操作 
Android的進程處理器現在會儘可能的不kill掉你

8.橫豎屏切換時候activity的生命週期? 
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次 
  2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次 
  3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法 
   
9、如何將SQLite數據庫(dictionary.db文件)與apk文件一起發佈? 如何將打開res raw目錄中的數據庫文件? 
  解答:以將dictionary.db文件複製到res raw目錄中 ,在Android中不能直接打開res raw目錄中的數據庫文件,而需要在程序第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,然後再打開該數據庫文件。複製的基本方法是使用getResources().openRawResource方法獲得res raw目錄中資源的 InputStream對象,然後將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite ; 
   
10.AndroidManifest.xml文件中主要包含哪些信息 
說明應用程序的Java 包,該包名是應用程序的唯一標識; 
描述應用程序的組件:該應用程序由哪些activity,service,broadcast receiver和content provider組成; 
聲明應用程序所必須具備的權限,用以訪問受保護的部分API,以及與其他應用程序的交互; 
聲明應用程序所需要的Android API的最低版本級別,比如1.0,1.1,1.5; 
manifest:根節點,描述了 package 中所有的內容。 
uses-permission:請求你的 package 正常運作所需賦予的安全許可。 
permission: 聲明瞭安全許可來限制哪些程序能你 package 中的組件和功能。 
instrumentation:聲明瞭用來測試此 package 或其他 package 指令組件的代碼。 
application:包含 package 中 application 級別組件聲明的根節點。 
activity:Activity 是用來與用戶交互的主要工具。 
receiver:IntentReceiver 能使的 application 獲得數據的改變或者發生的操作,即使它當 前不在運行。 
service:Service 是能在後臺運行任意時間的組件。 
provider:ContentProvider 是用來管理持久化數據併發布給其他應用程序使用的組件。

11.Android數據儲存方式 
一.SharedPreferences方式:它是 Android提供的用來存儲一些簡單配置信息的一種機制,採用了 XML 格式將數據存儲到設備中。只能在同一個包內使用,不能在不同的包之間使用。 
二.文件存儲方式 /data/data/包名/files 內存裏面 
/ context.openFileInput(name) 默認是私有的訪問權限 
三.SQLite數據庫方式:SQLite 是 Android 所帶的一個標準的數據庫, 它支持 SQL語句,它是一個輕量級的嵌入式數據庫。 
四.內容提供器(Content provider)方式:主要用於應用程序之間進行數據交換,從而能夠讓其他的應用保存或讀取此 Content Provider 的各種數據類型。 
五. 網絡存儲方式: 通過網絡上提供給我們的存儲空間來上傳(存儲)和下載(獲取)我們存儲 在網絡空間中的數據信息。

12.Android中常見五種佈局介紹 
FrameLayout(幀佈局): 從屏幕的左上角開始佈局,疊加顯示, 實際應用 播放器的暫停按鈕. 
LinearLayout (線性佈局):可分爲垂直佈局,水平佈局; 
AbsoluteLayout(絕對佈局):用X,Y座標來指定元素的位置; 
RelativeLayout(相對佈局): 相對佈局可以理解爲某一個元素爲參照物,來定位的佈局方式。 
TableLayout(表格佈局):表格佈局類似Html裏面的Table。每一個TableLayout裏面有表格行TableRow,TableRow裏面可以具體定義每一個元素,設定他的對齊方式 android:gravity=”” 。 
每一個佈局都有自己適合的方式,另外,這五個佈局元素可以相互嵌套應用,做出美觀的界面。

13.Activity的四種啓動模式?,activity與task的啓動方式有哪些,她們的含義具體說明 
standard: 標準模式,一調用 startActivity()方法就會產生一個新的實例。 
singleTop: 如果已經有一個實例位於 Activity 棧的頂部時, 就不產生新的實例, 而只是調用Activity 中的 newInstance()方法。如果不位於棧頂,會產生一個新的實例。 
singleTask: 會在一個新的 task 中產生這個實例,以後每次調用都會使用這個,不會去產生 新的實例了。 
singleInstance: 這個跟 singleTask 基本上是一樣, 只有一個區別: 在這個模式下的 Activity實例所處的 task 中,只能有這個 activity實例,不能有其他的實例。

14.Android 中的長度單位詳解 
如果設置表示長度 、 高度等屬性時可以使用 dp 或 sp。但如果設置字體,需要使用 sp。dp 是與密度無關,sp 除了與密度無關外,還與 scale 無關。如果屏幕密度爲160,這時 dp 和 sp 和 px 是一樣 
的。1dp=1sp=1px, 
也就是說,如果使用 dp 和 sp,系統會根據屏幕密度的變化自動進行轉換 
px :表示屏幕實際的象素 
in:表示英寸,是屏幕的物理尺寸。每英寸等於2.54 釐米。

15.android 析 中有哪幾種解析 l xml 的類, , , , 官方推薦哪種?以及它們的原 理和區別 
DOM 解析 
優點: 
1.XML 樹在內存中完整存儲,因此可以直接修改其數據和結構. 
2.可以通過該解析器隨時訪問 XML 樹中的任何一個節點. 
3.DOM 解析器的 API 在使用上也相對比較簡單. 
缺點:如果 XML 文檔體積比較大時,將文檔讀入內存是非常消耗系統資源的 
Ø SAX 解析 
優點: 
SAX 對內存的要求比較低,因爲它讓開發人員自己來決定所要處理的標籤.特別是當開發人 員只需要處理文檔中所包含的部分數據時,SAX 這種擴展能力得到了更好的體現. 
缺點: 
用 SAX 方式進行 XML 解析時,需要順序執行,所以很難訪問到同一文檔中的不同數據.此外,在基於該方式的解析編碼過程也相對複雜 
Ø Xmlpull 解析(官方推薦使用) 
android SDK 提供了 xmlpull api,xmlpull 和 sax 類似,是基於流(stream)操作文件,然後根據節點事件回調開發者編寫的處理程序.因爲是基於流的處理,因此 xmlpull 和 sax 都比較節 
約內存資源,不會象 dom 那樣要把所有節點以對橡樹的形式展現在內存中.xmlpull 比 sax 更 簡明,而且不需要掃描完整個流.

16.ListView 的 優化方案 
(1),如果自定義適配器,那麼在 getView 方法中要考慮方法傳進來的參數 contentView 是否 爲 null,如果爲 null 就創建 contentView 並返回,如果不爲 null 則直接使用。在這個方法中,儘可能少創建 view。 
(2),給 contentView 設置 tag(setTag()),傳入一個 viewHolder 對象,用於緩存要顯示的數 據,可以達到圖像數據異步加載的效果 
(3),如果 listview 需要顯示的 item 很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候,再去加載接下來的20 條。 
(4) 快速滑動時不加載圖片 
(5) 如果自定義的item中有圖片,需要處理圖片(減少圖片所佔內存) 
1.對圖片進行邊界壓縮 2.用option類來保存圖片大小 3.避免圖片的實時縮放,最好預先縮放到視圖大小 
(6)儘量避免在listview適配器中使用線程,因爲線程是產生內存泄露的主要原因在於線程的生命週期不可控。

17.Android中intent的作用 
在一個 Android 應用中,主要是由一些組件組成(Activity,Service,ContentProvider,etc.) 在這些組件之間的通訊中,由 Intent 協助完成。 
Intent 負責對應用中一次操作的動作、動作涉及數據、附加數據 
進行描述,Android 則根據此 Intent 的描述,負責找到對應的組件,將 Intent 傳遞給調用的組件,並完成組件的調用。Intent 在這裏起着實現調用者與被調用者之間的解耦作用。 
有兩種方式,一種是顯示匹配,一種是隱示匹配; 
顯示:明確的指定要跳轉的Activity,或者Service等; 
隱示:隱式匹配,首先要匹配 Intent 的幾項值:Action,Category, Data/Type,Component如果填寫了 Componet 就是這就形成了顯示匹配。 
1.如果你填寫了 Action, 如果有一個程序的 Manifest.xml 中的某一個 Activity 的 IntentFilter 段中定義了包含了相同的 Action 那麼這個 Intent 就與這個目標 Action 匹配, 如果這個 Filter段中沒有定義 Type,Category,那麼這個 Activity 就匹配了。但是如果手機中有兩個以上的程序匹配,那麼就會彈出一個對話可框來提示說明。 
2,data/type,你可以用 Uri 來做爲 data,比如 Uri uri = Uri.parse(http://www.google.com ); 
Intent i = new Intent(Intent.ACTION_VIEW,uri);手機的 Intent 分發過程中,會根據 http://www.google.com 的 scheme 判斷出數據類型 type手機的 Brower 則能匹配它,在 Brower 的 Manifest.xml 中的 IntenFilter中首先有ACTION_VIEW Action,也能處理 http:的 type; 
3,至於分類 Category,一般不要去在 Intent 中設置它,如果你寫 Intent 的接收者,就在Manifest.xml 的 Activity 的 IntentFilter 中包含 android.category.DEFAULT,這樣所有不設置Category(Intent.addCategory(String c);)的 Intent 都會與這個 Category 匹配。 
4,extras(附加信息) ,是其它所有附加信息的集合。使用 extras 可以爲組件提供擴展信息 ,比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在 extras裏,傳給電子郵件發送組件。

18.如何退出 Activity ?如何安全退出? 
對於單一 Activity 的應用來說,退出很簡單,直接 finish()即可。 
當然,也可以用 killProcess()和 System.exit()這樣的方法。 
爲了編程方便,最好定義一個 Activity 基類,處理這些共通問題。 
1、記錄打開的 Activity: 
每打開一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。 
2、發送特定廣播: 
在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。

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