1、 請描述下Activity的生命周期。 activity的生命周期方法有: onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、on Destory(); 可見生命周期:從onStart()直到系統調用onStop() 前 ...
1、 請描述下Activity的生命周期。
activity的生命周期方法有: onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、on Destory(); 可見生命周期:從onStart()直到系統調用onStop() 前臺生命周期:從onResume()直到系統調用onPause() |
2、 如何啟用Service,如何停用Service。
服務的開發比較簡單,如下: 第一步:繼承Service類 public class SMSService extends Service {} 第二步:在AndroidManifest.xml文件中的<application>節點里對服務進 行配置:<service android:name=".SMSService" /> 服務不能自己運行,需要通過調用Context.startService()或 Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是 它們的使用場合有所不同。使用startService()方法啟用服務,調用者與服務 之間沒有關連,即使調用者退出了,服務仍然運行。使用bindService()方法 啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止, 大有“不求同時生,必須同時死”的特點。 如果打算採用Context.startService()方法啟動服務,在服務未被創建時, 系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用 startService()方法前服務已經被創建,多次調用startService()方法並不會 導致多次創建服務,但會導致多次調用onStart()方法。採用startService()方 法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時 會調用onDestroy()方法。 如果打算採用Context.bindService()方法啟動服務,在服務未被創建時, 系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調 用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind() 方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已經 被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就 是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在 綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致 系統調用服務的onUnbind()-->onDestroy()方法。 服務常用生命周期回調方法如下: onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用 多少次startService()或bindService()方法,服務也只被創建一次。 onDestroy()該方法在服務被終止時調用。 與採用Context.startService()方法啟動服務有關的生命周期方法 onStart() 只有採用Context.startService()方法啟動服務時才會回調該方法。 該方法在服務開始運行時被調用。多次調用startService()方法儘管不會多次 創建服務,但onStart() 方法會被多次調用。 與採用Context.bindService()方法啟動服務有關的生命周期方法 onBind()只有採用Context.bindService()方法啟動服務時才會回調該方法。 該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用 Context.bindService()方法並不會導致該方法被多次調用。 onUnbind()只有採用Context.bindService()方法啟動服務時才會回調該方 法。該方法在調用者與服務解除綁定時被調用 |
3、 作用域public,private,protected,以及不寫時的區別
區別如下: |
4、 Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)
匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個介面,由另一個內部類實現 |
5、 String s = new String("xyz");創建了幾個String Object
兩個,一個字元對象,一個字元對象引用對象 |
6、 請解釋下在單線程模型中Message、Handler、MessageQueue、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組件進行信息交換 |
7、 簡要解釋一下activity、 intent 、intentfilter 、service 、Broadcase、BroadcaseReceiver
一個activity呈現了一個用戶可以操作的可視化用戶界面;一個service 不包含可見的用戶界面,而是在後臺運行,可以與一個activity綁定,通過 綁定暴露出來介面並與其進行通信;一個broadcast receiver是一個接收廣 播消息並做出回應的component,broadcast receiver沒有界面;一個 intent是一個Intent對象,它保存了消息的內容。對於activity和service來 說,它指定了請求的操作名稱和待操作數據的URI,Intent對象可以顯式的 指定一個目標component。如果這樣的話,android會找到這個 component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯 式指定的,android必須找到響應intent的最佳component。它是通過將 Intent對象和目標的intent filter相比較來完成這一工作的;一個 component的intent filter告訴android該component能處理的 intent。intent filter也是在manifest文件中聲明的。 |
8、 說說mvc模式的原理,它在android中的運用,android的官方建議應用程式的開發採用mvc模式。何謂mvc?
mvc是model,view,controller的縮寫,mvc包含三個部分: 模型(model)對象:是應用程式的主體部分,所有的業務邏輯都應該 寫在該層。 視圖(view)對象:是應用程式中負責生成用戶界面的部分。也是在整個 mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。 控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及 更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發 的相關事件,交給m層處理。 android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下: 1)視圖層(view):一般採用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如果你對android瞭解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層, 當然這裡需要進行java和javascript之間的通信,幸運的是,android提供 了它們之間非常方便的通信實現。 2)控制層(controller):android的控制層的重任通常落在了眾多的 acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過 activity交割model業務邏輯層處理,這樣做的另外一個原因是android中 的acitivity的響應時間是5s,如果耗時的操作放在這裡,程式就很容易被回 收掉。 3)模型層(model):對資料庫的操作、對網路等的操作都應該在model 裡面處理,當然對業務計算等操作也是必須放在的該層的。 |
9、 什麼是ANR 如何避免它?
ANR:Application Not Responding。在Android中,活動管理器和窗 口管理器這兩個系統服務負責監視應用程式的響應,當用戶操作的在5s內應 用程式沒能做出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出 現應用程式無響應對話框,這既是ANR。 避免方法:Activity應該在它的關鍵生命周期方法(如onCreate()和 onResume())里儘可能少的去做創建操作。潛在的耗時操作,例如網路或數 據庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子線程里(或者非同步 方式)來完成。主線程應該為子線程提供一個Handler,以便完成時能夠提交 給主線程。 |
10、 什麼情況會導致Force Close ?如何避免?能否捕獲導致其的異常?
程式出現異常,比如nullpointer。 避免:編寫程式時邏輯連貫,思維縝密。能捕獲異常,在logcat中能看到異 常信息 |
11、 short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)short s1 = 1; s1 += 1;(可以正確編譯) |
12、 Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型 |
13、 Set里的元素是不能重覆的,那麼用什麼方法來區分重覆與否呢? 是用==還是equals()? 它們有何區別
Set里的元素是不能重覆的,那麼用iterator()方法來區分重覆與否。equals()是判讀兩個Set是否相等 equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值 |
14、 error和exception有什麼區別
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況 exception 表示一種設計或實現問題。也就是說,它表示如果程式運行正常,從不會發生的情況 |
15、 請介紹下ContentProvider是如何實現數據共用的。
一個程式可以通過實現一個Content provider的抽象介面將自己的數據 完全暴露出去,而且Content providers是以類似資料庫中表的方式將數據 暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程式訪 問到,這也是應用程式之間唯一共用數據的方法。 要想使應用程式的數據公開化,可通過2種方法:創建一個屬於你自己的 Content provider或者將你的數據添加到一個已經存在的Content provider 中,前提是有相同數據類型並且有寫入Content provider的許可權。 如何通過一套標準及統一的介面獲取其他應用程式暴露的數據? Android提供了ContentResolver,外界的程式可以通過 ContentResolver介面訪問ContentProvider提供的數據。 |
16、 try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行,什麼時候被執行,在return前還是後
會執行,在return前執行 |
17、 IntentService有何優點?
Acitivity的進程,當處理Intent的時候,會產生一個對應的Service; Android的進程處理器現在會儘可能的不kill掉你;非常容易使用 |
18、 如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?
重寫onSaveInstanceState()方法,在此方法中保存需要保存的數據, 該方法將會在activity被回收之前調用。通過重寫onRestoreInstanceState() 方法可以從中提取保存好的數據 |
19、 如何將一個Activity設置成視窗的樣式。
:<activity>中配置:android :theme="@android:style/Theme.Dialog" |
20、 談談Android的IPC(進程間通信)機制
IPC是內部進程通信的簡稱, 是共用"命名管道"的資源。Android中的IPC 機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android 中該機制,只適用於Activity和Service之間的通信,類似於遠程方法調用, 類似於C/S模式的訪問。通過定義AIDL介面文件來定義IPC介面。Servier端 實現IPC介面,Client端調用IPC介面本地代理。 |