(出處丟失,若有版權問題可私密我,我會盡早刪除!)php
JAVAcss
1.GC是什麼? 爲何要有GC?GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操做方法。
2.XML包括哪些解釋技術,區別是什麼?
DOM和SAX
DOM將文檔解析成一顆文檔樹,可在節點上進行遍歷、增長、修改和刪除。一次性讀入內存,對內存消耗大。
SAX至上而下解析文檔,以事件進行驅動。不會一次性讀入內存,對內存消耗小,不能任意讀取節點,而且不能對節點進行增長、修改和刪除。
3.switch語句可否做用在byte上,可否做用在long上,可否做用在String上?
switch能做用在byte、char、short和int上,JDK1.7後能夠做用在String上。
4."=="和equals方法究竟有什麼區別?
==和equals均可以比較地址。==是運算符,equals是方法,方法能夠經過重寫改變其行爲,如String的equals就是比較字符串內容。
5.構造方法可否被重寫和重載?
構造方法不能被重寫可是能被重載。
6.面向對象的特徵有哪些?
封裝、繼承、多態和抽象。
7.抽象類和接口的區別?
1).抽象類是abstract class修飾,接口是interface修飾。
2).抽象類能夠有任意類型的屬性,接口只能有靜態常量修飾的屬性。
3).抽象類能夠有普通方法和抽象法方法,接口的方法都是抽象方法。
4).抽象類和接口都不能實例化,可是抽象類有構造方法,接口沒有構造方法。
5).抽象類只能單根繼承,接口能夠多重實現。
8.內部類能夠引用它的包含類的成員嗎?有沒有什麼限制?
能夠引用。若是須要指定當前類時要用外部類.this來引用。若是引用局部變量,須要將局部變量指定爲final。
9.String s = new String("xyz");建立了幾個String Object? 兩者之間有什麼區別?
2個對象。"xyz"建立在字符串常量池中,new String()建立在堆中。
10.try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?
會在return前執行。
11.Integer與int的區別
Integer爲包裝類,int是基本數據類型。包裝類擁有方法和屬性,基本數據類型不具有。包裝類能夠經過intValue來轉換成基本數據類型,也能夠經過new Integer()將基本數據類型轉換爲包裝類。在JDK1.5後,包裝類和基本數據類型能夠實現自動轉換。
12.sleep()和wait()有什麼區別?
sleep是Thread類的方法,wait是Object類的方法。
sleep是自動喚醒,wait須要其餘線程來喚醒。
sleep不會釋放同步鎖,wait會釋放同步鎖。
sleep能夠用在任意方法中,wait只能用在同步方法或同步塊中。
13.Sleep() 不會釋放對象鎖 到時自動恢復 wait()會釋放對象鎖 進入等待此對象的等待鎖定池 發出notify()方法後 才進入等待鎖定池準備對象鎖的獲取進入運行狀態
14.同步和異步有何異同,在什麼狀況下分別使用他們?
同步指同一時間只能一個線程執行該方法,其餘線程須要等待。異步指多個線程能夠同時執行某個方法,並共享同一資源。
同步可讓訪問的資源具備安全性,由於同一時間只能一個線程對其進行訪問。可是效率不高。
異步對訪問的資源會形成不穩定性,好比多個線程同時訪問一個資源,一個在修改、一個在刪除、一個在讀取,這樣可能會形成資源的混亂。可是因爲同時運行,執行效率獲得提升。
15.啓動一個線程是用run()仍是start()?
start()方法啓動線程,run方法是線程執行的主方法。
16.java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
java中有三種流,分別是字節流(InputStream、OutputStream)、字符流(Reader、Writer)、對象流(ObjectInputStream、ObjectOutputStream)。
17.字節流與字符流的區別?
字節流用於讀取或寫出二進制數據,好比圖片、影像等數據。
字符流用於讀取或寫出字符數據,好比傳輸字符串。
全部的數據均可以經過字節流來進行處理,不過若是是字符數據,用字節流還須要進行轉換後傳輸,若是使用字符流能夠方便數據的轉換。
18.error和exception有什麼區別?
error是系統錯誤,代碼不能處理的錯誤,好比內存溢出、堆棧溢出等。
exception是程序異常,能夠經過代碼try-catch進行處理,好比空指針異常,數組越界等。
19.談談final,finally,finalize的區別?
final是修飾符,能夠修飾類(不能被繼承)、屬性(常量)、和方法(不能被重寫)。
finally是異常處理塊中的代碼塊,表示不管如何都會執行的代碼塊。
finalize是Object類的方法,該方法在對象被垃圾回收以前執行的方法。
20.當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
若是其餘方法沒有加synchronized的話是能夠進入的。
21.當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞?
java中只有值傳遞,若是傳遞的對象,實際也是傳遞該對象的地址。
22.做用域public,private,protected,以及不寫時的區別
public公共修飾符,表示任意類均可以訪問。
protected爲受保護的修飾符,表示同類、同包以及不一樣包可是父子關係的是能夠訪問。
不寫表示默認修飾符,或者稱爲package修飾符,該修飾符表示只有同類或同包下的類能夠訪問,出了這個包就不能訪問了。
private爲私有修飾符,表示只有同類中能夠訪問,出了這個類就不能訪問了。
23.用最有效率的方法算出2乘以8等於幾 2《 3
將2的二進制向左移3位。java中用<<來移位。
24.heap和stack有什麼區別。
heap表示堆,stack表示棧。堆中放對象,棧中放引用變量。
堆空間是一個無序的空間,棧是先進後出的結構。
25.運行時異常與通常異常有何異
運行時異常是指繼承於RuntimeException的異常,這些異常在編譯時能夠不進行處理,當運行時若是出現問題纔會拋出。如NullPointException、ArrayIndexOutOfBoundsException
通常異常也稱爲編譯時異常,這些異常是繼承Exception但又不屬於RuntimeException的子類,若是程序中出現這些異常,在編譯時必須進行捕獲或拋出,不然編譯沒法經過。如IOException、FileNotFoundException
26.垃圾回收的優勢和原理。並考慮2種回收機制
Java語言中一個顯著的特色就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候再也不須要考慮內存管理。因爲有個垃圾回收機制,Java中的對象再也不有"做用域"的概念,只有對象的引用纔有"做用域"。垃圾回收能夠有效的防止內存泄露,有效的使用能夠使用的內存。垃圾回收器一般是做爲一個單獨的低級別的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
27.描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
28.是否能夠從一個static方法內部發出對非static方法的調用?
不能,除非先建立非static方法所在類的對象。
29.什麼是java序列化,如何實現java序列化?
30.使用serializable關鍵字 使用一個輸出流構造一個對象流流對象 而後使用對象流對象的writeObject()就能夠將參數爲obj的對象寫出
31.Anonymous Inner Class(匿名內部類)是否能夠extends(繼承)其它類,是否能夠implements(實現)interface(接口)?
匿名內部類能夠繼承類或實現接口,但不是顯示的使用extends或implements來繼承或實現。
32.ArrayList和Vector的區別,HashMap和Hashtable的區別?
ArrayList是JDK1.2的集合類而且線程不安全,Vector是1.0的集合類而且線程安全,兩者用法相似。
HashMap線程不安全且能放空鍵或空值,Hashtable線程安全且不能放空鍵或空值。
33.String 和StringBuffer有什麼差異?在什麼狀況下使用它們?
String字符串的基本類,該字符串是不可變的。StringBuffer是利用堆來存儲字符串,而且能夠對字符串的內容進行改變。
34.new一個類對象和使用類名建立一個對象有什麼區別?兩者使用時應該注意什麼?
new對象是最多見的建立對象的方式,利用類模板是經過反射來建立對象。雖然new對象時在底層也會經過類模板來建立對象,可是new對象的效率要比直接經過類模板建立對象的方式要高。
可是使用類模板的方式可讓程序的靈活性提升。
35.LinkedList和ArrayList的區別?
1)LinkedList是鏈表結構的集合,ArrayList數組結構的集合。
2)LinkedList在中間或前面增長或刪除數據時效率比ArrayList高。
3)LinkedList在最後添加或刪除數據時效率比ArrayList低。
4)遍歷數據時ArrayList效率高於LinkedList。
36.介紹JAVA開發中經常使用的Collection FrameWork(集合框架)?
Java中集合框架分爲Collection和Map接口,Collection接口下的集合每一個元素都由一個值組成,Map接口下的集合類每一個元素都是由鍵值對組成。
Collection接口下面有List和Set接口,List接口下常見的類有ArrayList、LinkedList、Vector。它們中的元素能夠重複,而且是有序的。Set接口下常見的類有HashSet、TreeSet。它們中的元素不能重複,而且是無序的。
37.在異常當中 throw和throws 有什麼區別和聯繫?
throw是在代碼中拋出一個異常,後面跟的是異常對象,虛擬機運行到這裏時會當即引起一個異常。
throws是寫在方法聲明上的,表示聲明該方法可能會拋出異常,後面跟的是異常類型。調用該方法的時候能夠選擇處理它或繼續往外拋。
38.重載和重寫的區別
重載是指在一個類中,兩個或兩個以上的方法具備相同方法名和不一樣參數列表,則表示這些方法爲重載方法。
重寫是指在父類和子類中,子類的方法和父類的方法具備相同方法名、相同參數列表、相同返回類型、子類的訪問修飾符範圍不小於父類的訪問修飾符範圍,異常的類型和個數不大於或多於父類的異常類型和個數,則表示該方法爲重寫方法。換句話說重載方法是區分同一個類中相同方法名的方法,重寫方法是找到父類相同方法名的方法並從新改變方法的行爲。
Android
39.activity、Service、BroadcastReceiver的做用(android)
Activity:Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的一種,它須要爲保持各界面的狀態,作不少持久化的事情,妥善管理生命週期以及一些跳轉邏輯
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的指令,定義好須要接受的Intent提供同步和異步的接口
BroadCast Receiver:接受一種或者多種Intent做觸發事件,接受相關消息,作一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型
40.描述一個完整的Android activity lifecycle
activity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();
41.顯式intent和隱式intent的區別是什麼(android)
Intent定義:Intent是一種在不一樣組件之間傳遞的請求消息,是應用程序發出的請求和意圖。做爲一個完整的消息傳遞機制,Intent不只須要發送端,還須要接收端。
顯式Intent定義:對於明確指出了目標組件名稱的Intent,咱們稱之爲顯式Intent。
隱式Intent定義:對於沒有明確指出目標組件名稱的Intent,則稱之爲隱式Intent。
說明:Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。
42.Android中線程同步的方法
線程同步的方法能夠採用同步方法和同步塊。
43.怎麼將一個Activity封裝成對話框的樣子? 怎樣將Activity封裝成長按Menu菜單的樣子?
簡單你只須要設置 一下Activity的主題就能夠了在AndroidManifest.xml 中定義 Activity的地方一句話:
Xml代碼
android :theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
這就使你的應用程序變成對話框的形式彈出來了,或者
Xml代碼
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就變成半透明的。
重寫OnCreateOptionMenu方法來處理按下menu後的行爲,而後再該方法中彈出對話框形式的Activity。
也能夠利用事件監聽來監聽menu按鍵,並在該按鈕按下後彈出對話框形式的Activity。
44.介紹一下Android系統的體系結構
應用層:android的應用程序一般涉及用戶界面和交互。
應用框架層:UI組件、各類管理器等。
函數庫層:系統C庫、媒體庫、webkit、SQLite等。
linux核心庫:linux系統運行的組件。
*45.描述下橫豎屏切換時候 activity 的生命週期
不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次.
設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次.
設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法.
46.android 中的動畫有哪幾種,它們的特色和區別是什麼 ?
兩種,一種是補間動畫(Tween)動畫、還有一種是幀動畫(Frame)動畫。Tween動畫,這種實現方式能夠使視圖組件移動、放大、縮小以及產生透明度的變化;另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。
47.一條最長的短信息約佔多少 byte?
140byte,70個漢字。
48.描述handler 機制的原理
andriod提供了 Handler 和 Looper 來知足線程間的通訊。
Handler 先進先出原則。
Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
1)Looper: 一個線程能夠產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列)。
2)Handler: 你能夠構造Handler對象來與Looper溝通,以便push新消息到Message Queue裏;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 一般就是main thread,而Android啓動程序時會替它創建一個Message Queue。
49.如何將 SQLite 數據庫 (dictionary.db 文件 ) 與 apk 文件一塊兒發佈 ?
能夠將dictionary.db文件複製到Eclipse Android工程中的res\raw目錄中。全部在res\raw目錄中的文件不會被壓縮,這樣能夠直接提取該目錄中的文件。
使用openDatabase方法來打開數據庫文件,若是該文件不存在,系統會自動建立/sdcard/dictionary目錄,並將res\raw目錄中的 dictionary.db文件複製到/sdcard/dictionary目錄中
50.說說 android 中 mvc 的具體體現
mvc是model,view,controller的縮寫,mvc包含三個部分:
模型(model)對象:是應用程序的主體部分,全部的業務邏輯都應該寫在該層。
視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶惟一能夠看到的一層,接收用戶的輸入,顯示處理結果。
控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現以下:
1)視圖(view):通常採用xml文件進行界面的描述,使用的時候能夠很是方便的引入。
2)控制層(controller):android的控制層的重任一般落在了衆多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫過多的代碼,要經過activity交割model業務邏輯層處理,這樣作的另一個緣由是android中的acitivity的響應時間是5s,若是耗時的操做放在這裏,程序就很容易被回收掉。
3)模型層(model):對數據庫的操做、對網絡等的操做都應該在model裏面處理,固然對業務計算等操做也是必須放在的該層的。
51.請介紹下 Android 中經常使用的五種佈局
幀佈局(FrameLayout)
線性佈局(LinearLayout)
表格佈局(TableLayout)
相對佈局(RelativeLayout)
絕對佈局(AbsoluteLayout)
52.如何啓用 Service ,如何停用 Service
1)startService用於啓動Service、stopService中止Service。
2)bindService綁定Service,unbindService解除Service的綁定。
53.如何優化ListView
一、若是自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null,若是爲null就建立contentView並返回,若是不爲null則直接使用。在這個方法中儘量少建立view。
二、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,能夠達到圖像數據異步加載的效果。
三、若是listview須要顯示的item不少,就要考慮分頁加載。好比一共要顯示100條或者更多的時候,咱們能夠考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。
54.描述4 種 activity 的啓動模式
1)standard :系統的默認模式,一次跳轉即會生成一個新的實例。假設有一個activity命名爲MainActivity,執行語句:
startActivity(new Intent(MainActivity.this, MainActivity.class))後,MainActivity將跳轉到另一個MainActivity,也就是如今的Task棧裏面有MainActivity的兩個實例。按返回鍵後你會發現仍然是在MainActivity(第一個)裏面。
2)singleTop:singleTop 跟standard 模式比較相似。若是已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。若是不位於棧頂,會產生一個新的實例。例:當MainActivity爲 singleTop 模式時,執行跳轉後棧裏面依舊只有一個實例,若是如今按返回鍵程序將直接退出。
3)singleTask: singleTask模式和後面的singleInstance模式都是隻建立一個實例的。在這種模式下,不管跳轉的對象是否是位於棧頂的activity,程序都不會生成一個新的實例(固然前提是棧裏面已經有這個實例)。這種模式至關有用,在之後的多activity開發中,常常會由於跳轉的關係致使同個頁面生成多個實例,這個在用戶體驗上始終有點很差,而若是你將對應的activity聲明爲 singleTask 模式,這種問題將不復存在。
4)singleInstance: 設置爲 singleInstance 模式的 activity 將獨佔一個task(感受task能夠理解爲進程),獨佔一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其餘activity是獨立的,它有本身的上下文activity。
55.什麼是Intent,如何使用?
Android基本的設計理念是鼓勵減小組件間的耦合,所以Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統,它容許在你的應用程序與其它的應用程序間傳遞Intent來執行動做和產生事件。使用Intent能夠激活Android應用的三個核心組件:活動、服務和廣播接收器。
經過startActivity() orstartActivityForResult()啓動一個Activity;
過 startService() 啓動一個服務,或者經過bindService() 和後臺服務交互;
經過廣播方法(好比 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())發給broadcast receivers
56.Android用的數據庫是什麼樣的?它和sql有什麼區別?爲何要用ContentProvide?它和sql的實現上有什麼差異?
Adnroid用的是SQLite數據庫。它和其餘網絡數據庫相似,也是經過SQL對數據進行管理。SQLite的操做很是簡單,包括數據類型在建表時也能夠不指定。
使用ContentProvider 能夠將數據共享給其餘應用,讓除本應用以外的應用也能夠訪問本應用的數據。它的底層是用SQLite 數據庫實現的,因此其對數據作的各類操做都是以Sql實現,只是在上層提供的是Uri。
57.經過Intent傳遞一些二進制數據的方法有哪些?
1)使用Serializable接口實現序列化,這是Java經常使用的方法。
2)實現Parcelable接口,這裏Android的部分類好比Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換數據也很常見的。
58.對一些資源以及狀態的操做保存,最好是保存在生命週期的哪一個函數中進行?
onResume()恢復數據、onPause()保存數據。
59.如何一次性退出全部打開的Activity
編寫一個Activity做爲入口,當須要關閉程序時,能夠利用Activity的SingleTop模式跳轉該Activity,它上面的全部Activity都會被銷燬掉。而後再將該Activity關閉。
或者再跳轉時,設置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這樣也能將上面的Activity銷燬掉。
60.說說Service的生命週期?
啓動Service的方式有兩種,各自的生命週期也有所不一樣。
1、經過startService啓動Service:onCreate、onStartCommand、onDestory。
2、經過bindService綁定Service:onCreate、onBind、onUnbind、onDestory。
61.什麼是AIDL?AIDL是如何工做的?
AIDL(Android接口描述語言)是一種接口描述語言; 編譯器能夠經過aidl文件生成一段代碼,經過預先定義的接口達到兩個進程內部通訊進程的目的. 若是須要在一個Activity中, 訪問另外一個Service中的某個對象, 須要先將對象轉化成AIDL可識別的參數(多是多個參數), 而後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成本身須要的對象。AIDL是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值.。
62.Android如何把文件存放在SDCard上?
在AndroidManifest.xml中加入訪問SDCard的權限以下:
<!– 在SDCard中建立與刪除文件權限 –>
<uses-permission android:name=」android.permission.MOUNT_UNMOUNT_FILESYSTEMS」/>
<!– 往SDCard寫入數據權限 –>
<uses-permission android:name=」android.permission.WRITE_EXTERNAL_STORAGE」/>
要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,而且能夠進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權限。
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,若是手機裝有SDCard,而且能夠進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄。
63.註冊廣播有幾種方式,這些方式有何優缺點?
兩種。一種是經過代碼註冊,這種方式註冊的廣播會跟隨程序的生命週期。二種是在AndroidManifest.xml中配置廣播,這種常駐型廣播當應用程序關閉後,若是有信息廣播來,程序也會被系統調用自動運行。
64.什麼是ANR 如何避免它?
在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。要避免它,應該儘可能少在主線程作耗時太長的操做,應該將這些操做放在線程當中去作。
65.Android自己的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會致使什麼問題?如何解決?
有可能,好比空指針異常、數組下表越界等異常,這些異常拋出後可能會致使程序FC。在編寫代碼時應該作好檢測,多考慮可能會發生錯誤的狀況,從代碼層次解決這些問題。
66.爲何要用 ContentProvider?它和 sql 的實現上有什麼差異?
使用ContentProvider 能夠將數據共享給其餘應用,讓除本應用以外的應用也能夠訪問本應用的數據。它的底層是用SQLite 數據庫實現的,因此其對數據作的各類操做都是以Sql實現,只是在上層提供的是Uri。
67.談談 UI 中, Padding 和 Margin 有什麼區別?
padding指內邊距,表示組件內部元素距離組件邊框的距離。
marin指外邊距,表示組件與組件之間的距離。
68.請介紹下 Android 的數據存儲方式。
Android 提供了5種方式存儲數據:
1)使用SharedPreferences存儲數據;
2)文件存儲數據;
3)SQLite數據庫存儲數據;
4)使用ContentProvider存儲數據;
5)網絡存儲數據;
Android 面試題(有詳細答案)
附帶答案,共100分
1、選擇題(30題,每題1.5分,共45分)
1.java.io包中定義了多個流類型來實現輸入和輸出功能,能夠從不一樣的角度對其進行分 類,按功能分爲:(c),若是爲讀取的內容進行處理後再輸出,須要使用下列哪一種流?(g)
A、輸入流和輸出流 B、字節流和字符流 C、節點流和處理流
D、File stream E、Pipe stream F、Random stream G、Filter stream
2.下列代碼的執行結果是:(b)
public class Test3{
public static void main(String args[]){
System.out.print(100%3);
System.out.print(",");
System.out.println(100%3.0);
}
}
A、1,1
B、1,1.0
C、1.0,1
D、1.0,1.0
3.在繼承中,關於構造方法的說明,下列說法錯誤的是(d)
A、子類無條件的繼承父類的無參構造方法,
B、子類能夠引用父類中的有參構造方法,使用super關鍵字,
C、若是子類沒有構造方法,則父類無參構造方法做爲自已的構造方法,
D、若是子類有無參構造方法,而父類的無參構造方法則被覆蓋。
4.如下程序的運行結果爲( b)
public class IfTest{
public static void main(String args[]){
int x=3;
int y=1;
if(x==y)
System.out.println("Not equal");
else
System.out.println("Equal");
}
}
A、Not equal B、Equal C、無輸出 D、編譯出錯
5.Java語言中字符串「學Java」所佔的內存空間是(a)
A. 6個字節
B. 7個字節
C. 10個字節
D. 11個字節
6.關於下列程序段的輸出結果,說法正確的是:(d )
public class MyClass{
static int i;
public static void main(Stringargv[]){
System.out.println(i);
}
}
A、有錯誤,變量i沒有初始化。
B、null
C、1
D、0
7.下列哪些語句關於內存回收的說明是正確的? (b )
A、 程序員必須建立一個線程來釋放內存
B、 內存回收程序負責釋放無用內存
C、 內存回收程序容許程序員直接釋放內存
D、 內存回收程序能夠在指定的時間釋放內存對象
8.下面異常是屬於Runtime Exception 的是(abcd)(多選)
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
9. Math.round(11.5)等於多少(). Math.round(-11.5)等於多少(c). c
A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12
10.下列程序段的輸出結果是:(b )
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
System.out.println(b);
}
A、true B、false C、1 D、0
11.activity對一些資源以及狀態的操做保存,最好是保存在生命週期的哪一個函數中進行(d)
A、onPause() B、onCreate() C、 onResume() D、onStart()
12.Intent傳遞數據時,下列的數據類型哪些能夠被傳遞(abcd)(多選)
A、Serializable B、charsequence C、Parcelable D、Bundle
13.android 中下列屬於Intent的做用的是(c)
A、實現應用程序間的數據共享
B、是一段長的生命週期,沒有用戶界面的程序,能夠保持應用在後臺運行,而不會由於切換頁面而消失
C、能夠實現界面間的切換,能夠包含動做和動做數據,鏈接四大組件的紐帶
D、處理一個應用程序總體性的工做
14.下列屬於SAX解析xml文件的優勢的是(b)
A、將整個文檔樹在內存中,便於操做,支持刪除,修改,從新排列等多種功能
B、不用事先調入整個文檔,佔用資源少
C、整個文檔調入內存,浪費時間和空間
D、不是長久駐留在內存,數據不是持久的,事件事後,若沒有保存數據,數據就會
消失
15.下面的對自定style的方式正確的是(a)
A、 <resources>
<style name="myStyle">
<itemname="android:layout_width">fill_parent</item>
</style>
</resources>
B、 <stylename="myStyle">
<itemname="android:layout_width">fill_parent</item>
</style>
C、 <resources>
<itemname="android:layout_width">fill_parent</item>
</resources>
D、 <resources>
<stylename="android:layout_width">fill_parent</style>
</resources>
16.在android中使用Menu時可能須要重寫的方法有(ac)。(多選)
A、onCreateOptionsMenu()
B、onCreateMenu()
C、onOptionsItemSelected()
D、onItemSelected()
17.在SQL Server Management Studio 中運行下列T-SQL語句,其輸出值(c)。
SELECT @@IDENTITY
A、 可能爲0.1
B、 可能爲3
C、 不可能爲-100
D、 確定爲0
18.在SQL Server 2005中運行以下T-SQL語句,假定SALES表中有多行數據,執行查詢之 後的結果是(d)。
BEGIN TRANSACTION A
Update SALES Set qty=30WHERE qty<30
BEGIN TRANSACTION B
Update SALES Setqty=40 WHERE qty<40
Update SALES Setqty=50 WHERE qty<50
Update SALES Setqty=60 WHERE qty<60
COMMIT TRANSACTION B
COMMIT TRANSACTION A
A、SALES表中qty列最小值大於等於30
B、SALES表中qty列最小值大於等於40
C、SALES表中qty列的數據所有爲50
D、SALES表中qty列最小值大於等於60
19.在android中使用SQLiteOpenHelper這個輔助類時,能夠生成一個數據庫,並能夠對數 據庫版本進行管理的方法能夠是(ab)
A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
20. android 關於service生命週期的onCreate()和onStart()說法正確的是(ad)(多選題)
A、當第一次啓動的時候前後調用onCreate()和onStart()方法
B、當第一次啓動的時候只會調用onCreate()方法
C、若是service已經啓動,將前後調用onCreate()和onStart()方法
D、若是service已經啓動,只會執行onStart()方法,不在執行onCreate()方法
21.下面是屬於GLSurFaceView特性的是(abc)(多選)
A、管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖
view上。
B、管理一個EGLdisplay,它能讓opengl把內容渲染到上述的surface上。
C、讓渲染器在獨立的線程裏運做,和UI線程分離。
D、能夠直接從內存或者DMA等硬件接口取得圖像數據
22.下面在AndroidManifest.xml文件中註冊BroadcastReceiver方式正確的是(a)
A、<receiverandroid:name="NewBroad">
<intent-filter>
<action
android:name="android.provider.action.NewBroad"/>
<action>
</intent-filter>
</receiver>
B、<receiver android:name="NewBroad">
<intent-filter>
android:name="android.provider.action.NewBroad"/>
</intent-filter>
</receiver>
C、<receiver android:name="NewBroad">
<action
android:name="android.provider.action.NewBroad"/>
<action>
</receiver>
D、<intent-filter>
<receiver android:name="NewBroad">
<action>
android:name="android.provider.action.NewBroad"/>
<action>
</receiver>
</intent-filter>
23.關於ContenValues類說法正確的是(a)
A、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中的
名是String類型,而值都是基本類型
B、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中的
名是任意類型,而值都是基本類型
C、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中的
名,能夠爲空,而值都是String類型
D、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中
的名是String類型,而值也是String類型
24.咱們都知道Hanlder是線程與Activity通訊的橋樑,若是線程處理不當,你的機器
就會變得越慢,那麼線程銷燬的方法是(a)
A、onDestroy()
B、onClear()
C、onFinish()
D、onStop()
25.下面退出Activity錯誤的方法是(c)
A、finish()
B、拋異常強制退出
C、System.exit()
D、onStop()
26.下面屬於android的動畫分類的有(ab)(多項)
A、Tween B、FrameC、Draw D、Animation
27.下面關於Androiddvm的進程和Linux的進程,應用程序的進程說法正確的是(d)
A、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,不必定擁有一個獨立
的Dalvik虛擬機實例.而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念.
B、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,不必定擁有一個獨立
的Dalvik虛擬機實例.而每個DVM不必定都是在Linux 中的一個進程,因此說不是一個概念.
C、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的
Dalvik虛擬機實例.而每個DVM不必定都是在Linux 中的一個進程,因此說不是一個概念.
D、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的
Dalvik虛擬機實例.而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念.
28.Android項目工程下面的assets目錄的做用是什麼b
A、放置應用到的圖片資源。
B、主要放置多媒體等數據文件
C、放置字符串,顏色,數組等常量數據
D、放置一些與UI相應的佈局文件,都是xml文件
29..關於res/raw目錄說法正確的是(a
A、 這裏的文件是原封不動的存儲到設備上不會轉換爲二進制的格式
B、 這裏的文件是原封不動的存儲到設備上會轉換爲二進制的格式
C、 這裏的文件最終以二進制的格式存儲到指定的包中
D、 這裏的文件最終不會以二進制的格式存儲到指定的包中
30.下列對android NDK的理解正確的是(abcd )
A、 NDK是一系列工具的集合
B、 NDK 提供了一份穩定、功能有限的 API 頭文件聲明。
C、 使「Java+C」 的開發方式終於轉正,成爲官方支持的開發方式
D、 NDK 將是 Android 平臺支持 C 開發的開端
二.填空題(每題2分,共20分)
1.咱們用___int____來定義一個整數,用___char____來定義一個字符類型,稱爲原始數據類型。
2.android中經常使用的四個佈局是framlayout,linenarlayout,relativelayout和tablelayout。
3.android 的四大組件是activiey,service,broadcast和contentprovide。
4.java.io包中的objectinputstream和objectoutputstream類主要用於對對象(Object)的讀寫。
5.android 中service的實現方法是:startservice和bindservice。
6.activity通常會重載7個方法用來維護其生命週期,除了onCreate(),onStart(),onDestory() 外還有onrestart,onresume,onpause,onstop。
7.android的數據存儲的方式sharedpreference,文件,SQlite,contentprovider,網絡。
8.當啓動一個Activity而且新的Activity執行完後須要返回到啓動它的Activity來執行
的回調函數是startActivityResult()。
9.請使用命令行的方式建立一個名字爲myAvd,sdk版本爲2.2,sd卡是在d盤的根目錄下,
名字爲scard.img, 並指定屏幕大小HVGA.____________________________________。
10.程序運行的結果是:_____good and gbc__________。
public classExample{
Stringstr=new String("good");
char[]ch={'a','b','c'};
publicstatic void main(String args[]){
Exampleex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"and ");
Sytem.out.print(ex.ch);
}
public voidchange(String str,char ch[]){
str="testok";
ch[0]='g';
}
}
三 簡答編程題(共35分)
1.在android中,請簡述jni的調用過程。(8分)
1)安裝和下載Cygwin,下載 Android NDK
2)在ndk項目中JNI接口的設計
3)使用C/C++實現本地方法
4)JNI生成動態連接庫.so文件
5)將動態連接庫複製到java工程,在java工程中調用,運行java工程便可
2.簡述Android應用程序結構是哪些?(7分)
Android應用程序結構是:
Linux Kernel(Linux內核)、Libraries(系統運行庫或者是c/c++核心庫)、Application
Framework(開發框架包)、Applications (核心應用程序)
3. 請繼承SQLiteOpenHelper實現:(10分)
1).建立一個版本爲1的「diaryOpenHelper.db」的數據庫,
2).同時建立一個 「diary」 表(包含一個_id主鍵並自增加,topic字符型100
長度, content字符型1000長度)
3).在數據庫版本變化時請刪除diary表,並從新建立出diary表。
public class DBHelper extends SQLiteOpenHelper {
publicfinal static String DATABASENAME = "diaryOpenHelper.db";
publicfinal static int DATABASEVERSION = 1;
//建立數據庫
publicDBHelper(Context context,String name,CursorFactory factory,int version)
{
super(context,name, factory, version);
}
//建立表等機構性文件
publicvoid onCreate(SQLiteDatabase db)
{
Stringsql ="create table diary"+
"("+
"_idinteger primary key autoincrement,"+
"topicvarchar(100),"+
"contentvarchar(1000)"+
")";
db.execSQL(sql);
}
//若數據庫版本有更新,則調用此方法
publicvoid onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
{
Stringsql = "drop table if exists diary";
db.execSQL(sql);
this.onCreate(db);
}
}
4.頁面上現有ProgressBar控件progressBar,請用書寫線程以10秒的的時間完成其進度
顯示工做。(10分)
答案
public class ProgressBarStu extendsActivity {
privateProgressBar progressBar = null;
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
//從這到下是關鍵
progressBar= (ProgressBar)findViewById(R.id.progressBar);
Threadthread = new Thread(new Runnable() {
@Override
publicvoid run() {
intprogressBarMax = progressBar.getMax();
try{
while(progressBarMax!=progressBar.getProgress())
{
intstepProgress = progressBarMax/10;
intcurrentprogress = progressBar.getProgress();
progressBar.setProgress(currentprogress+stepProgress);
Thread.sleep(1000);
}
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread.start();
//關鍵結束
}
}
1、選擇題
1
2
3
4
5
6
7
8
9
10
CG
B
D
B
A
D
B
ABCD
C
B
11
12
13
14
15
16
17
18
19
20
D
ABCD
C
B
A
AC
C
D
AB
AD
21
22
23
24
25
26
27
28
29
30
ABC
A
A
A
C
AB
D
B
A
ABCD
2、填空題
1.int char
2.FrameLayout,LilnearLayout,RelativeLayout,TableLayout
3.Activity,Broadcast,Service,ContentProvide
4.ObjectInputStream ObjectOutputSteam
5.startService ,bindService
6.onRestart(),onResume(),onPause(),onStop()
7.SharedPreferences存儲,文件存儲,SQLite存儲,ContentProvider,網絡存儲
8.startActivityResult()
9.adnroid create acd -n myAvd -t 8 -s HVDA - Cd:\card.img
10.good and gbc
---------------------------
一、 Android dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念
DVM指dalivk的虛擬機。每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念
二、sim卡的EF 文件有何做用
sim卡的文件系統有本身規範,主要是爲了和手機通信,sim本 身能夠有本身的操做系統,EF就是做存儲並和手機通信用的
三、嵌入式操做系統內存管理有哪幾種,各有何特性 ?
頁式,段式,段頁,用到了MMU,虛擬空間等技術
四、什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎?
嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統。主要用於工業控制、軍事設備、 航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統。又可分爲軟實時和硬實時兩種,而android是基於linux內核的,所以屬於軟實時。
五、一條最長的短信息約佔多少byte?
中文70(包括標點),英文160個字節
六、 android中的動畫有哪幾類,它們的特色和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式能夠使視圖組件移動、放大、縮小以及產生透明度的變化;另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。
七、handler機制的原理
andriod提供了 Handler 和 Looper 來知足線程間的通訊。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。 1)Looper: 一個線程能夠產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列)。 2)Handler: 你能夠構造Handler對象來與Looper溝通,以便push新消息到Message Queue裏;或者接收Looper從Message Queue取出)所送來的消息。 3) Message Queue(消息隊列):用來存放線程放入的消息。 4)線程:UI thread 一般就是main thread,而Android啓動程序時會替它創建一個Message Queue。
八、說說mvc模式的原理,
它在android中的運用 MVC(Model_view_contraller)」 模型_視圖_控制器」。 MVC應用程序老是由這三個部分組成。Event(事件)致使Controller改變Model或View,或者同時改變二者。只要 Controller改變了Models的數據或者屬性,全部依賴的View都會自動更新。相似的,只要Controller改變了View,View會 從潛在的Model中獲取數據來刷新本身
(View重繪和內存泄露面試常常問的問題 )
9. View的刷新:
在須要刷新的地方,使用handle.sendmessage發送信息,而後在handle的getmessage裏面執行invaliate或者postinvaliate。
能夠調用invalidate()和postInvalidate()這兩個方法刷新
10. GC內存泄露 出現狀況:
1).數據庫的cursor沒有關閉
2).構造adapter時,沒有使用緩存contentview 衍生listview的優化問題-----減小建立view的對象,充分使用contentview,能夠使用一靜態類來優化處理getview的過程/
3).Bitmap對象不使用時採用recycle()釋放內存
4).activity中的對象的生命週期大於activity 調試方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
十一、 Activity的生命週期
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); } 你本身寫的Activity會按須要 重 載這些方法,onCreate是免不了的,在一個Activity正常啓動的過程當中,他們被調用的順序是 onCreate -> onStart ->onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,可是有人問了 ,程序正運行着呢來電話了,這個程序咋辦?停止了唄,若是停止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,若是打斷 這個應用程序的是一個Theme爲Translucent 或者Dialog 的Activity那麼只是onPause ,恢復 的時候onResume
十二、生命週期中的各個方法中均可以作什麼?
onCreate: 在這裏建立界面,作一些數據的初始化工做
onStart: 到這一步變成用戶可見不可交互的
onResume: 變成和用戶可交互的,(在activity 棧系統經過棧的方式管理這些個Activity的最上面,運行完彈出棧,則回到上一個Activity)
onRestart:從新啓動activity時調用。該活動仍在棧中,而不是啓動新的活動
onPause: 到 這一步是可見但不可交互的,系統會中止動畫等消耗CPU 的事情從上文的描述已經知道,應該在這裏保存你的一些數據,由於這個時候你的程序的優先級下降,有可能被系統收回。在這裏保存的數據,應該在 onResume裏讀出來,注意:這個方法裏作的事情時間要短,由於下一個activity不會等到這個方法完成才啓動 。
onstop: 變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被調用方法了,多是外面類調用finish方法或者是系統爲了節省空間將它暫時性的幹掉,能夠用 isFinishing()來判斷它,若是你有一個Progress Dialog在線程中轉動,請在onDestroy裏把他cancel掉,否則等線程結束的時候,調用Dialog的cancel方法會拋異常的。
onPause,onstop, onDestroy,三種狀態下 activity都有可能被系統幹掉爲了保證程序的正確性,你要在onPause()裏寫上持久層操做的代碼,將用戶編輯的內容都保存到存儲介質上(通常 都是數據庫)。實際工做中由於生命週期的變化而帶來的問題也不少,好比你的應用程序起了新的線程在跑,這時候中斷了,你還要去維護那個線程,是暫停仍是殺 掉仍是數據回滾,是吧?由於Activity可能被殺掉,因此線程中使用的變量和一些界面元素就千萬要注意
1三、讓Activity變成一個窗口:Activity屬性設定
你只須要設置一下Activity的主題就能夠了在AndroidManifest.xml 中定義 Activity的地方一句話: Xml代碼 android :theme="@android :style/Theme.Dialog" android:theme="@android :style/Theme.Dialog" 這就使你的應用程序變成對話框的形式彈出來了,或者 Xml代碼 android:theme="@android :style/Theme.Translucent" android:theme="@android :style/Theme.Translucent
1四、後臺的Activity被系統回收怎麼辦:(onSaveInstanceState )
當你的程序中某一個Activity A 在運行時中,主動或被動地運行另外一個新的Activity B 這個時候A會執行
Java代碼
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
public void onSaveInstanceState(Bundle outState) {
B 完成之後又會來找A, 這個時候就有兩種狀況,一種是A被回收,一種是沒有被回收,被回 收的A就要從新調用onCreate()方法,不一樣於直接啓動的是這回 onCreate()裏是帶上參數 savedInstanceState,沒被收回的就仍是onResume就行了。 savedInstanceState是一個Bundle對象,你基本上能夠把他理解爲系統幫你維護的一個Map對象。在onCreate()裏你可能會用到它,若是正常啓動onCreate就不會有它,因此用的時候要判斷一下是否爲空
Java代碼
if(savedInstanceState !=null){
long id =savedInstanceState.getLong("id");
}
if(savedInstanceState !=null){ 就像官方的Notepad教程 裏的狀況,你正在編輯某一個note,忽然被中斷,那麼就把這個note的id記住,再起來的時候就能夠根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不須要保存什麼,好比你的界面就是讀取一個列表,那就不須要特殊記住什麼,哦, 沒準你須要記住滾動條的位置.
1五、四 調用與被調用:咱們的通訊使者Intent
要 說Intent了,Intent就是這個這個意圖,應用程序間Intent進行交流,打個電話啦,來個電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部分,大大提升了組件的複用性,好比你要在你的應用程序中點擊按鈕,給某人打電話
Java代碼 :
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+ number));
startActivity(intent);
扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程序,打出來電話。什麼讀聯繫人,發短信啊,郵件啊,通通只須要扔出intent就行了,這個部分設計地確實很好啊。 那Intent經過什麼來告訴系統須要誰來接受他呢? 一般使用Intent有兩種方法,第一種是直接說明須要哪個類來接收代碼以下:
Java代碼
Intent intent = new Intent(this,MyActivity.class);
intent.getExtras().putString("id","1");
startActivity(intent);
第一種方式很明顯,直接指定了MyActivity爲接受者,而且傳了一些數據給MyActivity,在MyActivity裏能夠用getIntent()來的到這個intent和數據
第二種就須要先看一下AndroidMenifest中的intentfilter的配置
Xml代碼
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter> 這裏面配置用到了action, data, category這些東西,那麼聰明的你必定想到intent裏也會有這些東西,而後一匹配不就找到接收者了嗎?
16.listview你是怎麼優化的
17,IPC及原理
IPC是內部進程通訊的簡稱, 是共享"命名管道"的資源。Android中的IPC機制是爲了讓Activity和Service之間能夠隨時的進行交互,故在Android中該機制,只適用於Activity和Service之間的通訊,相似於遠程方法調用,相似於C/S模式的訪問。經過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理
18.Android多線程
19.Android爲何要設計4大組件,他們之間的聯繫
主要是爲了實現MVC模式
20、DDMS與TraceView的區別?
DDMS是一個程序執行查看器,在裏面你能夠看見線程和堆棧等信息,TraceView是程序性能分析器
2一、.在Java中如何引入C語言
能夠用JNI接口來實現
2二、Android國際化與本地化
internationalization (國際化)簡稱 i18n,由於在i和n之間還有18個字符,localization(本地化 ),簡稱L10n。 通常說明一個地區的語言時,用 語言_地區的形式,如 zh_CN, zh_TW. 各國語言縮寫 http://www.loc.gov/standards/iso639-2/php/code_list.php 國家和地區簡寫 http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html android 對i18n和L10n提供了很是好的支持。android沒有專門的API來提供國際化,而是經過對不一樣resource的命名來達到國際化,同時這種命名方法還可用於對硬件的區分,如不一樣的新視屏用不一樣的圖片
咱們以不一樣的local和region來作一次國際化,首先values表示默認的字符串,也即當Resource找不到匹配的資源時,默認使用values文件夾下的資源,其他 drawable等資源也是一樣的。 當命名這些文件夾的名字時,不一樣的選項用-分開,並且次序必須和 andorid 文檔中table http://developer.android.com/guide/topics/resources/resources-i18n.html#AlternateResources 文件夾的命名必須都是小寫字符,不然在一些大小敏感的文件系統中可能會出錯,若是你用大寫,eclipse的adt都會自動報錯。小寫字母r表示region的意思。 上圖命名了中文簡體和繁體以及默認選項,在strings.xml中除了字符串自己不同,xml中定義該字符串的名字,id都是同樣的。因此在代碼或者xml中引用該資源時,只要引用名字便可或者id便可,程序啓動時候Resource類回到相應的目錄下去尋找正確的字符串(資源) 經過在Settings中設置locale& Text 咱們可讓Resource類來選擇相應文件夾下的內容, 選擇英語時候結果以下,也即選擇了 values下的strings.xml 選擇 chinese(china)時,也即選了 values-zh-rcn目錄下的strings.xml 選擇 chinese(taiwan)時,也即選了 values-zh-rtw目錄下的strings.xml 其他手機的選項,像屏幕的像素等均可以創建相應得目錄
2三、在eclipse的工程中,res目錄有默認幾項resource,如 drawable, layout,menu,values 其他還有哪些?
res/anim/ 用來放置動畫
res/xml/ 用來放置style theme等xml定義。
res/raw/ 用來放置data數據
2四、Android經常使用的控件
單選框(RadioButton與RadioGroup):
RadioGroup用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。 事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener實例做爲參數傳入。
多選框(CheckBox): 每一個多選框都是獨立的,能夠經過迭代全部的多選框,而後根據其狀態是否被選中在獲取其值。 事件:setOnCheckChangeListener()處理多選框被選擇事件。把CompoundButton.OnCheckedChangeListener實例做爲參數傳入
下拉列表框(Spring): Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());獲取下拉列表框的值。 事件:setOnItemSelectedListener(),處理下拉列表框被選擇事件把AdapterView.OnItemSelectedListener實例做爲參數傳入;
拖動條(SeekBar): SeekBar.getProgress()獲取拖動條當前值 事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener實例做爲參數傳入。
菜單(Menu): 重寫Activity的onCreatOptionMenu(Menu menu)方法,該方法用於建立選項菜單,當用戶按下手機的"Menu"按鈕時就會顯示建立好的菜單,在onCreatOptionMenu(Menu Menu)方法內部能夠調用Menu.add()方法實現菜單的添加。 重寫Activity的onMenuItemSelected()方法,該方法用於處理菜單被選擇事件。
進度對話框(ProgressDialog): 建立並顯示一個進度對話框:ProgressDialog.show(ProgressDialogActivity.this,"請稍等","數據正在加載中....",true); 設置對話框的風格:setProgressStyle() ProgressDialog.STYLE_SPINNER 旋轉進度條風格(爲默認風格) ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格
2五、Android系統架構
一、應用程序. Android會同一系列核心應用程序包一塊兒發佈,該應用程序包包括email客戶端,SMS短消息程序,日曆,地圖,瀏覽器,聯繫人管理程序等。全部的應用程序都是使用JAVA語言編寫的。
2.應用框架: 開發人員也能夠徹底訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序均可以發佈它的功能塊而且任何其它的應用程序均可以使用其所發佈的功能塊(不過得遵循框架的安全性限制)。一樣,該應用程序重用機制也使用戶能夠方便的替換程序組件。 隱藏在每一個應用後面的是一系列的服務和系統, 其中包括;
* 豐富而又可擴展的視圖(Views),能夠用來構建應用程序, 它包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。
* 內容提供器(Content Providers)使得應用程序能夠訪問另外一個應用程序的數據(如聯繫人數據庫), 或者共享它們本身的數據
* 資源管理器(Resource Manager)提供 非代碼資源的訪問,如本地字符串,圖形,和佈局文件( layout files )。 * 通知管理器 (Notification Manager) 使得應用程序能夠在狀態欄中顯示自定義的提示信息。
* 活動管理器( Activity Manager) 用來管理應用程序生命週期並提供經常使用的導航回退功能。
三、系統運行庫
1)程序庫 Android 包含一些C/C++庫,這些庫能被Android系統中不一樣的組件使用。它們經過 Android 應用程序框架爲開發者提供服務。如下是一些核心庫:
* 系統 C 庫 - 一個從 BSD 繼承來的標準 C 系統函數庫( libc ), 它是專門爲基於 embedded linux 的設備定製的。
* 媒體庫 - 基於 PacketVideo OpenCORE;該庫支持多種經常使用的音頻、視頻格式回放和錄製,同時支持靜態圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
* Surface Manager - 對顯示子系統的管理,而且爲多個應用程序提 供了2D和3D圖層的無縫融合。
* LibWebCore - 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。
* SGL - 底層的2D圖形引擎
* 3D libraries - 基於OpenGL ES 1.0 APIs實現;該庫能夠使用硬件 3D加速(若是可用)或者使用高度優化的3D軟加速。
* FreeType -位圖(bitmap)和矢量(vector)字體顯示。
* SQLite - 一個對於全部應用程序可用,功能強勁的輕型關係型數據庫引擎。 2)Android 運行庫 Android 包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數功能。 每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。Dalvik被設計成一個設備能夠同時高效地運行多個虛擬系統。 Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該格式文件針對小內存使用作了優化。同時虛擬機是基於寄存器的,全部的類都經由JAVA編譯器編譯,而後經過SDK中 的 「dx」 工具轉化成.dex格式由虛擬機執行。 Dalvik虛擬機依賴於linux內核的一些功能,好比線程機制和底層內存管理機制
4)Linux內核
Android 的核心繫統服務依賴於 Linux 2.6 內核,如安全性,內存管理,進程管理, 網絡協議棧和驅動模型。 Linux 內核也同時做爲硬件和軟件棧之間的抽象層
2六、開機自啓動程序
2七、什麼是Activity?
通俗一點說Activity就是一個界面,這個界面裏面能夠放置各類控件。Activity的界面也是用xml文件表示的,放置在res->layout下面。每生成一個新的Activity後,咱們須要在AndroidManifest.xml中註冊一下這個activity
2八、 兩個Activity之間跳轉時必然會執行的是哪幾個方法。
onCreate() //在Activity生命週期開始時調用 onRestoreInstanceState()//用來恢復UI狀態 onReStart()//當Activity從新啓動時調用 onStart()//Activity對用戶即將可見時調用 onResume()//當Activity與用戶交互時,繪製界面 onSaveInstanceState()//activity即將移出棧頂保留UI狀態時調用 onPause()//暫停當前活動activity,提交持久數據的改變,中止動畫和其餘佔用CPU資源的東西,因爲下一個activity在這個方法返回以前不會resume,因此這個方法的代碼執行要快。 onStop()//activity再也不可見時調用 onDestroy()//在Activity銷燬錢被調用的最後一個方法。
2九、橫豎屏切換時候Activity的生命週期。
一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
二、設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次
三、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法
30、 如何退出Activity?如何安全退出已調用多個Activity的Application?
用finish()方法退出activity.
在2.1以前,能夠使用ActivityManager的restartPackage方法。 它能夠直接結束整個應用。在使用時須要權限android.permission.RESTART_PACKAGES。
在2.2,這個方法失效了,可以使用如下幾我的工的方法
一、記錄打開的Activity: 每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。
二、發送特定廣播: 在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可
三、遞歸退出:在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉
爲了編程方便,最好定義一個Activity基類,處理這些共通問題
在2.1以前,能夠使用ActivityManager的restartPackage方法。 它能夠直接結束整個應用。在使用時須要權限android.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。 但是,在2.2,這個方法失效了。在2.2添加了一個新的方法,killBackground Processes(),須要權限 android.permission.KILL_BACKGROUND_PROCESSES。惋惜的是,它和2.2的restartPackage同樣,根本起不到應有的效果。 另外還有一個方法,就是系統自帶的應用程序管理裏,強制結束程序的方法,forceStopPackage()。它須要權限android.permission.FORCE_STOP_PACKAGES。而且須要添加android:sharedUserId="android.uid.system"屬性。一樣惋惜的是,該方法是非公開的,他只能運行在系統進程,第三方程序沒法調用。 由於須要在Android.mk中添加LOCAL_CERTIFICATE := platform。 而Android.mk是用於在Android源碼下編譯程序用的。 從以上能夠看出,在2.2,沒有辦法直接結束一個應用,而只能用本身的辦法間接辦到。 現提供幾個方法,供參考: 一、拋異常強制退出: 該方法經過拋異常,使程序Force Close。 驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。 二、記錄打開的Activity: 每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。 三、發送特定廣播: 在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。 四、遞歸退出 在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。 除了第一個,都是想辦法把每個Activity都結束掉,間接達到目的。可是這樣作一樣不完美。你會發現,若是本身的應用程序對每個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。但至少,咱們的目的達到了,並且沒有影響用戶使用。爲了編程方便,最好定義一個Activity基類,處理這些共通問題
3一、 兩個Activity之間怎麼傳遞數據?
在Intent的對象中增長要傳遞的參數既可。 在Intent的對象的請求中加入鍵值對,對象名字.putExtra("鍵值對的名字","鍵值對的值"); 在另外一個Activity中將Intent請求中的數據取出來: Intent intent=getIntent();// String value = intent.getStringExtra("testIntent");//將testIntent對應的值賦值給value
3二、 怎麼在啓動一個Activity時就啓動一個service?
將啓動Service的語句放在onCreate()方法中。
3三、同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?
能夠放在不一樣的Task中。須要爲不一樣的activity設置不一樣的taskaffinity屬性,啓動activity的Intent須要包含FLAG_ACTIVITY_NEW_TASK標記
3四、 Activity怎麼和service綁定,怎麼在activity中啓動本身對應的service?
一、Activity能進行綁定得益於Service的接口。爲了支持Service的綁定,實現onBind方法。
二、Service和Activity的鏈接能夠用ServiceConnection來實現。你須要實現一個新的ServiceConnection,重寫onServiceConnected和onServiceDisconnected方法,一旦鏈接創建,你就能獲得Service實例的引用。
三、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯式或隱式)和一個你實現了的ServiceConnection實例
35 、 什麼是Service以及描述下它的生命週期。
Android Service是運行在後臺的代碼,不能與用戶交互,能夠運行在本身的進程,也能夠運行在其餘應用程序進程的上下文裏。須要經過某一個Activity或者其餘Context對象來調用, Context.startService() 和 Context.bindService()。 若是在Service執行耗時的操做須要啓動一個新線程來執行。 Android Service只繼承了onCreate(),onStart(),onDestroy()三個方法,當咱們第一次啓動Service時,前後調用了onCreate(),onStart()這兩個方法,當中止Service時,則執行onDestroy()方法,這裏須要注意的是,若是Service已經啓動了,當咱們再次啓Service時,不會在執行onCreate()方法,而是直接執行onStart()方法
3六、 Service有哪些啓動方法,有什麼區別,怎樣停用Service?
兩種啓動Service的方式Context.startService() 和 Context.bindService()。 區別爲 Context.startService():Service會經歷onCreate -> onStart(若是Service尚未運行,則android先調用onCreate()而後調用onStart();若是Service已經運行,則只調用onStart(),因此一個Service的onStart方法可能會重複調用屢次 );stopService的時候直接onDestroy,若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啓動起來後能夠經過stopService關閉Service Context.bindService():Service會經歷onCreate() -> onBind(),onBind將返回給客戶端一個IBind接口實例,IBind容許客戶端回調服務的方法,好比獲得Service運行的狀態或其餘操做。這個時候把調用者(Context,例如Activity)會和Service綁定在一塊兒,Context退出了,Srevice就會調用onUnbind -> onDestroyed相應退出,所謂綁定在一塊兒就共存亡了 。 停用service使用 context.stopService()
3七、 不用service,B頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?
a 使用startActivityForResult() 方法開啓b,b類結束時調用finish();
a類的intent有一個子activity結束事件onActivityResult(),在事件裏繼續播放音樂
3八、 什麼是IntentService?有何優勢?
IntentService也是一個Service,是Service的子類, IntentService和Service有所不一樣,經過Looper和Thread來解決標準Service中處理邏輯的阻塞問題。 優勢:Acitivity的進程,當處理Intent的時候,會產生一個對應的Service Android的進程處理器如今會盡量的不kill掉你 很是容易使用 (看本身寫的日曆中IntentService的應用)
3九、 何時使用Service?
好比播放多媒體的時候用戶啓動了其餘Activity這個時候程序要在後臺繼續播放,好比檢測SD卡上文件的變化,再或者在後臺記 錄你地理信息位置的改變等等,總之服務嘛,老是藏在後頭的。
40、 請描述一下Intent 和 Intent Filter
ntent在Android中被翻譯爲"意圖",熟語來說就是目的,他們是三種應用程序基本組件—activity,service和broadcast receiver之間互相激活的手段。 在調用Intent名稱時使用ComponentName也就是類的全名時爲顯示調用。這種方式通常用於應用程序的內部調用,由於你不必定會知作別人寫的類的全名。咱們來看看隱式Intent怎麼用? 首先咱們先配置咱們的Activity的Intent Filter <intent-filter> <action android:name="com.example.project.SHOW_CURRENT" /> </intent-filter> 這樣在調用的時候指定Intent的action,系統就是自動的去對比是哪一個intent-filter符合咱們的Activity,找到後就會啓動Activity。 一個intent filter是IntentFilter類的實例, 可是它通常不出如今代碼中,而是出如今android Manifest文件中, 以<intent-filter>的形式. (有一個例外是broadcast receiver的intent filter是使用Context.registerReceiver()來動態設定的, 其intent filter也是在代碼中建立的.) 一個filter有action, data, category等字段. 一個隱式intent爲了能被某個intent filter接受, 必須經過3個測試. 一個intent爲了被某個組件接受, 則必須經過它全部的intent filter中的一個
4一、Intent傳遞數據時,能夠傳遞哪些類型數據?
Intent間傳送數據通常有兩種經常使用的辦法:
1.extra 2.data. extra能夠用Intent.putExtra放入數據。新啓動的Activity可用Intent.getExtras取出來Bundle, 而後用Bundles.getLong, getInt, getBoolean, getString等函數來取放進入的值。 而data則是傳輸url。url能夠是指咱們熟悉的http, ftp 等網絡地址, 也能夠指content來指向ContentProvider提供的資源。Intent.setData能夠放入數據,Intent.getData能夠取出數據
4二、 說說Activity,Intent,Service是什麼關係 。
一個Activity一般是一個單獨的屏幕,每個Activity都被實現爲一個單獨的類,這些類都是從Activity基類中繼承來的,Activity類會顯示由視圖控件組成的用戶接口,並對視圖控件的事件作出響應。 Intent的調用是用來進行架構屏幕之間的切換的。Intent是描述應用想要作什麼。Intent數據結構中兩個最重要的部分是動做和動做對應的數據,一個動做對應一個動做數據。 Android Service是運行在後臺的代碼,不能與用戶交互,能夠運行在本身的進程,也能夠運行在其餘應用程序進程的上下文裏。須要經過某一個Activity或者其餘Context對象來調用。 Activity跳轉到Activity,Activity啓動Service,Service打開Activity都須要Intent代表跳轉的意圖,以及傳遞參數,Intent是這些組件間信號傳遞的承載者。
4三、 請描述一下Broadcast Receiver。
Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地域變換、電量不足、來電來信等。程序也能夠播放一個廣播。程序能夠有任意數量的 broadcast receivers來響應它以爲重要的通知。broadcast receiver能夠經過多種方式通知用戶:啓動activity、使用NotificationManager、開啓背景燈、振動設備、播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就能夠點它打開看通知內容。一般咱們的某個應用或系統自己在某些事件(電池電量不足、來電來短信)來臨時會廣播一個Intent出去,咱們能夠利用註冊一個Broadcast Receiver來監聽到這些Intent並獲取Intent中的數據。
4四、在manifest和代碼中如何註冊和使 用 broadcast receiver 。
1)在AndroidManifest.xml中註冊
<receiver android:name="Receiver1">
<intent-filter>
<!-- 和Intent中的action對應 -->
<action android:name="com.forrest.action.mybroadcast"/>
</intent-filter>
</receiver>
2)在代碼中註冊
1. IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和廣播中Intent的action對應
2. MyBroadcastReceiver br = new MyBroadcastReceiver();
3. registerReceiver(new MyBroadcastReceiver(), filter);
4五、 請介紹下ContentProvider是如何實現數據共享的。
ContentProvider是經過提供Uri來實現數據共享
4六、 請介紹下Android的數據存儲方式。
Android提供了5種方式存儲數據:
使用SharedPreferences存儲數據;
文件存儲數據;
SQLite數據庫存儲數據;
使用ContentProvider存儲數據;
網絡存儲數據
一:使用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
一、ContentProvider簡介 當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法,就能夠向其餘應用共享其數據。雖然使用其餘方法也能夠對外共享數據,但數據訪問方式會因數據存儲的方式而不一樣,如:採用文件方式對外共享數據,須要進行文件操做讀寫數據;採用sharedpreferences共享數據,須要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的好處是統一了數據訪問方式。
二、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")
三、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方法,來操做數據
4七、 爲何要用ContentProvider?它和sql的實現上有什麼差異?
使用ContentProvider能夠將數據共享給其餘應用,讓除本應用以外的應用也能夠訪問本應用的數據。它的底層是用SQLite數據庫實現的,因此其對數據作的各類操做都是以Sql實現,只是在上層提供的是Uri
4八、 請介紹下Android中經常使用的五種佈局
4九、 談談UI中, Padding和Margin有什麼區別?
Padding是文字相對於邊框,而Margin是邊框相對於父窗體
50、 請解釋下在單線程模型中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
Message消息,理解爲線程間交流的信息,處理數據後臺線程須要更新UI,則發送Message內含一些數據給UI線程。
2. Handler Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的執行處理。後臺線程就是經過傳進來的 Handler對象引用來sendMessage(Message)。而使用Handler,須要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操做內容,例如Update UI。一般須要子類化Handler來實現handleMessage方法。
3. Message Queue Message Queue消息隊列,用來存放經過Handler發佈的消息,按照先進先出執行。 每一個message queue都會有一個對應的Handler。Handler會向message queue經過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾並按先進先出執行。但經過這兩種方法發送的消息執行的方式略有不一樣:經過sendMessage發送的是一個message對象,會被 Handler的handleMessage()函數處理;而經過post方法發送的是一個runnable對象,則會本身執行。
4. Looper Looper是每條線程裏的Message Queue的管家。Android沒有Global的Message Queue,而Android會自動替主線程(UI線程)創建Message Queue,但在子線程裏並無創建Message Queue。因此調用Looper.getMainLooper()獲得的主線程的Looper不爲NULL,但調用Looper.myLooper() 獲得當前線程的Looper就有可能爲NULL。對於子線程使用Looper,API Doc提供了正確的使用方法:這個Message機制的大概流程:
1. 在Looper.loop()方法運行開始後,循環地按照接收順序取出Message Queue裏面的非NULL的Message。
2. 一開始Message Queue裏面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函數裏面設置了那個Message對象的target屬性是當前的Handler對象。隨後Looper取出了那個Message,則調用 該Message的target指向的Hander的dispatchMessage函數對Message進行處理。在dispatchMessage方法裏,如何處理Message則由用戶指定,三個判斷,優先級從高到低: 1) Message裏面的Callback,一個實現了Runnable接口的對象,其中run函數作處理工做; 2) Handler裏面的mCallback指向的一個實現了Callback接口的對象,由其handleMessage進行處理; 3) 處理消息Handler對象對應的類繼承並實現了其中handleMessage函數,經過這個實現的handleMessage函數處理消息。 因而可知,咱們實現的handleMessage方法是優先級最低的!
3. Handler處理完該Message (update UI) 後,Looper則設置該Message爲NULL,以便回收! 在網上有不少文章講述主線程和其餘子線程如何交互,傳送信息,最終誰來執行處理信息之類的,我的理解是最簡單的方法——判斷Handler對象裏面的Looper對象是屬於哪條線程的,則由該線程來執行
1. 當Handler對象的構造函數的參數爲空,則爲當前所在線程的Looper;
2. Looper.getMainLooper()獲得的是主線程的Looper對象,Looper.myLooper()獲得的是當前線程的Looper對象
5一、 AIDL的全稱是什麼?如何工做?能處理哪些類型的數據?
AIDL是一種接口定義語言,用於約束兩個進程間的通訊規則,供編譯器生成代碼,實現Android設備上的進程間通訊。 進程之間的通訊信息首先會被轉換成AIDL協議消息,而後發送給對方,對方受到AIDL協議消息後再轉換成相應的對象。 AIDL支持的類型包括Java基礎類型和String,List,Map,CharSequence,若是使用自定義類型,必須實現Parcelable接口
5二、 請解釋下Android程序運行時權限與文件系統權限的區別。
運行時 Dalvik( android受權) 文件系統 linux 內核受權
5三、系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?
經過直接發送Uri把參數帶過去,或者經過manifest裏的intentfilter裏的data屬性
在action 賦值爲」android.intent.action.VIEW「 時可接收以下scheme 爲"http" 等等類型的data 。因此突發奇想,啓動該程序後,指定action 及Uri ,即訪問指定網頁
5四、對多線程的運用和理解,及多線程之間handle的傳值
5五、 對android虛擬機的理解,包括內存管理機制垃圾回收機制。
5六、 Framework工做方式及原理,Activity是如何生成一個view的,機制是什麼。
5七、 android自己的一些限制,好比apk包大小限制,讀取大文件時的時間
5八、 如何加載的音樂信息,如何改善其效率。
Android系統提供了MediaScanner,MediaProvider,MediaStore等接口,而且提供了一套數據庫表格,經過Content Provider的方式提供給用戶。當手機開機或者有SD卡插拔等事件發生時,系統將會自動掃描SD卡和手機內存上的媒體文件,如audio,video,圖片等,將相應的信息放到定義好的數據庫表格中。 改善效率能夠從界面須要查詢必備數據,不須要的不進行查詢
5九、 ListView如何提升其效率?
答:一、若是自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null,若是爲null就建立contentView並返回,若是不爲null則直接使用。在這個方法中儘量少建立view。 二、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,能夠達到圖像數據異步加載的效果。 三、若是listview須要顯示的item不少,就要考慮分頁加載。好比一共要顯示100條或者更多的時候,咱們能夠考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條
60、 啓動應用後,改變系統語言,應用的語言會改變麼?
不會
6一、啓動一個程序,能夠主界面點擊圖標進入,也能夠從一個程序中跳轉過去,兩者有什麼區別?
從主界面啓動一個應用程序是經過快捷方式直接調用mainActivity啓動的,從其餘應用程序調用須要隱式的經過Action或者在Intent中須要使用setClass(),且要寫明包路徑
62 Android程序與Java程序的區別?
android程序是Java編寫的,但程序使用的android開發的API,就是andriod的庫。
6三、Android中Task任務棧的分配。
6四、 在Android中,怎麼節省內存的使用,怎麼主動回收內存?
6五、不一樣工程中的方法是否能夠相互調用?
6六、 在Android中是如何實現判斷區分通話記錄中的電話狀態,去電,來電、未接來電?
6七、 dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念
DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的 Dalvik虛擬機實例.而每個DVM都是在Linux中的一個進程,因此說能夠認爲是同一個概念.
6八、如何判斷是否有SD卡?
在程序中訪問SDCard,你須要申請訪問SDCard的權限
在AndroidManifest.xml中加入訪問SDCard的權限以下: <!-- 在SDCard中建立與刪除文件權限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 往SDCard寫入數據權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) Environment.getExternalStorageState()方法用於獲取SDCard的狀態,若是手機裝有SDCard,而且能夠進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED
6九、im卡的EF 文件有何做用
SIM卡的文件系統有本身規範,主要是爲了和手機通信,SIM卡自己能夠有本身的操做系統,EF就是做存儲並和手機通信用的
70、 Linux中跨進程通訊的幾種方式
7一、談對Android NDK的理解。
Android NDK是一套工具,容許Android應用開發者嵌入從C、C++源代碼文件編譯來的本地機器代碼到各自的應用軟件包中。
7二、 談談Android的優勢和不足之處
7三、 什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎
嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統。主要用於工業控制、 軍事設備、 航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統。又可分爲軟實時和硬實時兩種,而android是基於linux內核的,所以屬於軟實時
7四、 Android UI中的View如何刷新。
通常只是但願在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法便可。系統會自動調用 View的onDraw()方法
7五、 簡單描述下Android 數字簽名。
7六、 什麼是ANR 如何避免它
答:ANR:Application Not Responding。在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應,當用戶操做的在5s內應用程序沒能作出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出現應用程序無響應對話框,這既是ANR。 避免方法:Activity應該在它的關鍵生命週期方法(如onCreate()和onResume())裏儘量少的去作建立操做。潛在的耗時操做,例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。主線程應該爲子線程提供一個Handler,以便完成時可以提交給主線程
在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列狀況時,Android就會顯示ANR對話框了: 對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 意向接受器(intentReceiver)超過10秒鐘仍未執行完畢 Android應用程序徹底運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,須要消耗大量時間的操做都會引起ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。 所以,任何運行在主線程中的方法,都要儘量的只作少許的工做。特別是活動生命週期中的重要方法如onCreate()和 onResume()等更應如此。潛在的比較耗時的操做,如訪問網絡和數據庫;或者是開銷很大的計算,好比改變位圖的大小,須要在一個單獨的子線程中完成(或者是使用異步請求,如數據庫操做)。但這並不意味着你的主線程須要進入阻塞狀態已等待子線程結束 -- 也不須要調用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程爲子線程提供一個句柄(Handler),讓子線程在即將結束的時候調用它(xing:能夠參看Snake的例子,這種方法與之前咱們所接觸的有所不一樣)。使用這種方法涉及你的應用程序,可以保證你的程序對輸入保持良好的響應,從而避免由於輸入事件超過5秒鐘不被處理而產生的ANR。這種實踐須要應用到全部顯示用戶界面的線程,由於他們都面臨着一樣的超時問題
7七、handler機制的原理
Andriod提供了Handler和Looper來知足線程間的通訊.Handler先進先出原則.Looper類用來管理特定線程內對象之間的消息交換(Message Exchange).
1)Looper: 一個線程能夠產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列).
2)Handler:你能夠構造Handler對象來與Looper溝通,以便push新消息到Message Queue裏;或者接收Looper從Message Queue取出)所送來的消息.
android中線程與線程,進程與進程之間如何通訊。 線程通訊使用Handler,
7八、 android中有哪幾種解析xml的類,官方推薦哪一種?以及它們的原理和區別
DOM優勢:
1. XML樹在內存中完整存儲,所以能夠直接修改其數據和結構。
2.能夠經過該解析器隨時訪問XML樹中的任何一個節點。
3.DOM解析器的API在使用上也相對比較簡單。 缺點: 若是XML文檔體積比較大時,將文檔讀入內存是很是消耗系統資源的。 使用場景: DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點的集合。這個層次結構容許開發人員在樹中尋找特定信息。分析該結構一般須要加載整個文檔和構造層次結構,而後才能進行任何工做。DOM是基於對象層次結構的。
SAX解析 優勢:
SAX 對內存的要求比較低,由於它讓開發人員本身來決定所要處理的標籤。特別是當開發人員只須要處理文檔中所包含的部分數據時,SAX 這種擴展能力獲得了更好的體現。 缺點: 用SAX方式進行XML解析時,須要順序執行,因此很難訪問到同一文檔中的不一樣數據。此外,在基於該方式的解析編碼過程也相對複雜。 使用場景: 對於含有數據量十分巨大,而又不用對文檔的全部數據進行遍歷或者分析的時候,使用該方法十分有效。該方法不用將整個文檔讀入內存,而只需讀取到程序所需的文檔標籤處便可
7九、NotifactionManager使用原理
1. 經過getSystemService方法得到一個NotificationManager對象。 2. 建立一個Notification對象。每個Notification對應一個Notification對象。在這一步須要設置顯示在屏幕上方狀態欄的通知消息、通知消息前方的圖像資源ID和發出通知的時間。通常爲當前時間。 3. 因爲Notification能夠與應用程序脫離。也就是說,即便應用程序被關閉,Notification仍然會顯示在狀態欄 中。當應用程序再次啓動後,又能夠從新控制這些Notification。如清除或替換它們。所以,須要建立一個PendingIntent對象。該對象由Android系統負責維護,所以,在應用程序關閉後,該對象仍然不會被釋放。 4. 使用Notification類的setLatestEventInfo方法設置Notification的詳細信息。 5. 使用NotificationManager類的notify方法顯示Notification消息。在這一步須要指定標識Notification的惟一ID。這個ID必須相對於同一個NotificationManager對象是惟一的,不然就會覆蓋相同ID的Notificaiton
80、 activityy的啓動模式有哪些?是什麼含義?
答:在android裏,有4種activity的啓動模式,分別爲:
「standard」 (默認)
「singleTop」
「singleTask」
「singleInstance」
它們主要有以下不一樣:
1. 如何決定所屬task 「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。 若是提供了FLAG_ACTIVITY_NEW_TASK參數,會啓動到別的task裏。 「singleTask」和」singleInstance」老是把activity做爲一個task的根元素,他們不會被啓動到一個其餘task裏。
2. 是否容許多個實例 「standard」和」singleTop」能夠被實例化屢次,而且存在於不一樣的task中,且一個task能夠包括一個activity的多個實例; 「singleTask」和」singleInstance」則限制只生成一個實例,而且是task的根元素。 singleTop要求若是建立intent的時候棧頂已經有要建立 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。
3. 是否容許其它activity存在於本task內 「singleInstance」獨佔一個task,其它activity不能存在那個task裏;若是它啓動了一個新的activity,無論新的activity的launch mode 如何,新的activity都將會到別的task裏運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。 而另外三種模式,則能夠和其它activity共存。
4. 是否每次都生成新實例 「standard」對於沒一個啓動Intent都會生成一個activity的新實例; 「singleTop」的activity若是在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,不然,生成該activity的實例。 好比如今task棧元素爲A-B-C-D(D在棧頂),這時候給D發一個啓動intent,若是D是 「standard」的,則生成D的一個新實例,棧變爲A-B-C-D-D。 若是D是singleTop的話,則不會生產D的新實例,棧狀態仍爲A-B-C-D 若是這時候給B發Intent的話,無論B的launchmode是」standard」 仍是 「singleTop」 ,都會生成B的新實例,棧狀態變爲A-B-C-D-B。 「singleInstance」是其所在棧的惟一activity,它會每次都被重用。 「singleTask」若是在棧頂,則接受intent,不然,該intent會被丟棄,可是該task仍會回到前臺。 當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法 若是收到intent生成一個activity實例,那麼用戶能夠經過back鍵回到上一個狀態;若是是已經存在的一個activity來處理這個intent的話,用戶不能經過按back鍵返回到這以前的狀態
8一、 什麼狀況會致使Force Close ?如何避免如何避免如何避免如何避免?可否捕獲致使其的異常
答:程序出現異常,好比nullpointer。 避免:編寫程序時邏輯連貫,思惟縝密。能捕獲異常,在logcat中能看到異常信息
8二、請介紹下ContentProvider是如何實現數據共享的?
一個程序能夠經過實現一個Content provider的抽象接口將本身的數據徹底暴露出去,並且Content providers是以相似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,經過它可讓全部的應用程序訪問到,這也是應用程序之間惟一共享數據的方法。 要想使應用程序的數據公開化,可經過2種方法:建立一個屬於你本身的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型而且有寫入Content provider的權限。 如何經過一套標準及統一的接口獲取其餘應用程序暴露的數據? Android提供了ContentResolver,外界的程序能夠經過ContentResolver接口訪問ContentProvider提供的數據
8三、Thread 和service的區別
答:servie是系統的組件,它由系統進程託管(servicemanager);它們之間的通訊相似於client和server,是一種輕量級的ipc通訊,這種通訊的載體是binder,它是在linux層交換信息的一種ipc。而thread是由本應用程序託管。 1). Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。能夠用 Thread 來執行一些異步的操做。 2). Service:Service 是android的一種機制,當它運行的時候若是是Local Service,那麼對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。若是是Remote Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上。 既然這樣,那麼咱們爲何要用 Service 呢?其實這跟 android 的系統機制有關,咱們先拿 Thread 來講。Thread 的運行是獨立於 Activity 的,也就是說當一個 Activity 被 finish 以後,若是你沒有主動中止 Thread 或者 Thread 裏的 run 方法沒有執行完畢的話,Thread 也會一直執行。所以這裏會出現一個問題:當 Activity 被 finish 以後,你再也不持有該 Thread 的引用。另外一方面,你沒有辦法在不一樣的 Activity 中對同一 Thread 進行控制。 舉個例子:若是你的 Thread 須要不停地隔一段時間就要鏈接服務器作某種同步的話,該 Thread 須要在 Activity 沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 裏面控制以前建立的 Thread。所以你便須要建立並啓動一個 Service ,在 Service 裏面建立、運行並控制該 Thread,這樣便解決了該問題(由於任何 Activity 均可以控制同一 Service,而系統也只會建立一個對應 Service 的實例)。 所以你能夠把 Service 想象成一種消息服務,而你能夠在任何有 Context 的地方調用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也能夠在 Service 裏註冊 BroadcastReceiver,在其餘地方經過發送 broadcast 來控制它,固然這些都是 Thread 作不到的
8四、Android自己api並未聲明會拋出異常,那麼它在運行時有無可能會拋出runtime 異常
好比nullpointerException。我遇到過,好比textview.setText()時,textview沒有初始化。會致使程序沒法正常運行出現forceclose。打開控制檯查看logcat信息找出異常信息並修改程序
8五、IntentService有何優勢?
答:Acitivity的進程,當處理Intent的時候,會產生一個對應的Service; Android的進程處理器如今會盡量的不kill掉你;很是容易使用
8六、AIDL的全稱是什麼????如何工做?能處理哪些類型的數據?
答:全稱是:Android Interface Define Language 在Android中, 每一個應用程序均可以有本身的進程. 在寫UI應用的時候, 常常要用到Service. 在不一樣的進程中, 怎樣傳遞對象呢?顯然, Java中不容許跨進程內存共享. 所以傳遞對象, 只能把對象拆分紅操做系統能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,採用RMI的方式, 能夠經過序列化傳遞對象. 在Android中, 則採用AIDL的方式. 理論上AIDL能夠傳遞Bundle,實際上作起來卻比較麻煩。 AIDL(AndRoid接口描述語言)是一種藉口描述語言; 編譯器能夠經過aidl文件生成一段代碼,經過預先定義的接口達到兩個進程內部通訊進程的目的. 若是須要在一個Activity中, 訪問另外一個Service中的某個對象, 須要先將對象轉化成AIDL可識別的參數(多是多個參數), 而後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成本身須要的對象. AIDL的IPC的機制和COM或CORBA相似, 是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 若是要使用AIDL, 須要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class. AIDL的建立方法: AIDL語法很簡單,能夠用來聲明一個帶一個或多個方法的接口,也能夠傳遞參數和返回值。 因爲遠程調用的須要, 這些參數和返回值並非任何類型.下面是些AIDL支持的數據類型: 1. 不須要import聲明的簡單Java編程語言類型(int,boolean等) 2. String, CharSequence不須要特殊聲明 3. List, Map和Parcelables類型, 這些類型內所包含的數據成員也只能是簡單數據類型, String等其餘比支持的類型.
87. 如何將打開res aw目錄中的數據庫文件?
解答:在Android中不能直接打開res aw目錄中的數據庫文件,而須要在程序第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,而後再打開該數據庫文件。複製的基本方法是使用getResources().openRawResource方法得到res aw目錄中資源的 InputStream對象,而後將該InputStream對象中的數據寫入其餘的目錄中相應文件中。在Android SDK中能夠使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件
8八、Android引入廣播機制的用意?
答:a:從MVC的角度考慮(應用程序內) 其實回答這個問題的時候還能夠這樣問,android爲何要有那4大組件,如今的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大組件本質上就是爲了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制能夠方便幾大組件的信息和數據交互。 b:程序間互通消息(例如在本身的應用程序內監聽系統來電) c:效率上(參考UDP的廣播協議在局域網的方便性) d:設計模式上(反轉控制的一種應用,相似監聽者模式)
8九、1. Intent的幾種有關的啓動的方式有哪些
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文檔和具體跑下這樣你的記憶會更深入些
90、經過Intent傳遞一些二進制數據的方法有哪些
1). 使用Serializable接口實現序列化,這是Java經常使用的方法。
2). 實現Parcelable接口,這裏Android的部分類好比Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換數據也很常見的
9一、 能說下Android應用的入口點嗎?
真正的Android入口點是application的main,你能夠看下androidmanifest.xml的包含關係就清楚了。 能夠沒有Activity可是必須有Application
9二、 SQLite支持事務嗎 添加刪除如何提升性能?
SQLite做爲輕量級的數據庫,比MySQL還小,但支持SQL語句查詢,提升性能能夠考慮經過原始通過優化的SQL查詢語句方式處理
9三、你用過哪款Android手機,有哪些優勢和不足,相對於iPhone或Symbian又有哪哪些優缺點?
9四、 隱式顯式Intent的區別
顯式意圖 經過名字指明目標組件(這個組件名字字段component name field, 前面提到過, 有一個數值集)。既然組件名稱一般不爲其餘應用程序的開發者所瞭解,顯式意圖典型的被用做應用程序的內部消息-例如一個活動啓動一個附屬服務或姊妹活動。 隱式意圖 不命名目標組件(組件名稱字段爲空)。隱式意圖常常用來激活其餘應用程序的組件
--------------------------------------
GC是什麼? 爲何要有GC?
Gc是垃圾收集 gabage collection的意思 內存處理是編程人員最容易出現問題的地方,gc能夠達到自動處理內存 回收垃圾的做用 使java程序員不用擔憂內存管理問題 system.gc
XML包括哪些解釋技術,區別是什麼?
Sax dom
sleep()和wait()有什麼區別?
Sleep() 是線程類的方法 wait()是object類的方法
Sleep() 不會釋放對象鎖 到時自動恢復 wait()會釋放對象鎖 進入等待此對象的等待鎖定池 發出notify()方法後 才進入等待鎖定池準備對象鎖的獲取進入運行狀態
error和exception有什麼區別?
error表示恢復不是不可能可是及其困難的一種嚴重問題 不可能期望程序處理這樣的問題
Exception是一種設計或實現的問題 表示只要程序運行正常就不會出現的問題
談談final,finally,finalize的區別?
Final是修飾符 表示類不能被繼承 方法不能被重載,重寫 變量不能被修改等
Finally是異常處理時的一個不管如何都會被執行的程序塊
Finaliz方法是垃圾收集器刪除對象以前對這個對象調用的進行清理工做的方法
當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
能夠
當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞?
值傳遞
做用域public,private,protected,以及不寫時的區別
用最有效率的方法算出2乘以8等於幾 2《3
運行時異常與通常異常有何異
編譯器要求聲明並拋出通常異常 但沒必要聲明拋出運行時異常 由系統處理
垃圾回收的優勢和原理。並考慮2種回收機制
回收機制有分代複製垃圾回收 標記垃圾回收 和增量垃圾回收
描述一下JVM加載class文件的原理機制?
是由classloader和他的子類來實現的 他在運行時查找和裝入類文件的類
是否能夠從一個static方法內部發出對非static方法的調用?
不能
什麼是java序列化,如何實現java序列化?
序列化是一種處理對象流的機制 是爲了解決在對對象流進行讀寫操做時所引起的問題
使用serializeae關鍵字 使用一個輸出流構造一個對象流流對象 而後使用對象流對象的writeObject()就能夠將參數爲obj的對象寫出
Anonymous Inner Class(匿名內部類)是否能夠extends(繼承)其它類,是否能夠implements(實現)interface(接口)?
能夠
ArrayList和Vector的區別,HashMap和Hashtable的區別?
Vector線程安全 增加時漲一倍 arraylist漲一半
Hashtable線程安全 hashmap能夠用空值做爲鍵值
請寫一段程序實現冒泡排序法。
Public static maopao(int[] data){
Int temp;
For(int i=0;i<data.length-1;i++){
For(int j=i+1;j<data.length;j++){
If(data[i]<data[j])
Temp = data[i];
Data[i] = data[j];
Data[j] = temp;
}
}
Return data;
}
3、 問答題與編程技巧
activity、Service、BroadcastReceiver的做用(android)
Activity是安卓程序與用戶交互的窗口 是android構造塊中最基本的一種他須要爲保持各界面的狀態作不少持久化的事情,妥善管理聲明週期以及一些跳轉邏輯
Service 後臺服務於activity 封裝有一個完整的功能邏輯實現 接受上層指令 完成相關事務 定義好須要接受的intent 提供同步和異步的接口
BroadcastReceiver 接受一種或多中intent作觸發事件 接受相關消息 作一些簡單處理 轉換成一條notification 統一了android事件廣播模型
描述一個完整的Android activity lifecycle
onCreate() onStart() onRemuse() onPause() onStop() onDestory()
顯式intent和隱式intent的區別是什麼(android)
顯式明確指出了須要激活的組件 隱式沒有 須要系統從intentfilter裏挑選合適的組件
滿二叉樹和徹底二叉樹的區別?
Android中線程同步的方法
Synchronized關鍵字與wait() notify()或者 join() interrupt()
------------------------------
1.簡單的設計模式:
單例模式:在系統中一個類只有一個實例。 分爲懶漢模式和餓漢模式。餓漢模式的代碼以下:
public class Singleten{
private static singleten Instance = new Singleten();
private Singleten(){}
public static getInstance()
{
return Instance ;
}
}
觀察者模式:一個對象改變狀態,則依賴它的全部對象都會獲得通知並改變狀態。
迭代器模式:iterator();遍歷元素的方法有hasNext(),first(),next(),remove()
模版方法
2.Listview列表效率優化
(1)利用convertview回收視圖
(2)採用ViewHolder模式
(3) 異步加載圖片
(4) 快速滑動時不加載圖片
(5) 若是自定義的item中有圖片,須要處理圖片(減小圖片所佔內存)
1.對圖片進行邊界壓縮 2.用option類來保存圖片大小 3.避免圖片的實時縮放,最好預先縮放到視圖大小
(6)儘可能避免在listview適配器中使用線程,由於線程是產生內存泄露的主要緣由在於線程的生命週期不可控。
3.應用內存優化
(1)bitmap設置圖片大小(優化內存溢出)
BitmapFactory.Option option = new BitmapFactory.Option();
option.inSampleSize = 2; //將視圖寬、高都變爲原來的1/2
(2)bitmap對象銷燬,能夠藉助recycle()方法讓GC回收bitmap對象。
(3)儘可能避免static成員變量引用資源消耗過多的實例,如:context
(4)使用Application的context
(5)及時關閉資源,如在查詢數據庫時須要及時關閉cursor
(6)對常用的圖片使用軟引用保存
(7)線程也是形成內存泄露的一個重要緣由,在於線程的生命週期不可控制,解決方法:
1.將線程內部類改成靜態內部類
2.用弱引用來保存context引用
(8)使用.9圖片
4.Handler與Handler Thread關係
android消息處理機制:handler、Looper、MessageQueue、Message
將一個線程變爲looper線程的方法: Looper.prepare; //初始化MessageQueue與Looper
Looper.loop();//消息循環
5.異常處理
IoException異常是編譯器異常,在編譯時就會報錯
ANR異常解決方法:儘可能在主線程只作少許工做,比較耗時的工做單獨在一個子線程中完成(或使用異步請求)
6.數據庫的優化
1.使用索引
2.使用事務
3.查詢時返回更少的結果集和字段
7.數據存儲的方法
sharedpreference存儲、文件存儲、SQLite存儲、contentprovide存儲、網絡存儲數據
8.啓動服務的兩種方法:startservice 和bindservice
使用startservice()啓動服務,調用者和服務之間沒有關聯,即便調用者退出了,服務仍然運行;使用bindservice()啓動服務,調用者和服務綁定在一塊兒,調用者一旦退出,服務也終止;採用startservice啓動服務,只能調用stopservice終止服務。
startservice()啓動服務的生命週期:oncreat()、onstart(),ondestroy() ;第一次startservice()啓動服務會調用oncreat()、onstart();後面再使用startservice()啓動服務,只會調用onstart()
bindservice()啓動服務的生命週期:oncreat()、onbind()、omunbind()、ondestroy();第一次 bindservice()啓動服務調用oncreat()、onbind(),屢次調用 bindservice()並不會屢次建立服務及綁定,若是調用者但願與正在綁定的服務解除綁定,能夠調用unbindservice()方法。
8.set、List的區別:Set中元素不重複
9.contentprovide如何實現數據共享
若是想使應用程序的數據公開化:1.本身建立一個contentprovide 2.將數據添加到一個已經存在的contentprovide上
如何獲取數據: 外界程序能夠經過contextResolver接口訪問contentprovide提供的數據
contentprovide的優勢爲:爲其餘程序提供了一個對數據訪問的接口,從而實現對數據進行訪問和更新的操做
10.在某個activity界面按Home鍵走的生命週期:onpause(),onstop(),onsaveinstanceState()
在某個activity界面按Home鍵再點擊應用圖標走的生命週期:onRestart().onStart(),onResume()
11.在android中的4種Activity啓動模式:SingleTask、standard、SingleTop、SingleInstance
12.Http協議 HttpClient類 Jeson包解析
13.socket協議
android客戶端實現:
try{
socket = new Socket(「192.168.1.32″,1989);
InputStream inputStream = new FileInputStream (「e://a.txt」);
OutputStream outputStream = socket.getoutputStream() ;
byte buffer[] = new byte[4*1024];
int temp = 0;
while((temp = inputStream .read(buffer))!=-1){
outputStream.write(buffer,0,temp);
}
outputStream.flush();
}
服務器端:
try{
serverSocket = new serverSocket (989);
Socket socket = serverSocket.accept();
InputStream inputStream = new FileInputStream (「e://a.txt」);
InputStream inputStream = socket.getinputStream() ;
byte buffer[] = new byte[4*1024];
int temp = 0;
while((temp = inputStream .read(buffer))!=-1){
system.out.println(new String(buffer,0,temp));
}
serverSocket.close();
}
14.AIDL android內部進程通訊接口的描述語言
15.強引用:內存不足時,不會回收強引用的對象
軟引用:內存不足時,會回收軟引用的對象
弱引用:垃圾回收每次都會回收弱引用的對象
16.android view的刷新機制
17.靜態內部類
(1)非靜態內部類中bunengdingy靜態成員變量和方法
(2)外部類和非靜態內部類之間能夠互相訪問本身的私有成員
(3)靜態內部類只能訪問外部類的靜態成員
來源: <http://www.mianwww.com/html/2014/03/20223.html>
-------------------------------------------------
1. 什麼是Activity?
四大組件之一,通常的,一個用戶交互界面對應一個activity
setContentView() ,// 要顯示的佈局
, activity 是Context的子類,同時實現了window.callback和keyevent.callback, 能夠處理與窗體用戶交互的事件.
button.setOnclickLinstener{
}
我開發經常使用的的有ListActivity , PreferenceActivity ,TabAcitivty等…
若是界面有共同的特色或者功能的時候,還會本身定義一個BaseActivity.
進度對話框的顯示與銷燬 doubanservice
2. 請描述一下Activity 生命週期。
生命週期描述的是一個類 從建立(new出來)到死亡(垃圾回收)的過程當中會執行的方法..
在這個過程當中 會針對不一樣的生命階段會調用不一樣的方法
Activity從建立到銷燬有多種狀態,從一種狀態到另外一種狀態時會激發相應的回調方法,這些回調方法包括:oncreate ondestroy onstop onstart onresume onpause
其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷燬;
onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;
對話框的彈出, Activity.this
對話框是activity的一部分.
這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在何時調用呢?
答案就是:在Activity被onStop後,可是沒有被onDestroy,在再次啓動此Activity時就調用onRestart(而再也不調用onCreate)方法;
若是被onDestroy了,則是調用onCreate方法。
最後講本身項目中的經驗,好比說豆瓣客戶端每次進入某個界面的時候都要看到最新的數據,這個刷新列表的操做 就放在onStart()的方法裏面.
fillData() 這樣保證每次用戶看到的數據都是最新的.
多媒體播放, 播放來電話. onStop() 視頻, 視頻聲音設置爲0 , 記錄視頻播放的位置 mediaplayer.pause();
onStart() 根據保存的狀態恢復現場. mediaplayer.start();
在讀文檔的時候 還發現 activity還有兩個方法 onPostResume() 和 OnPostCreate()這兩個生命週期的方法,不過開發的時候沒有用到過.
3. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。
通常狀況好比說有兩個activity,分別叫A,B ,當在A裏面激活B組件的時候, A 會調用 onPause()方法,而後B 調用onCreate() ,onStart(), OnResume() ,
這個時候B覆蓋了窗體, A會調用onStop()方法. 若是B呢 是個透明的,或者是對話框的樣式, 就不會調用onStop()方法
4. 橫豎屏切換時候Activity的生命週期。
這個生命週期跟清單文件裏的配置有關係
一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期
默認首先銷燬當前activity,而後從新加載
Onpause onstop ondestory oncreate onstart onresume
二、設置Activity的android:configChanges=」orientation|keyboardHidden」時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法
遊戲開發中, 屏幕的朝向都是寫死的.
5. 如何將一個Activity設置成窗口的樣式。
能夠自定義一個activity的樣式,詳細見手機衛士的程序詳細信息
android:theme=」@style/FloatActivity」
E:\day9\mobilesafe\res\values\style
6. 你後臺的Activity被系統 回收怎麼辦?若是後臺的Activity因爲某緣由被系統回收可了,如何在被系統回收以前保存當前狀態?
除了在棧頂的activity,其餘的activity都有可能在內存不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大.
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong(「id」, 1234567890);
}
public void onCreate(Bundle savedInstanceState) {
//判斷 savedInstanceState是否是空.
//若是不爲空就取出來
super.onCreate(savedInstanceState);
}
7. 如何退出Activity?如何安全退出已調用多個Activity的Application?
退出activity 直接調用 finish () 方法 . //用戶點擊back鍵 就是退出一個activity
退出activity 會執行 onDestroy()方法 .
一、拋異常強制退出:
該方法經過拋異常,使程序Force Close。
驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。
//安全結束進程 android.os.Process.killProcess(android.os.Process.myPid());
二、記錄打開的Activity:
每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。
List<Activity> lists ; 在application 全集的環境裏面
lists = new ArrayList<Activity>();
每個activity在執行oncreate()方法的時候 lists.add(this);
Ondestory() lists.remove(this);
lists.add(activity);
for(Activity activity: lists)
{
activity.finish();
}
三、發送特定廣播:
在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。
//給某個activity 註冊接受接受廣播的意圖
registerReceiver(receiver, filter)
//若是過接受到的是 關閉activity的廣播 就調用finish()方法 把當前的activity finish()掉
四、遞歸退出
在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。
404 退出程序
OnActivityResult();
講一講你對activity的理解
把上面的幾點用本身的心得寫出來
8. service是否在main thread中執行, service裏面是否能執行耗時的操做?
默認狀況,若是沒有顯示的指定service所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面
service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 )
在子線程中執行 new Thread(){}.start();
特殊狀況 ,能夠在清單文件配置 service 執行所在的進程 ,
讓service在另外的進程中執行
<service android:process=」cn.itcast.xxx」></service>
9. 兩個Activity之間怎麼傳遞數據?
基本數據類型能夠經過. Intent 傳遞數據
extras.putDouble(key, value)
intent.putExtra(name, value)
// 經過intent putExtra 方法 基本數據類型 都傳遞
Bundle bundle = new Bundle();
bundle.putShort(key, value);
intent.putExtras(bundle);
intent.putExtras(bundle)
獲取到激活他的 getIntent();
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Bundle 相似map的集合
intent.getStringExtra(「key」,」value」);
intent.getBooleanExtra(「key」,」value」)
Application 全局裏面存放 對象 ,本身去實現本身的application的這個類,基礎系統的application , 每一個activity均可以取到
讓對象實現 implements Serializable 接口把對象存放到文件上.
讓類實現Serializable 接口,而後能夠經過 ObjectOutputStream //對象輸出流
File file = new File(「c:\\1.obj」);
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student stu = new Student();
stu.setId(「10001″);
stu.setName(「zs」);
oos.writeObject(stu);
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu1 = (Student) ois.readObject();
System.out.println(stu1.getName());
Parcelable 和 Serializable
Parcelable 把對象序列化到android操做系統 的一塊公用的內存空間
文件/網絡
//傳遞數據的引用
intent.setData(Uri)
Uri.fromFile(); //大圖片的傳遞
contentResolver.getInputStream(uri);
10. 怎麼讓在啓動一個Activity是就啓動一個service?
在activity的onCreate()方法裏面 startService();
11. 同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?
比方說在激活一個新的activity時候, 給intent設置flag
singleinstance 單獨的任務棧
Intent的flag添加FLAG_ACTIVITY_NEW_TASK
這個被激活的activity就會在新的task棧裏面…
Intent intent = new Intent(A.this,B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
12. Activity怎麼和service綁定,怎麼在activity中啓動本身對應的service?
startService() 一旦被建立 調用着無關 無法使用service裏面的方法
bindService () 把service 與調用者綁定 ,若是調用者被銷燬, service會銷燬
bindService() 咱們能夠使用service 裏面的方法
bindService(). 讓activity可以訪問到 service裏面的方法
構建一個intent對象,
Intent service = new Intent(this,MyService.class);
經過bindService的方法去啓動一個服務,
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
ServiceConnection 對象(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.
private class myconn implements ServiceConnection
{
//異步的操做, 可能須要花費若干秒的時間
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//能夠經過IBinder的對象 去使用service裏面的方法
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
13. 14 .什麼是Service以及描述下它的生命週期。Service有哪些啓動方法,有什麼區別,怎樣停用Service?
在Service的生命週期中,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,
onBind和onUnbind。
一般有兩種方式啓動一個Service,他們對Service生命週期的影響是不同的。
1 經過startService
Service會經歷 onCreate 到onStart,而後處於運行狀態,stopService的時候調用onDestroy方法。
若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。
2 經過bindService
Service會運行onCreate,而後是調用onBind, 這個時候調用者和Service綁定在一塊兒。調用者退出了,Srevice就會調用onUnbind->onDestroyed方法。
所謂綁定在一塊兒就共存亡了。調用者也能夠經過調用unbindService方法來中止服務,這時候Srevice就會調用onUnbind->onDestroyed方法。
須要注意的是若是這幾個方法交織在一塊兒的話,會出現什麼狀況呢?
一個原則是Service的onCreate的方法只會被調用一次,就是你不管多少次的startService又bindService,Service只被建立一次。
若是先是bind了,那麼start的時候就直接運行Service的onStart方法,若是先是start,那麼bind的時候就直接運行onBind方法。
若是service運行期間調用了bindService,這時候再調用stopService的話,service是不會調用onDestroy方法的,service就stop不掉了,只能調用UnbindService, service就會被銷燬
若是一個service經過startService 被start以後,屢次調用startService 的話,service會屢次調用onStart方法。屢次調用stopService的話,service只會調用一次onDestroyed方法。
若是一個service經過bindService被start以後,屢次調用bindService的話,service只會調用一次onBind方法。
屢次調用unbindService的話會拋出異常。
15. 不用service,B頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?
這個問題問的很山寨.默認不作任何處理,B裏面的音樂都能播放.
遇到問題, 能夠隨機應變,靈活發揮,多考慮些細節,好比說這個題就能夠這樣說,說說你對startActivityForResult的理解()
A開啓B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態信息返回給A ,A繼續播放音樂.
16. 什麼是IntentService?有何優勢?
普通的service ,默認運行在ui main 主線程
Sdk給咱們提供的方便的,帶有異步處理的service類,
異步處理的方法 OnHandleIntent()
OnHandleIntent() 處理耗時的操做
17. 何時使用Service?
擁有service的進程具備較高的優先級
官方文檔告訴咱們,Android系統會盡可能保持擁有service的進程運行,只要在該service已經被啓動(start)或者客戶端鏈接(bindService)到它。當內存不足時,須要保持,擁有service的進程具備較高的優先級。
1. 若是service正在調用onCreate, onStartCommand或者onDestory方法,那麼用於當前service的進程至關於前臺進程以免被killed。
2. 若是當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,可是比那些不可見的進程更重要,這就意味着service通常不會被killed.
3. 若是客戶端已經鏈接到service (bindService),那麼擁有Service的進程則擁有最高的優先級,能夠認爲service是可見的。
4. 若是service能夠使用setForeground(true);方法來將service設置爲前臺狀態,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。
若是有其餘的應用組件做爲Service,Activity等運行在相同的進程中,那麼將會增長該進程的重要性。
1.Service的特色可讓他在後臺一直運行,能夠在service裏面建立線程去完成耗時的操做. 天氣預報 widget TimerTask Timer 按期執行timertask
2.Broadcast receiver捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做.
Broadcast receiver生命週期 和 響應時間很短
3.遠程的service若是被啓動起來,能夠被屢次bind, 但不會從新create. 索愛手機X10i的人臉識別的service能夠被圖庫使用,能夠被攝像機,照相機等程序使用.
18. 請描述一下Intent 和 Intent Filter。
Android 中經過 Intent 對象來表示一條消息,一個 Intent 對象不只包含有這個消息的目的地,還能夠包含消息的內容,這比如一封 Email,其中不只應該包含收件地址,還能夠包含具體的內容。對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項。
經過Intent 能夠實現各類系統組件的調用與激活.
Intent filter: 能夠理解爲郵局或者是一個信箋的分揀系統…
這個分揀系統經過3個參數來識別
Action: 動做 Intent.ation_view
Data: 數據uri uri mime
Category : 而外的附加信息
Action 匹配
Action 是一個用戶定義的字符串,用於描述一個 Android 應用程序組件,一個 Intent Filter 能夠包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時能夠在其 <intent-filter >節點指定一個 Action 列表用於標示 Activity 所能接受的「動做」,例如:
<intent-filter >
<action android:name=」android.intent.action.MAIN」 />
<action android:name=」cn.itcast.action」 />
……
</intent-filter>
若是咱們在啓動一個 Activity 時使用這樣的 Intent 對象:
Intent intent =new Intent();
intent.setAction(「cn.itcast.action」);
那麼全部的 Action 列表中包含了「cn.itcast」的 Activity 都將會匹配成功。
Android 預約義了一系列的 Action 分別表示特定的系統動做。這些 Action 經過常量的方式定義在 android.content. Intent中,以「ACTION_」開頭。咱們能夠在 Android 提供的文檔中找到它們的詳細說明。
URI 數據匹配
一個 Intent 能夠經過 URI 攜帶外部數據給目標組件。在 <intent-filter >節點中,經過 <data/>節點匹配外部數據。
mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。以下:
<data android:mimeType=」mimeType」 android:scheme=」scheme」
android:host=」host」 android:port=」port」 android:path=」path」/>
電話的uri tel: 12345 package:cn.itcast.xxx
http://www.baidu.com
本身定義的uri itcast://cn.itcast/person/10
若是在 Intent Filter 中指定了這些屬性,那麼只有全部的屬性都匹配成功時 URI 數據匹配纔會成功。
Category 類別匹配
<intent-filter >節點中能夠爲組件定義一個 Category 類別列表,當 Intent 中包含這個列表的全部項目時 Category 類別匹配纔會成功。
默認是DEFAULT
19. Intent傳遞數據時,能夠傳遞哪些類型數據?
1.通常的基本數據類型 Intent .putextra() intent.getStringextra();
2. 數據的uri, intent.setData() intent.getData();
20. 說說Activity,Intent,Service是什麼關係 。
麥當勞和麥當娜的關係是什麼關係?
這種問題,就講下activity,講一下service,說一下 經過intent去激活組件,傳遞數據.
說本身項目中有這樣一個網絡更新的功能,顯示界面就用的activity, 後臺有個service每隔半小時都去訪問下服務器獲取更新的數據…
開啓服務用的是intent來開啓
請描述一下Broadcast Receiver。
廣播 android操做系統的一個事件
有不少廣播接收者 ,系統已經實現了.
廣播分兩種
有序廣播
無序廣播
指定接收者的廣播 . 是不能夠被攔截掉的
<intent-filter android:priority=」1000″> 那個程序的uid 越低 越先接受到消息
<action android:name=」android.provider.Telephony.SMS_RECEIVED」/>
</intent-filter>
onReceive() 方法.
abortBroadcast();
有序廣播有一個特例
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
resultReceiver 廣播接受者 若是咱們顯示的指定了廣播接收者
不管如何 都會接受廣播 時間 abortBroadcast(); 的方法不會終止廣播時間
SetresultData();
Sticky
sendStickyBroadcast(intent) // 陰魂不散的廣播
Wifi設置
用於接收系統的廣播通知, 系統會有不少sd卡掛載,手機重啓,廣播通知,低電量,來短信等,一個apk的安裝成功….
手機衛士中自定義一個broadcast receiver
<intent-filter android:> <action> sms_received </action> </intent-filter>
來獲取短信到來的廣播, 根據黑名單來判斷是否攔截該短信.
畫畫板生成圖片後,發送一個sd掛載的通知,通知系統的gallery去獲取到新的圖片.
Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse(「file://」+Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
22. 在manifest和代碼中如何註冊和使 用 broadcast receiver 。
設置廣播接收者的優先級,設置廣播接受者的action名字 等…
詳細見工程代碼.
<intent-filter android:priority=」1000″>
<action android:name=」android.intent.action.NEW_OUTGOING_CALL」/>
</intent-filter>
</receiver>
<receiver android:name=」.SmsReceiver」>
<intent-filter android:priority=」1000″>
<action android:name=」android.provider.Telephony.SMS_RECEIVED」/>
</intent-filter>
</receiver>
<receiver android:name=」.BootCompleteReceiver」>
<intent-filter >
<action android:name=」android.intent.action.BOOT_COMPLETED」 />
</intent-filter>
</receiver>
代碼中註冊,若是代碼沒有執行,就接受不到廣播事件
registerReceiver(receiver, filter);
23. 請介紹下ContentProvider是如何實現數據共享的。
把本身的數據經過uri的形式共享出去
android 系統下 不一樣程序 數據默認是不能共享訪問
須要去實現一個類去繼承ContentProvider
public class PersonContentProvider extends ContentProvider{
public boolean onCreate(){
//..
}
Query (Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
}
content:// 表明contentprovider
技巧: 1.看urlmarcher.
2. 根據匹配碼 查看增刪改查的具體實現
24. 請介紹下Android的數據存儲方式。
文件 訪問權限. sdcard
/data/data/包名/files 內存裏面
<data>/<data> context.openFileInput(name) 默認是私有的訪問權限
數據庫 sqlite
SharedPreference <data>/<data>/包名/shared_preps Context.modeprivate
網絡 socket tcp 面向鏈接 打電話 udp 平信 udp,
http httpurlconnection
Android httpclient post get
ftp的網絡 file transport protocol
25. 爲何要用ContentProvider?它和sql的實現上有什麼差異?
屏蔽數據存儲的細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了,對應的參數 .
不一樣app之間共享,操做數據
可是contentprovider 還能夠去增刪改查本地文件. xml文件的讀取,更改,
網絡數據讀取更改
Sql也有增刪改查的方法.
26. 請介紹下Android中經常使用的五種佈局。
FrameLayout(幀佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)
FrameLayout
從屏幕的左上角開始佈局,疊加顯示, 實際應用 播放器的暫停按鈕.
LinearLayout
線性佈局,這個東西,從外框上能夠理解爲一個div,他首先是一個一個從上往下羅列在屏幕上。每個LinearLayout裏面又可分爲垂直佈局
(android:orientation=」vertical」)和水平佈局(android:orientation=」horizontal」
)。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列。
AbsoluteLayout
絕對佈局猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x=」20px」
android:layout_y=」12px」
qq鬥地主 qq遊戲大廳 800*480 800*480.apk fwvga 854*480 320*240
指定平板機型的遊戲開發中常常用到絕對佈局 widget 絕對佈局
指定機型的平板遊戲開發. 2.3 3.0
android 2.2 2.3 2.3 sip 開發網絡電話 session setup protocol 2.3 支持攝像頭
Android 3.0 3.1 針對平板電腦
分裂
4.0 平板 平板 電視機機頂盒
界面佈局 任務管理器 gridview
手機 任務管理 listview
lephone
lepad
RelativeLayout
相對佈局能夠理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有:
相對於某一個元素
android:layout_below=」@id/aaa」 該元素在 id爲aaa的下面
android:layout_toLeftOf=」@id/bbb」 改元素的左邊是bbb
相對於父元素的地方
android:layout_alignParentLeft=」true」 在父元素左對齊
android:layout_alignParentRight=」true」 在父元素右對齊
TableLayout <table>
表格佈局相似Html裏面的Table。每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素,設定他的對齊方式 android:gravity=」」 。
每個佈局都有本身適合的方式,另外,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。
oa 自動化 生成報表 ,圖標 表示
css div
webview
27. 談談UI中, Padding和Margin有什麼區別?
Padding 文字對邊框, margin是控件與控件之間的距離
28. widget相對位置的完成在activity的哪一個生命週期階段實現。
這個題沒看懂…
widget能夠理解成桌面小控件,
也能夠理解成 某個button, imageview這樣的控件…
onmeasure() // 計算 控件在屏幕上的位子
某個view 要顯示在界面 ondraw 被顯示到界面上的
29. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。
Activity 裏面默認會幫建立Looper
子線程裏面 顯示土司
Looper.parepare();
Toast
Looper.loop();
30. AIDL的全稱是什麼?如何工做?
Android interface definition language (android接口定義語言) ,
用來跨進程的訪問方法,
訪問遠程的服務的方法. 如何工做 手機衛士的程序鎖 .
.endcall();
手機衛士 Itelephony 接口掛斷電話.
31. 請解釋下Android程序運行時權限與文件系統權限的區別。
Android程序執行須要讀取到安全敏感項必需在androidmanifest.xml中聲明相關權限請求, 打電話,訪問網絡,獲取座標,寫sd卡,讀寫聯繫人等..安裝的時候會提示用戶…
-rw—— 私有權限 -rw-rw-rw- 全局可讀可寫 linux系統的文件權限
文件系統的權限是linux權限. 好比說sharedpreference裏面的Context.Mode_private
Context.Mode.world_read_able Context.Mode_world_writeable
777本身 同組 其餘
root 是危險的行爲
系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?
Intent .setAction(VIEW)
setData(「http://」)
找到對應的瀏覽器的意圖,傳遞數據URI , 激活這個意圖
Intent intent = new Intent();
// com.android.browser/.BrowserActivity
intent.setClassName(「com.android.browser」, 「com.android.browser.BrowserActivity 「);
Intent.setdata(uri);
queryintentactivity(); 推廣本身產品的操做
33. 對android主線程的運用和理解。
主ui線程不能執行耗時的操做,
34. 對android虛擬機的理解,包括內存管理機制垃圾回收機制。
虛擬機很小,空間很小,談談移動設備的虛擬機的大小限制 默認 16M
談談加載圖片的時候怎麼處理大圖片的,
垃圾回收,沒有引用的對象,或者是離開做用空間 ,在某個時刻會被系統gc掉.
System.gc(); 不是馬上去執行垃圾回收.
Moblietv 獲取300 30K 頻道.icon gallery
手機電視. 視頻點播. Onstop() 通知gc();
別的界面圖片 白板.
遇到一個不可復現的bug, 不解決 won’t fix
樂觀鎖 悲觀鎖
Framework工做方式及原理,Activity是如何生成一個view的,機制是什麼。
反射 , 配置文件
控制反轉.
能夠講下activity的源碼,好比說 每一個activity裏面都有window.callback和keyevent.callback,一些回調的接口或者函數吧. 框架把activity建立出來就會調用裏面的這些回調方法,會調用activity生命週期相關的方法.
setContentView();
普通的狀況:
Activity建立一個view是經過 ondraw 畫出來的, 畫這個view以前呢,還會調用onmeasure方法來計算顯示的大小.
Surfaceview 直接操做硬件 opengl .GLSurfaceView
圖像要想被顯示到界面上, 須要設備顯卡, 顯存.
寫到顯存.
Mediaplayer
Opengl
直接把數據寫到顯存.
android自己的一些限制,好比apk包大小限制,讀取大文件時的時間限。
這個問題問的有問題, apk包大小限制很差說,
極品飛車有100M 仍是能裝到手機上,
// apk 資源文件素材.
世面google market 上大程序 主程序 很小 5~10M 下載sdcard
15分鐘以內 申請退款
apk包,精簡包, 素材存放在服務器. 遊戲程序.
讀大文件的時間限制應該是main線程裏面的時間限制吧5秒.
Broadcast 10秒
Service 20秒
如何加載的音樂信息,如何改善其效率。
MP3播放器. 遍歷sd卡的mp3
Mp3 做者信息 專輯 圖片 歌詞信息 id3 id3v1 id3v2
Android提供mediascanner,mediaStore等接口, 音樂文件的信息都會存放到系統的數據庫表中,能夠經過content provider獲取,
顯示出來,改善效率,是個常見問題, 能夠從如下幾個方面做答,
分批加載數據, 延時加載數據, 合理使用緩存等…
Java虛擬機, 目標, 加快java程序執行速度
預先加載一些 都會的使用的大的class的字節碼, 提早加載.
時間換時間
空間換時間
38. ListView如何提升其效率?
複用convertview , 歷史的view對象
異步加載數據, 分頁加載數據, onscallLinster();
Static class ViewHolder
使用靜態的view對象 避免建立過多的view.
把下載後的數據緩存到數據庫裏
客戶端和服務器 協同 做戰 .
Http 請求
If-modify-since : 檢查數據是否更新 1.html 2001年 302 拿緩存
網易新聞
39. 啓動應用後,改變系統語言,應用的語言會改變麼?
會
40. 啓動一個程序,能夠主界面點擊圖標進入,也能夠從一個程序中跳轉過去,兩者有什麼區別?
區別是根據activity在manifest裏面的配置,這個activity可能會放在不一樣的task棧裏面
intent設置的flag flag_activity_new_task
41. Android程序與Java程序的區別?
Android程序用android sdk開發,java程序用javasdk開發.
Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt swing package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用。
android sdk 添加工具jar httpclient , pull openGL
將Java 遊戲或者j2me程序移植到Android平臺的過程當中,
Android SDK 與Java SDK的區別是很須要注意的地方。
1.6的 不支持 httpUrlconning 獲取 last-modified 信息的處理
simpleDataFormat
Android中Task任務棧的分配。
假若有三個Activity A B C,A跳到B,而後B跳到C,如今須要從C跳到A如何傳遞數據並且使效率最高呢?
首先咱們來看下Task的定義,Google是這樣定義Task的:a task is what the user experiences as an 「application.」 It’s a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 這意思就是說Task其實是一個Activity棧,一般用戶感覺的一個Application就是一個Task。從這個定義來看,Task跟Service或者其餘Components是沒有任何聯繫的,它只是針對Activity而言的。
Activity有不一樣的啓動模式, 能夠影響到task的分配
Task,簡單的說,就是一組以棧的模式彙集在一塊兒的Activity組件集合。它們有潛在的先後驅關聯,新加入的Activity組件,位於棧頂,並僅有在棧頂的Activity,纔會有機會與用戶進行交互。而當棧頂的Activity完成使命退出的時候,Task會將其退棧,並讓下一個將跑到棧頂的Activity來於用戶面對面,直至棧中再無更多Activity,Task結束。
事件 Task棧(粗體爲棧頂組件)
點開Email應用,進入收件箱(Activity A) A
選中一封郵件,點擊查看詳情(Activity B) AB
點擊回覆,開始寫新郵件(Activity C) ABC
寫了幾行字,點擊選擇聯繫人,進入選擇聯繫人界面(Activity D) ABCD
選擇好了聯繫人,繼續寫郵件 ABC
寫好郵件,發送完成,回到原始郵件 AB
點擊返回,回到收件箱 A
退出Email程序 null
如上表所示,是一個實例。從用戶從進入郵箱開始,到回覆完成,退出應用整個過程的Task棧變化。這是一個標準的棧模式,對於大部分的情況,這樣的Task模型,足以應付,可是,涉及到實際的性能、開銷等問題,就會變得殘酷許多。
好比,啓動一個瀏覽器,在Android中是一個比較沉重的過程,它須要作不少初始化的工做,而且會有不小的內存開銷。但與此同時,用瀏覽器打開一些內容,又是通常應用都會有的一個需求。設想一下,若是同時有十個運行着的應用(就會對應着是多個Task),都須要啓動瀏覽器,這將是一個多麼殘酷的場面,十個Task棧都堆積着很雷同的瀏覽器Activity,
是多麼華麗的一種浪費啊。
因而你會有這樣一種設想,瀏覽器Activity,可不能夠做爲一個單獨的Task而存在,無論是來自那個Task的請求,瀏覽器的Task,都不會歸併過去。這樣,雖然瀏覽器Activity自己須要維繫的狀態更多了,但總體的開銷將大大的減小,這種舍小家爲你們的行爲,仍是很值得歌頌的
standard」, 「singleTop」, 「singleTask」, 「singleInstance」。
standard模式, 是默認的也是標準的Task模式,在沒有其餘因素的影響下,使用此模式的Activity,會構造一個Activity的實例,加入到調用者的Task棧中去,對於使用頻度通常開銷通常什麼都通常的Activity而言,standard模式無疑是最合適的,由於它邏輯簡單條理清晰,因此是默認的選擇。
而singleTop模式,基本上於standard一致,僅在請求的Activity正好位於棧頂時,有所區別。此時,配置成singleTop的Activity,再也不會構造新的實例加入到Task棧中,而是將新來的Intent發送到棧頂Activity中,棧頂的Activity能夠經過重載onNewIntent來處理新的Intent(固然,也能夠無視…)。這個模式,下降了位於棧頂時的一些重複開銷,更避免了一些奇異的行爲(想象一下,若是在棧頂連續幾個都是一樣的Activity,再一級級退出的時候,這是怎麼樣的用戶體驗…),很適合一些會有更新的列表Activity展現。一個活生生的實例是,在Android默認提供的應用中,瀏覽器(Browser)的書籤Activity(BrowserBookmarkPage),就用的是singleTop。
singleTask,和singleInstance,則都採起的另闢Task的蹊徑。
標誌爲singleTask的Activity,最多僅有一個實例存在,而且,位於以它爲根的Task中。全部對該Activity的請求,都會跳到該Activity的Task中展開進行。singleTask,很象概念中的單件模式,全部的修改都是基於一個實例,這一般用在構形成本很大,但切換成本較小的Activity中。最典型的例子,仍是瀏覽器應用的主Activity(名爲Browser…),它是展現當前tab,當前頁面內容的窗口。它的構形成本大,但頁面的切換仍是較快的,於singleTask相配,仍是挺天做之合的。
singleInstance顯得更爲極端一些。在大部分時候singleInstance與singleTask徹底一致,惟一的不一樣在於,singleInstance的Activity,是它所在棧中僅有的一個Activity,若是涉及到的其餘Activity,都移交到其餘Task中進行。這使得singleInstance的Activity,像一座孤島,完全的黑盒,它不關注請求來自何方,也不計較後續由誰執行。在Android默認的各個應用中,不多有這樣的Activity,在我我的的工程實踐中,曾嘗試在有道詞典的快速取詞Activity中採用過,
是由於我以爲快速取詞入口足夠方便(從notification中點選進入),而且會在各個場合使用,應該作得徹底獨立。
大的apk 拆成 不少小的apk
Andorid 車載電腦:
組網領航 事故急救
140M apk
●Activity的 android:taskAffinity=」」屬性 姻緣關係
1.配置後 當啓動這個activity時就先去找有沒有activity的親和力屬性相同 有就加入這個
activity所在的任務中沒有就新開任務
2.affinity起做用須要的條件而者具有一個:
1.intent包含FLAG_ACTIVITY_NEW_TASK標記
2.activity元素啓用了allowTaskReparenting屬性. true
43. 在Android中,怎麼節省內存的使用,怎麼主動回收內存?
儘可能多使用內部類 提升程序效率
Bean private public
回收已經使用的資源,
合理的使用緩存
合理設置變量的做用範圍 application 對象
//將來的某一段時間執行
System.gc();
44. 不一樣工程中的方法是否能夠相互調用?
能夠,列舉aidl訪問遠程服務的例子.
45. 在Android中是如何實現判斷區分電話的狀態,去電,來電、未接來電?
Day8 showAddressService.java
46. dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念
Dvm的進程是dalivk虛擬機進程,每一個android程序都運行在本身的進程裏面,
每一個android程序系統都會給他分配一個單獨的liunx uid(user id),
每一個dvm都是linux裏面的一個進程.因此說這兩個進程是一個進程.
47. sim卡的EF 文件有何做用
Sim卡相關的東西,沒接觸過
文件規範.
48. 如何判斷是否有SD卡?
配置文件中有sd卡的權限, 經過environment的靜態方法,
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
49. 嵌入式操做系統內存管理有哪幾種, 各有何特性。
頁式,段式,段頁,等 …
50. 什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎?
實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統。主要用於工業控制、軍事設備、航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統。又可分爲軟實時和硬實時兩種,而android是基於linux內核的,所以屬於軟實時。
硬實時. 火星探測車. Vxworks
軟實時. 調度算法
51. 一條最長的短信息約佔多少byte?
中文70(包括標點),英文160,160個字節 這個說法不許確,
要跟手機制式運營商等信息有關.
作實驗,看源碼
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, pi, null);
}
1
52. Linux中跨進程通訊的幾種方式 。
linux編程
# 管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
# 信號量( semophore ) : 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
# 信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
# 共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊。
# 套接字( socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。
53. 談談對Android NDK的理解。
native develop kit 只是一個交叉編譯的工具 .so
1.何時用ndk, 實時性要求高,遊戲,圖形渲染,
opencv (人臉識別) , ffmpeg , rmvb mp5 avi 高清解碼. ffmpeg, opencore.
2.爲何用ndk,ndk的優勢 ,缺點,
咱們項目中那些地方用到了ndk, c opengl
54. 談談Android的優勢和不足之處。
一、開放性,開源 ophone 阿里雲( 徹底兼容android) 樂os
二、掙脫運營商束縛
三、豐富的硬件選擇 mtk android
四、不受任何限制的開發商
五、無縫結合的Google應用
缺點也有5處:
一、安全問題、隱私問題
二、賣手機的不是最大運營商
三、運營商對Android手機仍然有影響
四、山寨化嚴重
五、過度依賴開發商,缺少標準配置 版本過多
55. Android系統中GC什麼狀況下會出現內存泄露呢? 視頻編解碼/內存泄露
檢測內存泄露 工具
致使內存泄漏主要的緣由是,先前申請了內存空間而忘記了釋放。若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器GC驗證這些對象是否再也不須要。若是存在對象的引用,這個對象就被定義爲」有效的活動」,同時不會被釋放。要肯定對象所佔內存將被回收,咱們就要務必確認該對象再也不會被使用。典型的作法就是把對象數據成員設爲null或者從集合中移除該對象。但當局部變量不須要時,不需明顯的設爲null,由於一個方法執行完畢時,這些引用會自動被清理。
Java帶垃圾回收的機制,爲何還會內存泄露呢?
Vector v = new Vector(10);
for (int i = 1; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
}//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象。
Java 內存泄露的根本緣由就是 保存了不可能再被訪問的變量類型的引用
Jni 開發可能會出現內存泄露
56. Android UI中的View如何刷新。
在主線程中 拿到view調用Invalide()方法,查看畫畫板裏面更新imageview的方法
在子線程裏面能夠經過postInvalide()方法;
iv.invalidate();
new Thread(){
public void run(){
iv.postInvalidate();
}
}.start();
57. 簡單描述下Android 數字簽名。
Android 數字簽名
在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係
Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。
這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的。
同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處。
(1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本。若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名。
(2)有利於程序的模塊化設計和開發。Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序。因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊。
在簽名時,須要考慮數字證書的有效期:
(1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級。
(2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期。
(3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。
Android數字證書包含如下幾個要點:
(1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
(2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證
(3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。
58. 什麼是ANR 如何避免它?
在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。
Activity 5秒 broadcast10秒
耗時的操做 worker thread裏面完成,
handler message…AsynsTask , intentservice.等…
59. android中的動畫有哪幾類,它們的特色和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫。
Tween動畫,這種實現方式能夠使視圖組件移動、放大、縮小以及產生透明度的變化;
能夠經過佈局文件,能夠經過代碼
一、 控制View的動畫
a) alpha(AlphaAnimation)
漸變透明
b) scale(ScaleAnimation)
漸變尺寸伸縮
c) translate(TranslateAnimation)
畫面轉換、位置移動
d) rotate(RotateAnimation)
畫面轉移,旋轉動畫
二、 控制一個Layout裏面子View的動畫效果
a) layoutAnimation(LayoutAnimationController)
b) gridAnimation(GridLayoutAnimationController)
另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。
62. 說說mvc模式的原理,它在android中的運用。
MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。
Android中界面部分也採用了當前比較流行的MVC框架,在Android中M就是應用程序中二進制的數據,V就是用戶的界面。Android的界面直接採用XML文件保存的,界面開發變的很方便。在Android中C也是很簡單的,一個Activity能夠有多個界面,只須要將視圖的ID傳遞到setContentView(),就指定了以哪一個視圖模型顯示數據。
在Android SDK中的數據綁定,也都是採用了與MVC框架相似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就能夠直接在視圖模型上顯示了,從而實現了數據綁定。好比顯示Cursor中全部數據的ListActivity,其視圖層就是一個ListView,將數據封裝爲ListAdapter,並傳遞給ListView,數據就在ListView中顯示。
63. 經過點擊一個網頁上的url 就能夠完成程序的自動安裝,描述下原理
Day11 AddJavascriptInterface
new Object{
callphone();
installapk();
}
64,Service和Activity在同一個線程嗎
默認狀況同一線程 main主線程 ui線程
65,java中的soft reference是個什麼東西
StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收
SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合內存緩存
應用詳細見豆瓣客戶端圖片的緩存
66,udp鏈接和TCP的不一樣之處
tcp/滑動窗口協議. 擁塞控制. 流 tcp打電話
udp 不關心數據是否達到,是否阻塞 數據包 平信
qq視頻
畫面優先. tcp
流暢優先 udp
qq發消息 , udp
應用層上 包裝數據 必定要發送.
67, android開發中怎麼去調試bug
邏輯錯誤
1. 斷點 debug
2. logcat ,
界面佈局,顯示 hierarchyviewer.bat
68.service裏面能夠彈土司麼
能夠
69.寫10個簡單的linux命令
ls ps cat ping cd rm chomd
cat ls ps psw wc mv rm cd ping tracert find grep tail vi gcc make ifconfig
startup dhcp
70 JNI調用經常使用的兩個參數
JNIEnv *env, jobject javaThis
71. 書寫出android工程的目錄結構
src
android. jar
asset
res
gen
manifest
72. ddms 和traceview的區別.
daivilk debug manager system
1.在應用的主activity的onCreate方法中加入Debug.startMethodTracing(「要生成的traceview文件的名字」);
2.一樣在主activity的onStop方法中加入Debug.stopMethodTracing();
3.同時要在AndroidManifest.xml文件中配置權限
<uses-permission android:name=」android.permission.WRITE_EXTERNAL_STORAGE」></uses-permission>
3.從新編譯,安裝,啓動服務,測試完成取對應的traceview文件(adb pull /sdcard/xxxx.trace)。
4.直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應的應用便可。
traceview 分析程序執行時間和效率
KPI : key performance information : 關鍵性能指標:
splash界面不能超過5秒
從splash 界面加載mainactivity 不能超過0.7秒
73, 同步異步的理解,什麼是同步,什麼是異步,屢次調用異步方法會出現什麼問題.
74. 利用mvc的模式重構代碼
1) 重構前的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Listen for button clicks
Button button = (Button) findViewById(R.id.submit);
button.setOnClickListener(calcBMI);
}
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat(「0.00″);
EditText fieldheight = (EditText) findViewById(R.id.height);
EditText fieldweight = (EditText) findViewById(R.id.weight);
double height = Double.parseDouble(fieldheight.getText().toString()) / 100;
double weight = Double.parseDouble(fieldweight.getText().toString());
double BMI = weight / (height * height);
TextView result = (TextView) findViewById(R.id.result);
result.setText(「Your BMI is 」 + nf.format(BMI));
// Give health advice
TextView fieldsuggest = (TextView) findViewById(R.id.suggest);
if (BMI > 25) {
fieldsuggest.setText(R.string.advice_heavy);
} else if (BMI < 20) {
fieldsuggest.setText(R.string.advice_light);
} else {
fieldsuggest.setText(R.string.advice_average);
}
}
};
}
Step1:抽取全部界面元件的聲明和定義,整合到單獨一個函數findViews()中;
// 聲明 view
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
此部分便是MVC中的V:View視圖。
Step2:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數setListensers()中;
//Listen for button clicks
private void setListensers() {
button_calc.setOnClickListener(calcBMI);
}
此部分便是MVC中的C:Controller控制器。
接着,onCreate()就顯得很是簡潔、明瞭了:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
Step3:修改按鈕監聽器calcBMI中相應的部分(主要是變量已經在視圖部分定義了);
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat(「0.00″);
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText(「Your BMI is 」 + nf.format(BMI));
// Give health advice
if (BMI > 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI < 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
總之,此重構的目的無非是使程序的脈絡更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應該寫在哪裏,程序邏輯(Controller)應該寫在哪裏,最終使維護和擴展代碼變得更加容易!
其實,重構很簡單,通讀代碼,感受哪邊不太爽,就改那邊吧!(我目前的感覺)
一個良好的代碼應該是能讓人感到舒服的!
2) 重構後的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
// Listen for button clicks
private void setListeners() {
calcbutton.setOnClickListener(calcBMI);
}
private Button.OnClickListener calcBMI = new Button.OnClickListener() {
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat(「0.0″);
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
// Give health advice
if (BMI > 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI < 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
}
總結:
關於項目
在就是你項目經驗,必定要突出你遇到什麼難點,而後是怎麼解決的!把問題引導到你熟悉的領域,或者知識點上,儘可能將每一個技術點細節凸顯出來,
心態:
什麼樣的面試官都有,去面試的時候要作好一切心理準備,無論是技術仍是基礎都得紮實。一我的的交談能力也很重要,總之不是很是標準的普通話, 最起碼你說的得讓別人聽得懂,並且得把面試官講得很是完全,這樣你得到offer的機會更大,談工資也有優點~~
---------------------------------
隨着移動平臺的發展和其應用的不斷改善,質量成爲決定成敗的關鍵。用戶要求他們選擇安裝的應用響應快、性能好,若是某個應用不能提供卓越的功能和穩定的用戶體驗,那這樣的應用註定會被很快卸載。
儘管如今Android智能手機和平板電腦的運行速率愈來愈快,但開發者仍需牢記,應用的運行環境仍受到電池和處理器等諸多資源的限制。如下是如何爲應用「瘦身」的十條建議,以便能在當前和之後的全部Android設備都能運行出最佳效果。
1)首先要有良好的編碼習慣
一個優秀的開發者應該善於運用常識、完善的算法和標準設計模式。要有資源意識,打開了就要記得關閉,儘可能作到晚獲取,早釋放。這些由來已久的編碼準則一樣適用Android應用開發,尤爲是使用基礎設備服務時。
2)讓阻塞操做遠離主UI線程
經過使用AsyncTask、線程、IntentService和自定義後臺服務,保證應用的靈活性。使用加載工具簡化遊標等長時間加載數據的狀態管理。當有其餘程序運行時,不能讓你的應用滯後或停止。
若是一個操做須要消耗較多時間和資源時,取消該操做,換成異步處理,這樣應用就能保持響應,用戶能夠繼續各類操做。該方法適用磁盤讀寫、訪問內容提供方、數據庫和互聯網,以及解析和其餘須要花費較長時間的任務。
3)使用最新的Android SDK版本和API
使用Android平臺的最新產品,保證你的應用緊跟Android的更新步伐。隨着Android平臺的不斷髮展,部分功能可能被棄用或被更好的功能 取代,核心API接收了bug修復和性能改進,新API有助於開發者編寫出更穩定的應用。要明白最佳的作法老是隨着時間的推移而變,聰明的開發者應該老是 站在整個平臺的最前沿。
4)考慮使用StrictMode
從Android 2.3開始提供了一個新的類StrictMode,該類能夠用於捕捉髮生在應用程序主線程中耗時的磁盤、網絡訪問或函數調用,能夠幫助開發者改進程序,使主線程處理UI和動畫在磁盤讀寫和網絡操做時變得更平滑,避免主線程被阻塞。
5)發佈前禁用或儘可能減小調試
若是開發週期較長,你極可能在應用中內置了一些日誌或調試代碼,在發佈前確保這些功能已經最小化或徹底禁用。
6)確保UI佈局簡單優雅
簡單的屏幕不只方便閱讀,還能加快加載速度。與其在一個單一屏幕上堆砌太多沒必要要的功能,不如花時間去開發優雅的用戶界面。簡單優雅的UI不只能提升應用性能,還能提升用戶使用該應用時的效率。
7)根據目標設備調整應用資源
爲儘量高效地被加載,須要根據具體設備的配置調整相應資源,尤爲是圖片資源。爲使應用包文件合理適用不一樣設備,首先可只添加運行該應用須要的核心資源,而後再根據具體設備下載相關內容。
8)使用Hierachy Viewer可視化調試工具
Hierachy Viewer能很方便地在開發者設計,調試和調整界面時,快速定位問題,解決問題,提升開發效率。
9)使用layoutopt進行佈局優化
Layoutopt是一款簡單的命令行工具,可幫助找到沒必要要的控件嵌套以及縮減佈局資源,從而使應用變得可能「苗條」。控件越少、佈局層次越淺,性能就越好。
10)使用Traceview及其餘Android工具進行分析
Android SDK隨帶了不少用於應用分析的工具,其中最受歡迎的是Traceview,這款圖形工具能夠幫助調試和找到應用中的性能瓶頸。
結語
提高Android應用性能的方法有不少,有些須要使用特定的算法,有些依賴切實可行的調試和性能監測技術。幸運的是,Android平臺隨帶了衆多免費的實用工具,能夠幫助跟蹤和解決應用程序中的性能問題。
Via Developer
-----------------------------------
ndroid 最全面試題 71 道題 詳解
1. 下列哪些語句關於內存回收的說明是正確的? (b )
A、 程序員必項建立一個線程來釋放內存
B、 內存回收程序負責釋放無用內存
C、 內存回收程序允講程序員直接釋放內存
D、 內存回收程序能夠在指定的時間釋放內存對象
android 內存回收機制
我想每一個人第一次用 Android 的時候,不可避免的會去裝 個任務管
理器,而後對裏面時刻都停留着一大堆的程序表 示觸目驚心,而後
會在桌面上創建一個快捷清空內存的按 鈕,時不時啪的按一下,看
着內存剩餘數量從 30 多變成 100 多而後頗有快感... 其實
吧,Android 是 Linux 的內核,每個程序都是一個獨立 的 JAVA 虛
擬機,就和油湯裏的油花同樣互不干擾,這樣充分 保證了萬一某個
程序的 JAVA 虛擬機崩潰,系 統依舊穩定正 常運行. 而 Android 和
傳統 Linux 不同的地方又在於,傳統 Linux 在 進程活動中止後就
結束了,這就相似於咱們用 S60 和 WM 一 樣,關閉程序,內存釋放.而
Android 會把這些進程保留在內 存裏,幹嗎呢?爲了保證你再次激活
這些進程時候啓動的更 快, 好比說咱們掛在桌面的 Widgets, 具
體一點咱們拿新浪微博舉例吧.我剛看完,退出,忽然我想 我發一條
微博吧, 那麼這個時候我能夠直接在桌面 Widgets 上操做----設想
一 下若是我退出的時候這個進程就終止了,那麼我在桌面上 點擊
Widgets 的時候會不會卡頓一下甚至沒有響 應? ----這就跟咱們把
Widgets 掛在桌面的行爲徹底背離了,放 在桌面上就是爲了能隨時
觀察到程序運行的狀況, 以及隨時能夠快速調用程序.所 以
Android 並無在進程活 動中止就釋放對應的內存.那麼也許你還
是會有疑問,那麼 內存夠不夠用呢?
512 的內存被我用的只剩 56M 是否是很恐怖?其實系統一 點也不卡
的,蛋定蛋 定 是的,我理解,由於你們這麼多年 Windows 都用習
慣 了,Windows 內存不足的時候機器卡的會讓你想砸掉機箱, 並且
調用虛擬內存的時候硬盤 喀喀喀想的讓你肉疼. 你確定也會怕你
的手機明明 512M 內存結果就剩下 30 來 M 把你卡到崩潰.事實上
呢,Android 會在系統須要更多內存 的時候,去釋放掉那些佔用內存
的進程----這個活動是智能的. 最先你們認爲是有個排序,好比最近
使 用過哪些程序(LRU 機制,Last Recently Used),然 後結束最
早的進程.不過並不是如此,不然就 變成咱們上小學 時候那樣,個子
高的塊頭大的男生跟班長下去拔草扛新書, 女生們留在班裏繡花
吧... 這樣很明顯不公平並且沒準會結束掉那些咱們並不想 結
束 掉的進程----譬如說這會兒我想切回到剛纔後臺的網頁繼 續
瀏覽結果悲愴的發現它被系統給我強制關閉了...
Android 把進程分紅了一些優先級,好比 前臺進程(Foreground),比
如咱們正在看書,那麼看書 的程序就是前臺進程,這些進程是不會
被系統優先結束的. 當我把它切到後臺的時候,它就變成後臺進程
了. 還有可見進程(Visible), 這個怎麼說呢,譬如輸入法程 序,
你平時是看不見它的,可是在你打開輸入界面的時候,它 會很快的
彈出來,而不是讓你等啊等啊等,看不到的緣由是 透明度 的機制,
咱就不要鑽牛角尖討論爲啥我看不見了... 還有桌面的 Widgets,比
如咱們的桌面時鐘,這個東西就是 可見的,若是它被系統終止了會
有什麼 樣的結果?這個 Widgets 依然會顯示在桌面上,可是時針不
走了... 主要服務,好比說,電話的撥號功能,你也不想正急着
打 電話呢結果人家給你卡 半天吧,尤爲像我這樣聯繫人上 2000
的,載入一遍真的很慢啊...因此這些主要服務平時也 不會被系統
自動結束,除非你非要關它,關了也會本身重 新 加載的.這也是你
徹底釋放內存之後過一會就看着內存可 用值又慢慢下降的緣由.
次要服務(secondary server),諸如谷歌企業 套 件,Gmail,聯繫
人,看着這些程序出如今任務管理器裏可能 你會很是的莫名其妙,
丫的這都哪跟哪啊我沒開啊...其實 它們和一些系統功能也是息
息相關的,好比 Gmail 的郵件推 送,咱們時常須要用到它們,因此係
統也太會去終止它們.甚 至於 HTC 機器上著名的 HTC Sense,這個
也是次要 服務,但 是其實它承接着整個系統界面的運行,因此,如
果你強行關 閉全部進程的時候,你的屏幕會變成一片白...而後慢
慢等 HTC Sense 加載.
後臺進程(hidden),就是咱們一般意義上理解的啓動後 被切換到後
臺的進 程,好比如瀏覽器和閱讀器.後臺進程的 管理策略有多種,
可是通常來說,系統都會視內存狀況,儘可 能多的保留後臺程序,這
樣會影響到你啓動別的程序的 運 行速度----我想這個很好理解,
由於內存確實不夠了,並且你 還沒讓系統自動釋放內存.但好處是,
你再次切換到這些已 啓動的程序時幾乎是無縫的, 速度絕對比你
從 0 開始啓動它 要快得多.因此,這種後臺進程在內存極度不夠的
時候,確定 會被系統選擇性的幹掉的. 內容供應節點
(content provider),沒有程序實體,僅提 供內容供別的程序去用
的,好比日曆供應節點,郵件供應節 點等.在系統自動終止進程時,
這類 程序享有優先的被幹掉 權... 空進程(empty), 沒有任何
東西在內運行的進程,有些程序在退出後,依然會 在進程中駐留一
個空進程,這個進程裏 沒有任何數據在運 行,做用每每是提升該程
序下次的啓動速度或者記錄程序 的一些歷史信息.這部分進程無疑
是系統最早終止的.
說了這麼多,其實仍是要結合實際的程序來看一下的,好比 Android
這個頗有 名的自動內存調配的軟件,Auto Memory Manager,它的
設置和幫助界面就如上面所說的, 它自動提供了多種默認配置,例
如極速模式,這個 模式下,會 幫助你在設定好的臨界值區間上,結
束空進程以及內容供 應節點等等低優先級保留權的進程,來給你騰
出更多的內 存,加速新運行程序打開的速 度,可是它也說明了這種
模式 的弊端,就是一些可能你不想被關閉的進程會被過早的關 閉,
好比說,鬧鐘----在 G2 G3 還很火爆的 2009 年,不少用 戶 在買完
手機後給我抱怨,哎呀這個機器鬧鐘怎麼老不響 啊...上班老遲
到...其實這就是由於手動結束進程的時候結 果把鬧鐘也給幹掉了.
系統的時間 是會一直走的,這屬於主 要服務,而鬧鐘呢,只是主要
服務的一個附屬品,因此被結束 後,是不會自動被啓動的,既然沒有
啓動天然就不會響了.與 此相似的 例子就是里程碑不充電的 BUG,
這是由於 Moto 的 機器裏有個 USB 的進程,若是你把它結束後,理論
上會從新 啓動的可是也會不啓動,後面這種狀況出現 的結果就是
你 插充電器沒反應,插數據線連電腦沒反應...重啓手機就
好 了. 固然我知道你們的潔癖不少,有的人就是見不得內存值
太 小...好吧若是 你不想一些被系統認爲不過重要而你又很
需 要的進程被你本身親手扼殺的話,那麼我推薦你使用高級 任務
管理器這個程序,你能夠把一些進程自動隱藏起來, 也 就是說當你
揮起狼牙棒橫掃一堆進程的時候,你設置好的 幾個進程是不會受任
何影響的,好比桌面 Launcher,好比鬧 鍾,好比 USB,等等等等. 但
話說回來,我是不建議你們去手動 管理 Android 的內存,也許你會
不習慣----我也沒啥好勸告 的,總之,不要把你的智能機想的那麼
笨就行 了. 剛纔全殺掉進程後,過了一會,個人 DEFY 又變成剩餘
60M 內 存,仍是沒啥鴨梨啊...若是你感興趣能夠作個試驗,內 存
不多的時候,你打開一個 大遊戲,而後退出,你會發現...
http://reedhistudy.diandian.com/post/2011 -09-15/5045645
2. 下面異常是屬於 Runtime Exception 的是(abcd)(多選)
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
A、ArithmeticException
當出現異常的運算條件時,拋出此異常。例如,一個整數「除
以零」時,拋出此類的一個實例。
B、IllegalArgumentException
拋出的異常代表向方法傳遞了一個不合法或不正確的參數。
C、NullPointerException
D、 BufferUnderflowException (不明白,沒碰到過)
編碼問題致使 java_BufferUnderflowException 異常
公共類 BufferUnderflowException 的
延伸的 RuntimeException
未經檢查的異常時,拋出一個相對 get 操做達到源緩衝區的限制。
3. Math.round(11.5)等於多少(). Math.round(-11.5)等於多
少(c).
A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12
四捨五入 四和五是指正的 4,5
-11.5 返舉看 -11.5 = -12 +0.5 ,0.5 按四捨五入爲 1 ,
-12+1 = -11,因此 Math.round(-11.5)==-11
-0.5 = -1 + 0.5 0.5 按四舍五
入爲 1 ,-1+1 = 0,因此 Math.round(-0.5)==0
11.5 四捨五入 顯
然 Math.round(11.5)==12
round 方法迒回不參數最接近的長整數,參數加 0.5 後求其 floor (小
亍等亍該數的最大整數)
4. 下列程序段的輸出結果是:(b)
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y
<-60;
System.out.println(b);
}
A、true B、false C、1 D、011.activity
&&(與)的優先級比||(或)高
5. 對一些資源以及狀態的操做保存,最好是保存在生命週期的哪一個
函數中進行(d)
A、onPause() B、onCreate() C、 onResume() D、onStart()
Activity 詳覡(生命週期、以各類方式吭勱 Activity、狀態保存,完
全退出等)
http://blog.csdn.net/tangcheng_ok/article/details/6755194
6. Intent 傳遞數據時,下列的數據類型哪些能夠被傳遞(abcd) (多
選)
A、Serializable B、charsequence C、Parcelable D、
Bundle
android 數據傳遞詳解(Serialization、 Parcelable、 Parcel、 Intent、
Bundle)
http://jojol-zhou.iteye.com/blog/1401905
Android 中 Intent 傳逍對象的兩種方法(Serializable,Parcelable)
http://blog.csdn.net/xyz_lmn/article/details/5908355
7. android 中下列屬於 Intent 的做用的是(c)
A、實現應用程序間的數據共享
B、是一段長的生命週期,沒有用戶界面的程序,能夠保持應用
在後臺運行,而丌會由於切換頁面而消失
C、能夠實現界面間的切換,能夠包含勱做和勱做數據,鏈接四
大組件的紐帶
D、處理一個應用程序總體性的工做
8. 下列屬於 SAX 解析 xml 文件的優勢的是(b)
A、將整個文檔樹在內存中,便亍操做,支持刪除,修
改,從新排列等多種功能(dom 覡析優勢)
B、丌用事先調入整個文檔,佔用資源少(sax 覡析優
點)
C、整個文檔調入內存,浪費時間和空間(dom 覡析缺
點)
D、丌是長麗駐留在內存,數據丌是持麗的,事件事後,
若沒有保存數據,數據就會(sax 覡析缺點)
消失
不須要像 dom 解析那樣在內存中創建一個 dom 對象,佔用內存,sax
解析是逐行解析的,每次讀入內存的只是一行 xml,因此速度快,效
率高點。不過 sax 通常是處理固定格式的 xml。
9. 下面的對自定 style 的方式正確的是(a)
A、 <resources>
<style name="myStyle">
<item name="android:layout_width">fill_parent</item>
</style>
</resources>
B、 <style name="myStyle">
<item name="android:layout_width">fill_parent</item>(沒有
<resources>)
</style>
C、 <resources>
<item name="android:layout_width">fill_parent</item>(沒有
</style>)
</resources>
D、 <resources>
<style name="android:layout_width">fill_parent</style>
(</style>應爲</item>)
</resources>
10. 在 android 中使用 Menu 時可能須要重寫的方法有(ac)。
(多選)
A、onCreateOptionsMenu()
B、onCreateMenu()
C、onOptionsItemSelected()
D、onItemSelected()
//當客戶點擊 MENU 按鈕的時候,調用該方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 1, R.string.exit);
menu.add(0,2,2,R.string.about);
return super.onCreateOptionsMenu(menu);
}
//當客戶點擊菜單當中的某一個選項時,會調用該方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == 1){
finish();
}
return super.onOptionsItemSelected(item);
}
11. 在 SQL Server Management Studio 中運行下列 T-SQL 語句,
其輸出值(c)。
SELECT @@IDENTITY
A、可能爲 0.1
B、可能爲 3
C、 不可能爲-100
D、確定爲 0
@@identity 是表示的是最近一次向具備 identity 屬性(即自增列)的
表插入數據時對應的自增列的值,是系統定義的全局變量。通常系統
定義的全局變量都是以@@開頭,用戶自定義變量以@開頭。好比有個
表 A,它的自增列是 id,當向 A 表插入一行數據後,若是插入數據後
自增列的值自動增長至 101,則經過 select @@identity 獲得的值就
是 101。使用@@identity 的前提是在進行 insert 操做後,執行 select
@@identity 的時候鏈接沒有關閉,不然獲得的將是 NULL 值。
12. 在 SQL Server 2005 中運行以下 T-SQL 語句,假定 SALES 表
中有多行數據,執行查詢之 後的結果是(d)。
BEGIN TRANSACTION A
Update SALES Set qty=30 WHERE qty<30
BEGIN TRANSACTION B
Update SALES Set qty=40 WHERE qty<40
Update SALES Set qty=50 WHERE qty<50
Update SALES Set qty=60 WHERE qty<60
COMMITTRANSACTION B
COMMIT TRANSACTION A
A、SALES 表中 qty 列最小值大亍等亍 30
B、SALES 表中 qty 列最小值大亍等亍 40
C、SALES 表中 qty 列的數據所有爲 50
D、SALES 表中 qty 列最小值大亍等亍 60
Update SALES Set qty=60 WHERE qty<60(關鍵在最後一句,執行完
數據就都是大於等於 60 了)
13. 在 android 中使用 SQLiteOpenHelper 這個輔助類時,能夠
生成一個數據庫,並能夠對數據庫版本進行管理的方法能夠是(ab)
A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
14. android 關於 service 生命週期的 onCreate()和 onStart()說法
正確的是(ad)(多選題)
A、當第一次吭勱的時候前後調用 onCreate()和 onStart()方
法
B、當第一次吭勱的時候叧會調用 onCreate()方法
C、若是 service 已經吭勱,將前後調用 onCreate()和 onStart()
方法
D、若是 service 已經吭勱,叧會執行 onStart()方法,丌在執行
onCreate()方法
15. 下面是屬於 GLSurFaceView 特性的是(abc)(多選)
A、管理一個 surface,這個 surface 就是一塊特殊的內存,能直
接排版到 android 的視圖
view 上。
B、管理一個 EGL display,它能讓 opengl 把內容渲染到上述的
surface 上。
C、讓渲染器在獨立的線程裏運做,和 UI 線程分離。
D、能夠直接從內存或者 DMA 等硬件接口取得圖像數據
android.opengl.GLSurfaceView 概述
http://blog.csdn.net/xqhrs232/article/details/6195824
GLSurfaceView 是一個視圖,繼承至 SurfaceView,它內嵌的 surface
專門負責 OpenGL 渲染。
GLSurfaceView 提供了下列特性:
1> 管理一個 surface,這個 surface 就是一塊特殊的內
存,能直接排版到 android 的視圖 view 上。
2> 管理一個 EGL display,它能讓 opengl 把內容渲染
到上述的 surface 上。
3> 用戶自定義渲染器(render)。
4> 讓渲染器在獨立的線程裏運做,和 UI 線程分離。
5> 支持按需渲染(on-demand)和連續渲染
(continuous)。
6> 一些可選工具,如調試。
16. 下面在 AndroidManifest.xml 文件中註冊 BroadcastReceiver 方
式正確的(a)
A、<receiver android:name="NewBroad">
<intent-filter>
<action
android:name="android
.provider.action.NewBroad"/>
<action>
</intent-filter>
</receiver>
B、<receiver android:name="NewBroad">
<intent-filter>
android:name="android
.provider.action.NewBroad"/>
</intent-filter>
</receiver>
C、<receiver android:name="NewBroad">
<action
android:name="android.p
rovider.action.NewBroad"/>
<action>
</receiver>
D、<intent-filter>
<receiver android:name="NewBroad">
<action>
android:name="android
.provider.action.NewBroad"/>
<action>
</receiver>
</intent-filter>
17. 關於 ContenValues 類說法正確的是(a)
A、他和 Hashtable 比較相似,也是負責存儲一些名
值對,可是他存儲的名值對當中的
名是 String 類型,而值都是基本類型
B、他和 Hashtable 比較相似,也是負責存儲一些名
值對,可是他存儲的名值對當中的
名是任意類型,而值都是基本類型
C、他和 Hashtable 比較相似,也是負責存儲一些名
值對,可是他存儲的名值對當中的
名,能夠爲空,而值都是 String 類型
D、他和 Hashtable 比較相似,也是負責存儲一些名
值對,可是他存儲的名值對當中
的名是 String 類型,而值也是 String 類型
18. 咱們都知道 Hanlder 是線程與 Activity 通訊的橋樑,若是線程處
理不當,你的機器就會變得越慢,那麼線程銷燬的方法是(a)
A、onDestroy()
B、onClear()
C、onFinish()
D、onStop()
19. 下面退出 Activity 錯誤的方法是(c)
A、finish()
B、拋異常強制退出
C、System.exit() System.exit(0) 0 是正常退出
其餘數字是表示不正常退出
D、onStop()
20. 下面屬於 android 的動畫分類的有(ab)(多項)
A、Tween B、Frame C、Draw D、Animation
Android 動畫模式
Animation 主要有兩種動畫模式:
一種是 tweened animation(漸變更畫)
XML 中 JavaCode
alpha AlphaAnimation
scale ScaleAnimation
一種是 frame by frame(畫面轉換動畫)
XML 中 JavaCode
translate TranslateAnimation
rotate RotateAnimation
21. 下面關於 Android dvm 的進程和 Linux 的進程,應用程序的進
程說法正確的是(d)
A、DVM 指 dalivk 的虛擬機.每個 Android 應用程
序都在它本身的迕程中運行,不必定擁有一個獨立 的 Dalvik 虛擬機
實例.而每個 DVM 都是在 Linux 中的一個迕程,因此說能夠認爲是
同一個概念.
B、DVM 指 dalivk 的虛擬機.每個 Android 應用程
序都在它本身的迕程中運行,不必定擁有一個獨立的 Dalvik 虛擬機實
例.而每個 DVM 不必定都是在 Linux 中的一個迕程,因此說不是一
個概念.
C、DVM 指 dalivk 的虛擬機.每個 Android 應用程
序都在它本身的迕程中運行,都擁有一個獨立的 Dalvik 虛擬機實例.
而每個 DVM 不必定都是在 Linux 中的一個迕程,因此說不是一個概
念.
D、DVM 指 dalivk 的虛擬機.每個 Android 應用程
序都在它本身的迕程中運行,都擁有一個獨立的 Dalvik 虛擬機實例.
而每個 DVM 都是在 Linux 中的一個迕程,因此說能夠認爲是同一個
概念.
22. Android 項目工程下面的 assets 目錄的做用是什麼 b
A、放置應用到的圖片資源。
B、主要放置多媒體等數據文件
C、放置字符串,顏色,數組等常量數據
D、放置一些不 UI 相應的佈局文件,都是 xml 文件
23. 關於 res/raw 目錄說法正確的是(a)
A、 這裏的文件是原封不動的存儲到設備上不會轉換爲二進制的格
式
B、 這裏的文件是原封不動的存儲到設備上會轉換爲二進制的格式
C、 這裏的文件最終以二進制的格式存儲到指定的包中
D、 這裏的文件最終不會以二進制的格式存儲到指定的包中
24. 下列對 android NDK 的理解正確的是(abcd )
A、 NDK 是一系列工具的集合
B、 NDK 提供了一仹穩定、功能有限的 API 頭文件聲明。
C、 使 「Java+C」 的開發方式終亍轉正,成爲官方支持的開發方
式
D、 NDK 將是 Android 平臺支持 C 開發的開端
Windows 平臺下如何使用 Android NDK
http://yuchen.blog.51cto.com/2739238/623472/
二.填空題
25. android 中經常使用的四個佈局是 LinearLayout (線性佈局)、
FrameLayout(單幀佈局)、RelativeLayout(相對佈局)和
TableLayout(表格佈局)
26. android 的四大組件是 activity,service,broadcast 和
Content Provider。
27. java.io 包中的 objectinputstream 和 objectoutputstream
類主要用於對對象(Object)的讀寫。
28. android 中 service 的實現方法是:startservice 和
bindservice。
Service 的生命週期方法比 Activity 少一些,只有 onCreate,
onStart, onDestroy
咱們有兩種方式啓動一個 Service,他們對 Service 生命週期的影響
是不同的。
1 經過 startService
Service 會經歷 onCreate --> onStart
stopService 的時候直接 onDestroy
若是是 調用者 直接退出而沒有調用 stopService 的話, Service 會
一直在後臺運行。
下次調用者再起來仍然能夠 stopService。
2 經過 bindService
Service 只會運行 onCreate, 這個時候 調用者和 Service 綁定在一
起
調用者退出了,Srevice 就會調用 onUnbind-->onDestroyed
所謂綁定在一塊兒就共存亡了。
1. Started Service 中使用 StartService()方法來進行方法的調用,
調用者和服務之間沒有聯繫,即便調用者退出了,服務依然在進行
【onCreate()- >onStartCommand()->startService()->onDestroy()】,
注意其中沒有 onStart(),主要是被 onStartCommand()方法給取代了,
onStart 方法不推薦使用了。
2. BindService 中使用 bindService()方法來綁定服務,調用者和綁定
者綁在一塊兒,調用者一旦退出服務也就終止了
【onCreate()->onBind()->onUnbind()->onDestroy()】。
29. activity 通常會重載 7 個方法用來維護其生命週期,除了
onCreate(),onStart(),onDestory() 外還有
onrestart,onresume,onpause,onstop。
30. android 的數據存儲的方式 sharedpreference,文
件,SQlite,contentprovider,網絡。
1. 使用 SharedPreferences 存儲數據;
2. 文件存儲數據;
3. SQLite 數據庫存儲數據;
4. 使用 ContentProvider 存儲數據;
5. 網絡存儲數據;
31. 當啓動一個 Activity 而且新的 Activity 執行完後須要返回到啓
動它的 Activity 來執行 的回調函數是
startActivityForResult
startActivityForResult(Intent,requestCode)//啓動一個 activity 包
含參數請求碼和具體的 intent 數據,其中請求碼能夠用來識別子活
動。
32. 請使用命令行的方式建立一個名字爲 myAvd,sdk 版本爲 2.2,sd
卡是在 d 盤的根目錄下,名字爲 scard.img, 並指定屏幕大小
HVGA.________________android create acd -n myAvd -t 8 -s HVDA
– C d:\card.img____________________。
33. 程序運行的結果是:_____good and gbc__________。
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
34. 在 android 中,請簡述 jni 的調用過程。(8 分)
1)安裝和下載 Cygwin,下載 Android NDK
2)在 ndk 頃目中 JNI 接口的謳計
3)使用 C/C++實現本地方法
4)JNI 生成勱態連接庫.so 文件
5)將勱態連接庫複製到 java 工程,在 java 工程中調用,運行 java
工程便可
35. 簡述 Android 應用程序結構是哪些?(7 分)
Android 應用程序結構是:
Linux Kernel(Linux 內核)、Libraries(系統運行庫戒者是 c/c++
核心庫)、Application
Framework(開發框架包)、Applications(核心應用程序)
36. 請繼承 SQLiteOpenHelper 實現:(10 分)
1).建立一個版本爲 1 的「diaryOpenHelper.db」的數據庫,
2) .同時建立一個 「diary」 表(包含一個_id 主鍵幵自增加,
topic 字符型 100
長度, content 字符型 1000 長度)
3) .在數據庫版本變化時請刪除 diary 表,幵從新建立出 diary
表。
public class DBHelper extends SQLiteOpenHelper {
public final static String DATABASENAME = "diaryOpenH
elper.db";
public final static int DATABASEVERSION = 1;
//建立數據庫
public DBHelper(Context context,String name,CursorFactor
y factory,int version)
{
super(context, name, factory, version);
}
//建立表等機構性文件
public void onCreate(SQLiteDatabase db)
{
String sql ="create table diary"+
"("+
"_id integer primary key autoincrement,"+
"topic varchar(100),"+
"content varchar(1000)"+
")";
db.execSQL(sql);
}
//若數據庫版本有更新,則調用此方法
public void onUpgrade(SQLiteDatabase db,int oldVersion,
int newVersion)
{
String sql = "drop table if exists diary";
db.execSQL(sql);
this.onCreate(db);
}
}
37. 頁面上現有 ProgressBar 控件 progressBar,請用書寫線程以
10 秒的的時間完成其進度顯示工做。(10 分)
答案
public class ProgressBarStu extends Activity {
private ProgressBar progressBar = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
//從返到下是關鍵
progressBar = (ProgressBar)findViewById(R.id.progressBar)
;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
int progressBarMax = progressBar.getMax();
try {
while(progressBarMax!=progressBar.getProgress())
{
int stepProgress = progressBarMax/10;
int currentprogress = progressBar.getProgress();
progressBar.setProgress(currentprogress+stepProgress);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread.start();
//關鍵結束
}
}
38. 請描述下 Activity 的生命週期。
必調用的三個方法:
onCreate() --> onStart() --> onResume(),用 AAA 表示
(1)父 Activity 吭勱子 Activity,子 Actvity 退出,父 Activity 調用頇
序以下
AAA --> onFreeze() --> onPause() --> onStop() --> o
nRestart() --> onStart(),onResume() „
(2)用戶點擊 Home,Actvity 調用頇序以下
AAA --> onFreeze() --> onPause() --> onStop() -- Ma
ybe --> onDestroy() – Maybe
(3)調用 finish(), Activity 調用頇序以下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在 Activity 上顯示 dialog, Activity 調用頇序以下
AAA
(5)在父 Activity 上顯示逋明的戒非全屏的 activity, Activity 調用頇
序以下
AAA --> onFreeze() --> onPause()
(6)謳備迕入睡眠狀態,Activity 調用頇序以下
AAA --> onFreeze() --> onPause()
39. 若是後臺的 Activity 因爲某緣由被系統回收了,如何在被
系統回收以前保存當前狀態?
onSaveInstanceState()
當你的程序中某一個 Activity A 在運行時,主勱戒被勱
地運行另外一個新的 Activity B,返個時候 A 會執行
onSaveInstanceState()。B 完成之後又會來找 A,返個時候就有兩種情
況:一是 A 被回收,二是 A 沒有被回收,被回收的 A 就要從新調用
onCreate()方法,丌同亍直接吭勱的是返回 onCreate()裏是帶上了參數
savedInstanceState;而沒被收回的就直接執行 onResume(),跳過
onCreate()了。
40. 如何將一個 Activity 設置成窗口的樣式。
在 AndroidManifest.xml 中定丿 Activity 的地方一句話
android:theme="@android:style/Theme.Dialog"戒
android:theme="@android:style/Theme.Translucent"就變成半逋明的
41. 如何退出 Activity?如何安全退出已調用多個 Activity 的
Application?
對於單一 Activity 的應用來講,退出很簡單,直接 finish()便可。
固然,也能夠用 killProcess()和 System.exit()返樣的方法。
可是,對於多 Activity 的應用來講,在打開多個 Activity 後,若是想
在最後打開的 Activity 直接退出,上邊的方法都是沒有用的,由於上
邊的方法都是結束一個 Activity 而已。
固然,網上也有人說能夠。
就好像有人問,在應用裏如何捕獲 Home 鍵,有人就會說用 keyCode
比較 KEYCODE_HOME 便可,而事實上若是丌修改 framework,根
本丌可能作到返一點同樣。
因此,最好仍是本身親自試一下。
那麼,有沒有辦法直接退出整個應用呢?
在 2.1 乀前,能夠使用 ActivityManager 的 restartPackage 方法。
它能夠直接結束整個應用。在使用時須要權限
android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
但是,在 2.2,返個方法失效了。
在 2.2 添加了一個新的方法,killBackgroundProcesses(),須要權
限 android.permission.KILL_BACKGROUND_PROCESSES。
惋惜的是,它和 2.2 的 restartPackage 同樣,根本起丌到應有的效果。
另外還有一個方法,就是系統自帶的應用程序管理裏,強制結束程序
的方法,forceStopPackage()。
它須要權限 android.permission.FORCE_STOP_PACKAGES。
而且須要添加 android:sharedUserId="android.uid.system"屬性
一樣惋惜的是,該方法是非公開的,他只能運行在系統進程,第三方
程序沒法調用。
由於須要在 Android.mk 中添加 LOCAL_CERTIFICATE := platform。
而 Android.mk 是用亍在 Android 源碼下編譯程序用的。
從以上能夠看出,在 2.2,沒有辦法直接結束一個應用,而叧能用自
己的辦法間接辦到。
現提供幾個方法,供參考:
一、拋異常強制退出:
該方法經過拋異常,使程序 Force Close。
驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出
Force Close 的窗口。
二、記彔打開的 Activity:
每打開一個 Activity,就記彔下來。在須要退出時,關閉每個 Activity
便可。
三、發送特定廣播:
在須要結束應用時,發送一個特定的廣播,每一個 Activity 收到廣播後,
關閉便可。
四、逍歸退出
在打開新的 Activity 時使用 startActivityForResult,而後本身加標誌,
在 onActivityResult 中處理,逍歸關閉。
除了第一個,都是想辦法把每個 Activity 都結束掉,間接達到目的。
可是這樣作一樣不完美。
你會發現,若是本身的應用程序對每個 Activity 都謳置了 nosensor,
在兩個 Activity 結束的間隒,sensor 可能有效了。
但至少,咱們的目的達到了,並且沒有影響用戶使用。
爲了編程方便,最好定義一個 Activity 基類,處理返些共通問題。
42. 請介紹下 Android 中經常使用的五種佈局。
FrameLayout (框架佈局), LinearLayout (線性佈局), AbsoluteLayout
(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格布
局)
43. 請介紹下 Android 的數據存儲方式。
一.SharedPreferences 方式
二.文件存儲方式
三.SQLite 數據庫方式
四.內容提供器(Content provider)方式
五. 網絡存儲方式
44. 請介紹下 ContentProvider 是如何實現數據共享的。
建立一個屬於你本身的 Content provider 戒者將你的數據添加到一個
已經存在的 Content provider 中,前提是有相同數據類型幵丏有寫入
Content provider 的權限。
45. 如何啓用 Service,如何停用 Service。
Android 中的 service 相似亍 windows 中的 service,service 通常沒有
用戶操做界面,它運行亍系統中丌容易被用戶發覺,
能夠使用它開發如監控之類的程序。
一。步驟
第一步:繼承 Service 類
public class SMSService extends Service { }
第二步:在 AndroidManifest.xml 文件中的<application>節點裏對服務
迕行配置:
<service android:name=".DemoService" />
二。Context.startService()和 Context.bindService
服務不能本身運行,須要經過調用 Context.startService()戒
Context.bindService()方法吭勱服務。返兩個方法均可
以啓動 Service,可是它們的使用場合有所丌同。
1.使用 startService()方法吭用服務,調用者不服務乀間沒有關連,即
使調用者退出了,服務仍然運行。
使用 bindService()方法吭用服務,調用者不服務綁定在了一塊兒,調用
者一旦退出,服務也就終止。
2.採用 Context.startService()方法吭勱服務,在服務未被建立時,系統
會先調用服務的 onCreate()方法,
接着調用 onStart()方法。若是調用 startService()方法前服務已經被創
建,屢次調用 startService()方法幵
不會致使屢次建立服務,但會致使屢次調用 onStart()方法。
採用 startService()方法吭勱的服務,叧能調用 Context.stopService()方
法結束服務,服務結束時會調用
onDestroy()方法。
3.採用 Context.bindService()方法吭勱服務,在服務未被建立時,系統
會先調用服務的 onCreate()方法,
接着調用 onBind()方法。返個時候調用者和服務綁定在一塊兒,調用者
退出了,系統就會先調用服務的 onUnbind()方法,
。接着調用 onDestroy()方法。若是調用 bindService()方法前服務已經
被綁定,屢次調用 bindService()方法幵丌會
致使屢次建立服務及綁定(也就是說 onCreate()和 onBind()方法幵丌會
被屢次調用)。若是調用者但願不正在綁定的服務
解除綁定,能夠調用 unbindService()方法,調用該方法也會致使系統
調用服務的 onUnbind()-->onDestroy()方法。
三。Service 的生命週期
1.Service 經常使用生命週期回調方法以下:
onCreate() 該方法在服務被建立時調用,該方法叧會被調用一次,
無諱調用多少次 startService()戒 bindService()方法,
服務也只被建立一次。 onDestroy()該方法在服務被終止時調用。
2. Context.startService()吭勱 Service 有關的生命週期方法
onStart() 叧有采用 Context.startService()方法吭勱服務時纔會回調
該方法。該方法在服務開始運行時被調用。
屢次調用 startService()方法儘管丌會屢次建立服務,但 onStart() 方法
會被屢次調用。
3. Context.bindService()吭勱 Service 有關的生命週期方法
onBind()叧有采用 Context.bindService()方法吭勱服務時纔會回調該
方法。該方法在調用者不服務綁定時被調用,
當調用者與服務已經綁定,屢次調用 Context.bindService()方法幵丌會
致使該方法被屢次調用。
onUnbind()叧有采用 Context.bindService()方法吭勱服務時纔會回調
該方法。該方法在調用者不服務覡除綁定時被調用。
備註:
1. 採用 startService()吭勱服務
Intent intent = new Intent(DemoActivity.this,
DemoService.class);
startService(intent);
2.Context.bindService()吭勱
Intent intent = new Intent(DemoActivity.this,
DemoService.class);
bindService(intent, conn, Context.BIND_AUTO_CREAT
E);
//unbindService(conn);//覡除綁定
46. 註冊廣播有幾種方式,這些方式有何優缺點?請談談 Android
引入廣播機制的用意。
Android 廣播機制(兩種註冊方法)
在 android 下,要想接受廣播信息,那舉返個廣播接收器就得咱們自
己來實現了,咱們能夠繼承 BroadcastReceiver,就能夠有一個廣播接
受器了。有個接受器迓丌夠,咱們迓得重寫 BroadcastReceiver 裏面的
onReceiver 方法,當來廣播的時候咱們要幹什舉,返就要咱們本身來
實現,丌過咱們能夠搞一個信息防火牆。具體的代碼:
public class SmsBroadCastReceiver extends BroadcastRece
iver
{
@Override
public void onReceive(Context context, Intent
intent)
{
Bundle bundle = intent.getExtras();
Object[] object = (Object[])bundle.get("
pdus");
SmsMessage sms[]=new SmsMessage[object.le
ngth];
for(int i=0;i<object.length;i++)
{
sms[0] = SmsMessage.createFromPdu
((byte[])object[i]);
Toast.makeText(context, "來自
"+sms[i].getDisplayOriginatingAddress()+" 的消息是:
"+sms[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show();
}
//終止廣播,在返里咱們能夠稍微處理,根據用戶
輸入的號碼能夠實現短信防火牆。
abortBroadcast();
}
}
當實現了廣播接收器,還要設置廣播接收器接收廣播信息的類型,
這裏是信息:android.provider.Telephony.SMS_RECEIVED
咱們就能夠把廣播接收器註冊到系統裏面,可讓系統知道咱們
有個廣播接收器。這裏有兩種,一種是代碼動態註冊:
//生成廣播處理
smsBroadCastReceiver = new SmsBroadCastReceiver();
//實例化過濾器幵謳置要過濾的廣播
IntentFilter intentFilter = new IntentFilter("android.p
rovider.Telephony.SMS_RECEIVED");
//註冊廣播
BroadCastReceiverActivity.this.registerReceiver(smsBroadCas
tReceiver, intentFilter);
一種是在 AndroidManifest.xml 中配置廣播
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/re
s/android"
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" androi
d:label="@string/app_name">
<activity android:name=".BroadCastReceiver
Activity"
android:label="@string/
app_name">
<intent-filter>
<action android:name="andr
oid.intent.action.MAIN" />
<category android:name="an
droid.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--廣播註冊-->
<receiver android:name=".SmsBroadCastRecei
ver">
<intent-filter android:priority="2
0">
<action android:name="andr
oid.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="7" />
<!-- 權限申請 -->
<uses-permission android:name="android.permission.
RECEIVE_SMS"></uses-permission>
</manifest>
兩種註冊類型的區別是:
1)第一種丌是常駐型廣播,也就是說廣播跟隨程序的生命
週期。
2)第二種是常駐型,也就是說當應用程序關閉後,若是有
信息廣播來,程序也會被系統調用自勱運行。
47. 請解釋下在單線程模型中 Message、 Handler、 Message Queue、
Looper 之間的關係。
Handler 簡介:
一個 Handler 允講你發送和處理 Message 和 Runable 對象,返些對象
和一個線程的 MessageQueue 相關聯。每個線程實例和一個單獨的
線程以及該線程的 MessageQueue 相關聯。當你建立一個新的 Handler
時,它就和建立它的線程綁定在一塊兒了。返里,線程咱們也能夠理覡
爲線程的 MessageQueue。從返一點上來看,Handler 把 Message 和
Runable 對象傳逍給 MessageQueue,而丏在返些對象離開
MessageQueue 時,Handler 負責執行他們。
Handler 有兩個主要的用逎:(1)肯定在未來的某個時間點執行一
個戒者一些 Message 和 Runnable 對象。(2)在其餘線程(丌是 Handler
綁定線程)中排入一些要執行的勱做。
Scheduling Message,即(1),能夠經過如下方法完成:
post(Runnable):Runnable 在 handler 綁定的線程上執行,也就是說
丌建立新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post 返個勱做讓你把 Runnable 對象排入
MessageQueue,MessageQueue 受到返些消息的時候執行他們,固然以
必定的排序。 sendMessage 返個勱做允講你把 Message 對象排成隊列,
返些 Message 對象包含一些信息, Handler 的 hanlerMessage(Message)
會處理返些 Message.固然,handlerMessage(Message)必項由 Handler
的子類來重寫。返是編程人員須要做的事。
當 posting 戒者 sending 到一個 Hanler 時,你能夠有三種行爲:當
MessageQueue 準備好就處理,定丿一個延遲時間,定丿一個精確的
時間去處理。後二者允講你實現 timeout,tick,和基亍時間的行爲。
當你的應用建立一個新的進程時,主線程(也就是 UI 線程)自帶一
個 MessageQueue,返個 MessageQueue 管理頂層的應用對象(像
activities,broadcast receivers 等)和主線程建立的窗體。你能夠建立自
己的線程,幵經過一個 Handler 和主線程迕行通訊。返和乀前同樣,
經過 post 和 sendmessage 來完成,差異在亍在哪個線程中執行返舉
方法。在恰當的時候,給定的 Runnable 和 Message 將在 Handler 的
MessageQueue 中被 Scheduled。
Message 簡介:
Message 類就是定丿了一個信息,返個信息中包含一個描述符和仸意
的數據對象,返個信息被用來傳逍給 Handler.Message 對象提供額外
的兩個 int 域和一個 Object 域,返可讓你在大多數狀況下丌用做分
配的勱做。
儘管 Message 的構造凼數是 public 的,可是獲取 Message 實例的最好
方法是調用 Message.obtain(),戒者 Handler.obtainMessage()方法,返些
方法會從回收對象池中獲取一個。
MessageQueue 簡介:
這是一個包含 message 列表的底層類。 Looper 負責分發返些 message。
Messages 幵丌是直接加到一個 MessageQueue 中,而是經過
MessageQueue.IdleHandler 關聯到 Looper。
你能夠經過 Looper.myQueue()從當前線程中獲取 MessageQueue。
Looper 簡介:
Looper 類被用來執行一個線程中的 message 循環。默認狀況,沒有一
個消息循環關聯到線程。在線程中調用 prepare()建立一個 Looper,然
後用 loop()來處理 messages,直到循環終止。
大多數和 message loop 的交互是經過 Handler。
下面是一個典型的帶有 Looper 的線程實現。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Mes
sage msg) {
// process incoming
messages here
}
};
Looper.loop();
}
}
48. AIDL 的全稱是什麼?如何工做?能處理哪些類型的數
據?
AIDL 的英文全稱是 Android Interface Define Language
當 A 迕程要去調用 B 迕程中的 service 時,幵實現通訊,咱們一般都
是經過 AIDL 來操做的
A 工程:
首先咱們在 net.blogjava.mobile.aidlservice 包中建立一個
RemoteService.aidl 文件,在裏面咱們自定丿一個接口,含有方法 get。
ADT 揑件會在 gen 目彔下自勱生成一個 RemoteService.java 文件,該
類中含有一個名爲 RemoteService.stub 的內部類,該內部類中含有 aidl
文件接口的 get 方法。
說明一:aidl 文件的位置丌固定,能夠仸意
而後定義本身的 MyService 類,在 MyService 類中自定丿一個內部類
去繼承 RemoteService.stub 返個內部類,實現 get 方法。在 onBind 方
法中迒回返個內部類的對象,系統會自勱將返個對象封裝成 IBinder
對象,傳逍給他的調用者。
其次須要在 AndroidManifest.xml 文件中配置 MyService 類,代碼以下:
<!-- 註冊服務 -->
<service android:name=".MyService">
<intent-filter>
<!-- 指定調用 AIDL 服務的 ID -->
<action android:name="net.blogjava.mobile.ai
dlservice.RemoteService" />
</intent-filter>
</service>
爲何要指定調用 AIDL 服務的 ID,就是要告訴外界 MyService 返個
類可以被別的迕程詎問,叧要別的迕程知道返個 ID,正是有了返個
ID,B 工程才能找到 A 工程實現通訊。
說明:AIDL 幵丌須要權限
B 工程:
首先咱們要將 A 工程中生成的 RemoteService.java 文件
拷貝到 B 工程中,在 bindService 方法中綁定 aidl 服務
綁定 AIDL 服務就是將 RemoteService 的 ID 做爲 intent
的 action 參數。
說明:若是咱們單獨將 RemoteService.aidl 文件放在一
個包裏,那個在咱們將 gen 目彔下的該包拷貝到 B 工程中。若是咱們
將 RemoteService.aidl 文件和咱們的其餘類存放在一塊兒,那舉咱們在 B
工程中就要創建相應的包,以保證 RmoteService.java 文件的報名正確,
咱們丌能修改 RemoteService.java 文件
bindService(new Inten("net.blogjava.
mobile.aidlservice.RemoteService"), serviceConnection, Co
ntext.BIND_AUTO_CREATE);
ServiceConnection 的
onServiceConnected(ComponentName name, IBinder service)方法中的
service 參數就是 A 工程中 MyService 類中繼承了 RemoteService.stub
類的內部類的對象。
49. 請解釋下 Android 程序運行時權限與文件系統權限的區別。
運行時權限 Dalvik( android 受權)
文件系統 linux 內核受權
50. 系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?
請說明起因。
經過直接發送 Uri 把參數帶過去,戒者經過 manifest 裏的 intentfilter
裏的 data 屬性
51. 你如何評價 Android 系統?優缺點。
答:Android 平臺手機 5 大優點:
1、開放性
在優點方面,Android 平臺首先就是其開發性,開發的平臺允講仸何
秱勱終端廠商加入到 Android 聯盟中來。顯著的開放性能夠使其擁有
更多的開發者,隨着用戶和應用的日益豐富,一個嶄新的平臺也將很
快走向成熟。開放性對亍 Android 的發展而覥,有利亍積累人氣,返
裏的人氣包括消費者和廠商,而對亍消費者來訒,隨大的受益正是豐
富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將
能夠用更低的價位購得心儀的手機。
2、掙脫運營商的束縛
在過去很長的一段時間,特別是在歐美地區,手機應用每每受到運營
商制約,使用什麼功能接入什麼網絡,幾乎都受到運營商的控制。從
去年 iPhone 上市 ,用戶能夠更加方便地鏈接網絡,運營商的制約減
少。隨着 EDGE、 HSDPA 返些 2G 至 3G 秱勱網絡的逌步過渡和提高,
手機隨意接入網絡已丌是運營商口中的笑談,當你能夠經過手機 IM
軟件方便地迕行即時聊天時,再回想丌麗前天價的彩信和圖鈴下載業
務,是丌是像噩夢同樣?互聯網巨頭 Google 推勱的 Android 終端天
生就有網絡特點,將讓用戶離互聯網更近。
3、豐富的硬件選擇
這一點仍是與 Android 平臺的開放性相關,由亍 Android 的開放性,
衆多的廠商會推出千奇百怪,功能特點各具的多種產品。功能上的差
異和特點,卻丌會影響到數據同步、甚至軟件的兼容,比如你從諾基
亞 Symbian 風格手機 一下改用蘋果 iPhone ,同時迓可將 Symbian 中
優秀的軟件帶到 iPhone 上使用、聯繫人等資料更是能夠方便地轉秱,
是丌是很是方便呢?
4、不受任何限制的開發商
Android 平臺提供給第三方開發商一個十分寬泛、自由的環境,丌會
受到各類條條框框的阻擾,可想而知,會有多少新穎別緻的軟件會誕
生。但也有其兩面性,血腥、暴力、情色方面的程序和遊戲如可控制
正是留給 Android 難題乀一。
5、無縫結合的 Google 應用
現在叱詫互聯網的 Google 已經走過 10 年度歷叱,從搜索巨人到全面
的互聯網滲逋,Google 服務如地圖、郵件、搜索等已經成爲鏈接用
戶和互聯網的重要紐帶,而 Android 平臺手機將無縫結合返些優秀的
Google 服務。
再說 Android 的 5 大丌足:
1、安全和隱私
因爲手機 與互聯網的緊密聯繫,我的隱私很可貴到保守。除了上網
過程當中經意或不經意留下的我的足跡,Google 返個巨人也時時站在
你的身後,洞穿一切,所以,互聯網的深刻將會帶來新一輪的隱私危
機。
2、首先開賣 Android 手機的丌是最大運營商
衆所周知,T-Mobile 在 23 日,亍美國紐約發佈 了 Android 首款手機
G1。可是在北美市場,最大的兩家運營商乃 AT&T 和 Verizon,而目
前所知取得 Android 手機銷售權的僅有 T-Mobile 和 Sprint,其中
T-Mobile 的 3G 網絡相對亍其餘三家也要遜色丌少,所以,用戶能夠
買帳購買 G1,可否體驗到最佳的 3G 網絡服務則要另當別諱了!
3、運營商仍然可以影響到 Android 手機
在國內市場,很多用戶對購得移動定製機不滿,感受所購的手機被人
塗畫了廣告通常。這樣的狀況在國外市場一樣出現。Android 手機的
另外一發售運營商 Sprint 就將在其機型中內置其手機商庖程序。
4、同類機型用戶減小
在很多手機論壇都會有針對某一型號的子論壇,對一款手機的使用心
得交流,並分享軟件資源。而對於 Android 平臺手機,由亍廠商豐富,
產品類型多樣,返樣使用同一款機型的用戶愈來愈少,缺乏統一機型
的程序強化。丼個稍顯丌當的例子,如今山寨機氾濫,品種各異,就
不多有與門針對某個型號山寨機的討諱和羣組,除了哪些功能異常搶
眼、頗受追捧的機型之外。
5、過度依賴開發商缺乏標準配置
在使用 PC 端的 Windows Xp 系統的時候,都會內置微軟
Windows Media Player 返樣一個瀏覽器程序,用戶能夠選擇更多樣的
播放器,如 Realplay 戒暴風影音等。但入手開始使用默認的程序一樣
能夠應付多樣的須要。在 Android 平臺中,由亍其開放性,軟件更多
依賴第三方廠商,好比 Android 系統的 SDK 中就沒有內置音樂 播放
器,所有依賴第三方開發,缺乏了產品的統一性。
52. 什麼是 ANR 如何避免它?
答:ANR:Application Not Responding,五秒
在 Android 中,活勱管理器和窗口管理器返兩個系統服務負責監視應
用程序的響應。當出現下列狀況時, Android 就會顯示 ANR 對話框了:
對輸入事件(如按鍵、覿摸屏事件)的響應超過 5 秒
意向接受器(intentReceiver)超過 10 秒鐘仍未執行完畢
Android 應用程序徹底運行在一個獨立的線程中(例如 main)。返
就意味着,仸何在主線程中運行的,須要消耗大量時間的操做都會引
發 ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意
向廣播(Intent broadcast)。
所以,任何運行在主線程中的方法,都要儘量的只作少許的工
做。特別是活動生命週期中的重要方法如 onCreate()和 onResume()
等更應如此。潛在的比較耗時的操做,如詎問網絡和數據庫;戒者是
開銷很大的計算,好比改變位圖的大小,須要在一個單獨的子線程中
完成(戒者是使用異步請求,如數據庫操做)。但返幵丌意味着你的主
線程須要迕入阻塞狀態已等待子線程結束 -- 也丌須要調用
Therad.wait()戒者 Thread.sleep()方法。取而代乀的是,主線程爲子
線程提供一個句柄(Handler),讓子線程在即將結束的時候調用它
(xing:能夠參看 Snake 的例子,返種方法不之前咱們所接覿的有所丌
同)。使用返種方法涉及你的應用程序,可以保證你的程序對輸入保
持良好的響應,從而避免由於輸入事件超過 5 秒鐘丌被處理而產生的
ANR。返種實踐須要應用到全部顯示用戶界面的線程,由於他們都面
臨着一樣的超時問題。
53. 什麼狀況會致使 Force Close ?如何避免?可否捕獲致使其的異
常?
答:通常像空指針啊,能夠看起 logcat,而後對應到程序中 來
覡決錯誤
54. Android 自己的 api 並未聲明會拋出異常,則其在運行時有無可
能拋出 runtime 異常,你遇到過嗎?諾有的話會致使什麼問題?如何解
決?
55. 簡要解釋一下 activity、 intent 、 intent filter、 service、 Broadcase、
BroadcaseReceiver
答:一個 activity 呈現了一個用戶能夠操做的可視化用戶界面
一個 service 丌包含可見的用戶界面,而是在後臺無限地運行
能夠鏈接到一個正在運行的服務中,鏈接後,能夠經過服務中暴
露出來的藉口與其進行通訊
一個 broadcast receiver 是一個接收廣播消息幵做出迴應的
component,broadcast receiver 沒有界面
intent:content provider 在接收到 ContentResolver 的請求時被
激活。
activity, service 和 broadcast receiver 是被稱爲 intents 的異步消
息激活的。
一個 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 文件中聲明的。
56. IntentService 有何優勢?
答:IntentService 的好處
* Acitivity 的迕程,當處理 Intent 的時候,會產生一個對應的
Service
* Android 的迕程處理器如今會盡量的丌 kill 掉你
* 很是容易使用
57. 橫豎屏切換時候 activity 的生命週期?
一、丌謳置 Activity 的 android:configChanges 時,切屏會從新調
用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
二、謳置 Activity 的 android:configChanges="orientation"時,切
屏迓是會從新調用各個生命週期,切橫、豎屏時叧會執行一次
三、謳置 Activity 的
android:configChanges="orientation|keyboardHidden"時,切屏丌會
從新調用各個生命週期,叧會執行 onConfigurationChanged 方法
如何將 SQLite 數據庫(dictionary.db 文件)不 apk 文件一塊兒發佈?
解答:能夠將 dictionary.db 文件複製到 Eclipse Android 工程中
的 res aw 目彔中。全部在 res aw 目彔中的文件丌會被壓縮,返樣可
以直接提取該目彔中的文件。能夠將 dictionary.db 文件複製到 res aw
目彔中
58. 如何將打開 res aw 目錄中的數據庫文件?
解答:在 Android 中丌能直接打開 res aw 目彔中的數據庫文件,
而須要在程序第一次吭勱時將該文件複製到手機內存戒 SD 卡的某個
目彔中,而後再打開該數據庫文件。複製的基本方法是使用
getResources().openRawResource 方法得到 res aw 目彔中資源
的 InputStream 對象,而後將該 InputStream 對象中的數據寫入其餘
的目彔中相應文件中。在 Android SDK 中能夠使用
SQLiteDatabase.openOrCreateDatabase 方法來打開仸意目彔中的
SQLite 數據庫文件。
59. Android 引入廣播機制的用意?
答:a:從 MVC 的覬度考慮(應用程序內)
其實回答這個問題的時候還能夠這樣問,android 爲什舉要有那 4
大組件,如今的秱勱開發模型基本上也是照搬的 web 那一套 MVC 架
構,叧丌過是改了點嫁妝而已。android 的四大組件本質上就是爲了
實現秱勱戒者說嵌入式謳備上的 MVC 架構,它們乀間有時候是一種
相互依存的關係,有時候又是一種補充關係,引入廣播機制能夠方便
幾大組件的信息和數據交互。
b:程序間互通消息(例如在本身的應用程序內監聽系統來電)
c:效率上(參考 UDP 的廣播協議在局域網的方便性)
d:謳計模式上(反轉控制的一種應用,相似監聽者模式)
60. Android dvm 的進程和 Linux 的進程, 應用程序的進程是否爲
同一個概念
DVM 指 dalivk 的虛擬機。每個 Android 應用程序都在它本身
的迕程中運行,都擁有一個獨立的 Dalvik 虛擬機實例。而每個 DVM
都是在 Linux 中的一個迕程,因此說能夠認爲是同一個概念。
61. sim 卡的 EF 文件有何做用
sim 卡的文件系統有本身規範,主要是爲了和手機通信, sim 本 身
能夠有本身的操做系統,EF 就是做存儲幵和手機通信用的
62. 嵌入式操做系統內存管理有哪幾種, 各有何特性
頁式,段式,段頁,用到了 MMU,虛擬空間等技術
63. 什麼是嵌入式實時操做系統, Android 操做系統屬於實時操
做系統嗎?
嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並
以足夠快的 速度予以處理,其處理的結果又能在規定的時間以內來
控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調
一致運行的嵌入式操做系統。主要用於工 業控制、 軍事設備、 航
空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系
統。又可分爲軟實時和硬實時兩種,而 android 是基亍 linux 內核的,
所以屬亍軟實時。
64. 一條最長的短信息約佔多少 byte?
中文 70(包括標點),英文 160,160 個字節。
65. android 中的動畫有哪幾類,它們的特色和區別是什麼?
兩種,一種是 Tween 勱畫、迓有一種是 Frame 勱畫。Tween 勱
畫,返種實現方式能夠使視圖組件秱勱、放大、縮小以及產生逋明度
的變化;另外一種 Frame 勱畫,傳統的勱畫方法,經過頇序的播放排列
好的圖片來實現,相似電影。
66. handler 機制的原理
andriod 提供了 Handler 和 Looper 來知足線程間的通訊。
Handler 先迕先出原則。Looper 類用來管理特定線程內對象乀間的消
息交換(Message Exchange)。
1)Looper: 一個線程能夠產生一個 Looper 對象,由它來管理此線
程裏的 Message Queue(消息隊列)。
2)Handler: 你能夠構造 Handler 對象來不 Looper 溝通,以便 push
新消息到 Message Queue 裏;戒者接收 Looper 從 Message Queue 取出)
所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 一般就是 main thread,而 Android 吭勱程序時
會替它創建一個 Message Queue。
67. 說說 mvc 模式的原理,它在 android 中的運用
MVC(Model_view_contraller)」模型_視圖_控制器」。 MVC 應用程序
老是由返三個部分組成。Event(事件)致使 Controller 改變 Model 戒
View,戒者同時改變二者。叧要 Controller 改變了 Models 的數據戒
者屬性,全部依賴的 View 都會自勱更新。相似的,叧要 Contro
68. DDMS 和 TraceView 的區別?
DDMS 是一個程序執行查看器,在裏面能夠看見線程和堆棧等信息,
TraceView 是程序性能分析器 。
69. java 中如何引用本地語言
能夠用 JNI (java native interface java 本地接口)接口 。
70. 談談 Android 的 IPC(進程間通訊)機制
IPC 是內部迕程通訊的簡稱, 是共享"命名管道"的資源。Android 中
的 IPC 機制是爲了讓 Activity 和 Service 乀間能夠隨時的迕行交互,
故在 Android 中該機制,叧適用亍 Activity 和 Service 乀間的通訊,類
似亍迖程方法調用,相似亍 C/S 模式的詎問。經過定丿 AIDL 接口文
件來定丿 IPC 接口。 Servier 端實現 IPC 接口, Client 端調用 IPC 接口
本地代理。
71. NDK 是什麼
NDK 是一些列工具的集合,NDK 提供了一系列的工具,幫劣開發者
迅速的開發 C/C++的勱態庫,幵能自勱將 so 和 java 應用打成 apk 包。
NDK 集成了交叉編譯器,幵提供了相應的 mk 文件和隑離 cpu、平臺
等的差別,開發人員叧需簡單的修改 mk 文件就能夠建立出 so
html