1. 程式人生 > >Android應用開發經典面試題

Android應用開發經典面試題

1、 Android的四大元件是哪些,它們的作用?
答:Activity:Activity是Android程式與使用者互動的視窗,是Android構造塊中最基本的一種,它需要為保持各介面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的食物,定義好需要接受的Intent提供同步和非同步的介面

Content Provider:是Android提供的第三方應用資料的訪問方案,可以派生Content Provider類,對外提供資料,可以像資料庫一樣進行選擇排序,遮蔽內部資料的儲存細節,向外提供統一的藉口模型,大大簡化上層應用,對資料的整合提供了更方便的途徑


BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型


2、 請介紹下Android中常用的五種佈局。
常用五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),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動畫。

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儲存資料
首先說明SharedPreferences儲存方式,它是 Android提供的用來儲存一些簡單配置資訊的一種機制,例如:登入使用者的使用者名稱與密碼。其採用了Map資料結構來儲存資料,以鍵值的方式儲存,可以簡單的讀取與寫入,具體例項如下:
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences user = getSharedPreferences(“user_info”,0);
strName = user.getString(“NAME”,””);
strPassword = user getString(“PASSWORD”,””);
}
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences user = getSharedPreferences(“user_info”,0);
uer.edit();
user.putString(“NAME”, strName);
user.putString(“PASSWORD” ,strPassword);
user.commit();
}
資料讀取與寫入的方法都非常簡單,只是在寫入的時候有些區別:先呼叫edit()使其處於編輯狀態,然後才能修改資料,最後使用commit()提交修改的資料。實際上SharedPreferences是採用了XML格式將資料儲存到裝置中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。使用SharedPreferences是有些限制的:只能在同一個包內使用,不能在不同的包之間使用。


二:檔案儲存資料
檔案儲存方式是一種較常用的方法,在Android中讀取/寫入檔案的方法,與 Java中實現I/O的程式是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取裝置上的檔案。具體例項如下:
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);


三:網路儲存資料
網路儲存方式,需要與Android 網路資料包打交道,關於Android 網路資料包的詳細說明,請閱讀Android SDK引用了Java SDK的哪些package?。


四:ContentProvider
1、ContentProvider簡介
當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共享其資料。雖然使用其他方法也可以對外共享資料,但資料訪問方式會因資料儲存的方式而不同,如:採用檔案方式對外共享資料,需要進行檔案操作讀寫資料;採用sharedpreferences共享資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共享資料的好處是統一了資料訪問方式。
2、Uri類簡介
Uri代表了要操作的資料,Uri主要包含了兩部分資訊:1.需要操作的ContentProvider ,2.對ContentProvider中的什麼資料進行操作,一個Uri由以下幾部分組成:
1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定為:content://…
2.主機名(或Authority):用於唯一標識這個ContentProvider,外部呼叫者可以根據這個標識來找到它。
3.路徑(path):可以用來表示我們要操作的資料,路徑的構建應根據業務而定,如下:
要操作contact表中id為10的記錄,可以構建這樣的路徑:/contact/10
要操作contact表中id為10的記錄的name欄位, contact/10/name
要操作contact表中的所有記錄,可以構建這樣的路徑:/contact?
要操作的資料不一定來自資料庫,也可以是檔案等他儲存方式,如下:
要操作xml檔案中contact節點下的name節點,可以構建這樣的路徑:/contact/name
如果要把一個字串轉換成Uri,可以使用Uri類中的parse()方法,如下:
Uri uri = Uri.parse(“content://com.changcheng.provider.contactprovider/contact”)
3、UriMatcher、ContentUrist和ContentResolver簡介
因為Uri代表了要操作的資料,所以我們很經常需要解析Uri,並從 Uri中獲取資料。Android系統提供了兩個用於操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便於我們的開發工作。
UriMatcher:用於匹配Uri,它的用法如下:

1.首先把你需要匹配Uri路徑全部給註冊上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路徑,返回匹配碼為1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//新增需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼為2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#號為萬用字元
2.註冊完需要匹配的Uri後,就可以使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是呼叫 addURI()方法傳入的第三個引數,假設匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼為1。
ContentUris:用於獲取Uri路徑後面的ID部分,它有兩個比較實用的方法:
withAppendedId(uri, id)用於為路徑加上ID部分
parseId(uri)方法用於從路徑中獲取ID部分
ContentResolver:當外部應用需要對ContentProvider中的資料進行新增、刪除、修改和查詢操作時,可以使用 ContentResolver 類來完成,要獲取ContentResolver 物件,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,來操作資料。

1. Intent的幾種有關Activity啟動的方式有哪些,你瞭解每個含義嗎
這裡Android123提示大家,Intent的一些標記有FLAG_ACTIVITY_BROUGHT_TO_FRONT、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK等。每種含義大家看SDK文件和具體跑下這樣你的記憶會更深刻些。
2. Activity和Task的啟動模式有哪些? 每種含義是什麼
有關在AndroidManifest.xml中的android:launchMode定義,主要有standard、singleTop、singleTask和singleInstance,同時對於android:taskAffinity這些問題大家也要了解,Android開發網在以前的文章中講過,不過很多開發者仍然不是很清楚,這些基礎問題我們以後仍然會再次總結。
3. 通過Intent傳遞一些二進位制資料的方法有哪些?
1). 使用Serializable介面實現序列化,這是Java常用的方法。
2). 實現Parcelable介面,這裡Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換資料也很常見的。

4. 能說下Android應用的入口點嗎?
真正的Android入口點是application的main,你可以看下androidmanifest.xml的包含關係就清楚了。可以沒有Activity但是必須有Application

5. Android都有哪些XML解析器,都熟練掌握嗎?
這裡XmlPull、SAX和DOM相信做過Web開發的都已經滾瓜爛熟了。

6. SQLite支援事務嗎? 新增刪除如何提高效能?

SQLite作為輕量級的資料庫,比MySQL還小,但支援SQL語句查詢,提高效能可以考慮通過原始經過優化的SQL查詢語句方式處理。

1,Activity的生命週期

2,Service的生命週期

3,Service和Activity在同一個執行緒嗎 main 執行緒 UI執行緒

4,java中的soft reference是個什麼東西

5,內部類機制

6,說一下java中的抽象

7,private和default有什麼區別

8,說一下你對service的理解

9,四大元件都用過哪些,簡單的介紹一下它們的用法

10,udp連線和TCP的不同之處

11,在哪些情況下java程式碼中需要呼叫C程式碼

12,介紹一下android中的task

13,Activity的啟動模式

14,談一下對java中的abstract的理解

15,java中final定義的類有什麼特點

16,android開發中怎麼去除錯debug

17.service裡面可以彈土司麼