- 相關推薦
2016安卓面試試題及答案
安卓是一種專為手持式裝置所設計的操作系統(tǒng)。本文將介紹2016安卓面試試題及答案。
2016安卓面試試題及答案(1)
1、什么是Activity?
四大組件之一,一般的,一個用戶交互界面對應一個activity
setContentView() ,// 要顯示的布局
button.setOnclickLinstener{
}, activity 是Context的子類,同時實現(xiàn)了window.callback和keyevent.callback, 可以處理與窗體用戶交互的事件.
我開發(fā)常用的的有FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty等…
2、請描述一下Activity 生命周期
Activity從創(chuàng)建到銷毀有多種狀態(tài),從一種狀態(tài)到另一種狀態(tài)時會激發(fā)相應的回調(diào)方法,這些回調(diào)方法包括:onCreate onStart onResume onPause onStop onDestroy
其實這些方法都是兩兩對應的,onCreate創(chuàng)建與onDestroy銷毀;
onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;
如果界面有共同的特點或者功能的時候,還會自己定義一個BaseActivity.
進度對話框的顯示與銷毀
3、常見的Activity類型有FragmentActivitiy,ListActivity,TabAcitivty等。請描述一下Activity 生命周期
Activity從創(chuàng)建到銷毀有多種狀態(tài),從一種狀態(tài)到另一種狀態(tài)時會激發(fā)相應的回調(diào)方法,這些回調(diào)方法包括:onCreate onStart onResume onPause onStop onDestroy
其實這些方法都是兩兩對應的,onCreate創(chuàng)建與onDestroy銷毀;
onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause。
4、如何保存Activity的狀態(tài)?
Activity的狀態(tài)通常情況下系統(tǒng)會自動保存的,只有當我們需要保存額外的數(shù)據(jù)時才需要使用到這樣的功能。
一般來說, 調(diào)用onPause()和onStop()方法后的activity實例仍然存在于內(nèi)存中, activity的所有信息和狀態(tài)數(shù)據(jù)不會消失, 當activity重新回到前臺之后, 所有的改變都會得到保留。
但是當系統(tǒng)內(nèi)存不足時, 調(diào)用onPause()和onStop()方法后的activity可能會被系統(tǒng)摧毀, 此時內(nèi)存中就不會存有該 activity的實例對象了。如果之后這個activity重新回到前臺, 之前所作的改變就會消失。為了避免此種情況的發(fā)生, 我們可以覆寫 onSaveInstanceState()方法。onSaveInstanceState()方法接受一個Bundle類型的參數(shù), 開發(fā)者可以將狀態(tài)數(shù)據(jù)存儲到這個Bundle對象中, 這樣即使activity被系統(tǒng)摧毀, 當用戶重新啟動這個activity而調(diào)用它的onCreate()方法時, 上述的Bundle對象會作為實參傳遞給onCreate()方法, 開發(fā)者可以從Bundle對象中取出保存的數(shù)據(jù), 然后利用這些數(shù)據(jù)將 activity恢復到被摧毀之前的狀態(tài)。
需要注意的是, onSaveInstanceState()方法并不是一定會被調(diào)用的, 因為有些場景是不需要保存狀態(tài)數(shù)據(jù)的. 比如用戶按下 BACK鍵退出activity時, 用戶顯然想要關閉這個activity, 此時是沒有必要保存數(shù)據(jù)以供下次恢復的, 也就是 onSaveInstanceState()方法不會被調(diào)用. 如果調(diào)用onSaveInstanceState()方法, 調(diào)用將發(fā)生在 onPause()或onStop()方法之前。
5、兩個Activity之間跳轉(zhuǎn)時必然會執(zhí)行的是哪幾個方法?
一般情況下比如說有兩個activity,分別叫A,B,當在A里面激活B組件的時候, A會調(diào)用 onPause()方法,然后B調(diào)用onCreate() ,onStart(), onResume()。
這個時候B覆蓋了窗體, A會調(diào)用onStop()方法. 如果B是個透明的,或者是對話框的樣式, 就不會調(diào)用A的onStop()方法。
6、橫豎屏切換時Activity的生命周期
此時的生命周期跟清單文件里的配置有關系。
不設置Activity的android:configChanges時,切屏會重新調(diào)用各個生命周期默認首先銷毀當前activity,然后重新加載。
2.設置Activity android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法。
通常在游戲開發(fā), 屏幕的朝向都是寫死的。
7、如何將一個Activity設置成窗口的樣式
只需要給我們的Activity配置如下屬性即可。
android:theme="@android:style/Theme.Dialog"
8、如何退出Activity?如何安全退出已調(diào)用多個Activity的Application?
1、通常情況用戶退出一個Activity只需按返回鍵,我們寫代碼想退出activity直接調(diào)用finish()方法就行。
2、記錄打開的Activity:
每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、發(fā)送特定廣播:
在需要結(jié)束應用時,發(fā)送一個特定的廣播,每個Activity收到廣播后,關閉即可。
//給某個activity 注冊接受接受廣播的意圖
registerReceiver(receiver, filter)
//如果過接受到的是 關閉activity的廣播 就調(diào)用finish()方法 把當前的activity finish()掉
4、遞歸退出
在打開新的Activity時使用startActivityForResult,然后自己加標志,在onActivityResult中處理,遞歸關閉。
5、其實 也可以通過 intent的flag 來實現(xiàn) intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity。此時如果該任務棧中已經(jīng)有該Activity,那么系統(tǒng)會把這個Activity上面的所有Activity干掉。其實相當于給Activity配置的啟動模式為 SingleTop。
9、Activity的四種啟動模式,singletop和singletask區(qū)別是什么?一般書簽的使用模式是singletop,那為什么不使用singletask?
singleTop 跟standard 模式比較類似。唯一的區(qū)別就是,當跳轉(zhuǎn)的對象是位于棧頂?shù)腶ctivity(應該可以理解為用戶眼前所 看到的activity)時,程序?qū)⒉粫梢粋新的activity實例,而是直接跳到現(xiàn)存于棧頂?shù)哪莻activity實例。拿上面的例子來說,當Act1 為 singleTop 模式時,執(zhí)行跳轉(zhuǎn)后棧里面依舊只有一個實例,如果現(xiàn)在按返回鍵程序?qū)⒅苯油顺觥?/p>
singleTask模式和singleInstance模式都是只創(chuàng)建一個實例的。在這種模式下,無論跳轉(zhuǎn)的對象是不是位于棧頂?shù)?activity,程序都不會生成一個新的實例(當然前提是棧里面已經(jīng)有這個實例)。這種模式相當有用,在以后的多activity開發(fā)中,常會因為跳轉(zhuǎn)的關系導致同個頁面生成多個實例,這個在用戶體驗上始終有點不好,而如果你將對應的activity聲明為singleTask 模式,這種問題將不復存在。在主頁的Activity很常用
10、Android中的Context, Activity,Appliction有什么區(qū)別?
相同:Activity和Application都是Context的子類。
Context從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理上下文環(huán)境中各個參數(shù)和變量的總用,方便我們可以簡單的訪問到各種資源。
不同:維護的生命周期不同。 Context維護的是當前的Activity的生命周期,Application維護的是整個項目的生命周期。
使用context的時候,小心內(nèi)存泄露,防止內(nèi)存泄露,注意一下幾個方面:
1. 不要讓生命周期長的對象引用activity context,即保證引用activity的對象要與activity本身生命周期是一樣的。
2. 對于生命周期長的對象,可以使用application,context。
3. 避免非靜態(tài)的內(nèi)部類,盡量使用靜態(tài)類,避免生命周期問題,注意內(nèi)部類對外部對象引用導致的生命周期變化。
11、兩個Activity之間傳遞數(shù)據(jù),除了intent,廣播接收者,content provider還有啥?
1)利用static靜態(tài)數(shù)據(jù),public static成員變量
2)利用外部存儲的傳輸,
例如 File 文件存儲
SharedPreferences首選項
Sqlite 數(shù)據(jù)庫
12、Context是什么?
1、它描述的是一個應用程序環(huán)境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現(xiàn)類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啟動一個Activity,發(fā)送廣播,接受Intent,信息,等。
2016安卓面試試題及答案(2)
1.如何避免ANR?
答:ANR:Application Not Responding,五秒在Android中,活動管理器和窗口管理器這兩個系統(tǒng)服務負責監(jiān)視應用程序的響應。當出現(xiàn)下列情況時,Android就會顯示ANR對話框了: 對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 意向接受器(intentReceiver)超過10秒鐘仍未執(zhí)行完畢
Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味著,任何在主線程中運行的,需要消耗大量時間的操作都會引發(fā)ANR。因為此時,你的應用程序已經(jīng)沒有機會去響應輸入事件和意向廣播(Intent broadcast)。 因此,任何運行在主線程中的方法,都要盡可能的只做少量的工作。特別是活動生命周期中的重要方法如onCreate()和 onResume()等更應如此。潛在的比較耗時的操作,如訪問網(wǎng)絡和數(shù)據(jù)庫;或者是開銷很大的計算,比如改變位圖的大小,需要在一個單獨的子線程中完成(或者是使用異步請求,如數(shù)據(jù)庫操作)。但這并不意味著你的主線程需要進入阻塞狀態(tài)已等待子線程結(jié)束 -- 也不需要調(diào)用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程為子線程提供一個句柄(Handler),讓子線程在即將結(jié)束的時候調(diào)用它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應用程序,能夠保證你的程序?qū)斎氡3至己玫捻憫,從而避免因為輸入事件超過5秒鐘不被處理而產(chǎn)生的ANR。這種實踐需要應用到所有顯示用戶界面的線程,因為他們都面臨著同樣的超時問題。
2. handler機制的原理
答 :andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內(nèi)對象之間的消息交換(Message Exchange)。 1)Looper: 一個線程可以產(chǎn)生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)! 2)Handler: 你可以構(gòu)造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。 3) Message Queue(消息隊列):用來存放線程放入的消息! 4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。
【安卓面試試題及答案】相關文章:
社工面試面試試題及答案08-04
安卓實習心得01-10
客服面試試題及答案09-26
銷售面試試題與答案09-26
軍校面試試題及答案09-25
路政面試試題及答案08-06
審計面試試題及答案08-05
小升初面試試題及答案08-08
外企面試的經(jīng)典試題及答案09-25
達內(nèi)安卓培訓專家解密面試問題08-08