日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之面试题精选,自己收藏下

發(fā)布時(shí)間:2023/12/4 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之面试题精选,自己收藏下 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.android dvm 的進(jìn)程和Linux的進(jìn)程,應(yīng)用程序的進(jìn)程是否為同一個(gè)概念:

答:dvm是dalivk虛擬機(jī)。每一個(gè)android應(yīng)用程序都在自己的進(jìn)程中運(yùn)行,都擁有一個(gè)dalivk虛擬機(jī)實(shí)例。而每一個(gè)dvm都是在linux的一個(gè)進(jìn)程。所以說可以認(rèn)為是同一個(gè)概念。

2.android的動畫有哪幾種?他們的特點(diǎn)和區(qū)別是什么?

答:兩種,一種是tween動畫,一種是frame動畫。tween動畫,這種實(shí)現(xiàn)方式可以使視圖組件移動,放大或縮小以及產(chǎn)生透明度的變化。frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。

3.handler進(jìn)制的原理:

答:android提供了handler和looper來滿足線程間的通信。Handler先進(jìn)先出原則。looper用來管理特定線程內(nèi)對象之間的消息交換(message Exchange).

??? 1)looper:一個(gè)線程可以產(chǎn)生一個(gè)looper對象,由它來管理此線程里的message queue(消息隊(duì)列)

???2)handler:你可以構(gòu)造一個(gè)handler對象來與looper溝通,以便push新消息到messagequeue里;或者接收looper(從messagequeue里取出)所送來的消息。

??? 3)messagequeue:用來存放線程放入的消息。

??? 4)線程:UI thread 通常就是main thread,而android啟動程序時(shí)會為它建立一個(gè)message queue.

4.android view的刷新:

答:Android中對View的更新有很多種方式,使用時(shí)要區(qū)分不同的應(yīng)用場合。我感覺最要緊的是分清:多線程和雙緩沖的使用情況。

??? 1).不使用多線程和雙緩沖

?? 這種情況最簡單了,一般只是希望在View發(fā)生改變時(shí)對UI進(jìn)行重繪。你只需在Activity中顯式地調(diào)用View對象中的invalidate()方法即可。系統(tǒng)會自動調(diào)用 View的onDraw()方法。

??? 2).使用多線程和不使用雙緩沖

??? 這種情況需要開啟新的線程,新開的線程就不好訪問View對象了。強(qiáng)行訪問的話會報(bào):android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.

??? 這時(shí)候你需要?jiǎng)?chuàng)建一個(gè)繼承了android.os.Handler的子類,并重寫handleMessage(Messagemsg)方法。android.os.Handler是能發(fā)送和處理消息的,你需要在Activity中發(fā)出更新UI的消息,然后再你的Handler(可以使用匿名內(nèi)部類)中處理消息(因?yàn)槟涿麅?nèi)部類可以訪問父類變量,你可以直接調(diào)用View對象中的invalidate()方法 )。也就是說:在新線程創(chuàng)建并發(fā)送一個(gè)Message,然后再主線程中捕獲、處理該消息。

??? 3).使用多線程和雙緩沖

??? Android中SurfaceView是View的子類,她同時(shí)也實(shí)現(xiàn)了雙緩沖。你可以定義一個(gè)她的子類并實(shí)現(xiàn)SurfaceHolder.Callback接口。由于實(shí)現(xiàn)SurfaceHolder.Callback接口,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中l(wèi)ockCanvas()方法可以鎖定畫布,繪制玩新的圖像后調(diào)用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。

?

5.說說mvc模式的原理,它在android中的運(yùn)用:

答:android的官方建議應(yīng)用程序的開發(fā)采用mvc模式。何謂mvc?

?

 mvc是model,view,controller的縮寫,mvc包含三個(gè)部分:

?

  l模型(model)對象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層。

  2視圖(view)對象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個(gè)mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。

  3控制器(control)對象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,想用用戶出發(fā)的相關(guān)事件,交給m哦得了處理。

?

 android鼓勵(lì)弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:

??? 1)視圖層(view):一般采用xml文件進(jìn)行界面的描述,使用的時(shí)候可以非常方便的引入,當(dāng)然,如何你對android了解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當(dāng)然這里需要進(jìn)行java和javascript之間的通 信,幸運(yùn)的是,android提供了它們之間非常方便的通信實(shí)現(xiàn)。

 2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業(yè)務(wù)邏輯層處理, 這樣做的另外一個(gè)原因是android中的acitivity的響應(yīng)時(shí)間是5s,如果耗時(shí)的操作放在這里,程序就很容易被回收掉。

 3)模型層(model):對數(shù)據(jù)庫的操作、對網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。

?

6.Activity的生命周期:

答:onCreate: 在這里創(chuàng)建界面,做一些數(shù)據(jù) 的初始化工作

?

  onStart: 到這一步變成用戶可見不可交互的

??? onResume:變成和用戶可交互 的,(在activity 棧系統(tǒng)通過棧的方式管理這些個(gè)Activity的最上面,運(yùn)行完彈出棧,則回到上一個(gè)Activity)

  onPause: 到這一步是可見但不可交互的,系統(tǒng)會停止動畫 等消耗CPU 的事情從上文的描述已經(jīng)知道,應(yīng)該在這里保存你的一些數(shù)據(jù),因?yàn)檫@個(gè)時(shí)候你的程序的優(yōu)先級降低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應(yīng)該在

  onstop: 變得不可見,被下一個(gè)activity覆蓋了

onDestroy: 這是activity被干掉前最后一個(gè)被調(diào)用方法了,可能是外面類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時(shí)性的干掉

?

7.讓Activity變成一個(gè)窗口:

答:Activity屬性設(shè)定:有時(shí)候會做個(gè)應(yīng)用程序是漂浮在手機(jī)主界面的。這個(gè)只需要在設(shè)置下Activity的主題theme,即在Manifest.xml定義Activity的地方加一句:

android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:

android:theme="@android:style/Theme.Translucent"

8.Android中常用的五種布局:

答:LinearLayout線性布局;AbsoluteLayout絕對布局;TableLayout表格布局;RelativeLayout相對布局;FrameLayout幀布局;

9.Android的五種數(shù)據(jù)存儲方式:

答:sharedPreferences;文件;SQLite;contentProvider;網(wǎng)絡(luò)

10.請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關(guān)系:

答:Handler獲取當(dāng)前線程中的looper對象,looper用來從存有Message的Message Queue里取出message,再由Handler進(jìn)行message的分發(fā)和處理。

11.AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?

答:AIDL(AndroidInterface Definition Language)android接口描述語言

12.系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由:

答:通過直接發(fā)送Uri把參數(shù)帶過去,或者通過manifest里的intentfilter里的data屬性。代碼如下:
??? Intent intent = new Intent();

Intent.setAction(“android.intent.action.View”);

Uri uriBrowsers = Uri.parse(“http://www.sina.com.cn”);

Intent.setData(uriBrowsers);

//包名、要打開的activity
??? intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);

startActivity(intent);

13.什么是ANR,如何避免?

答:ANR的定義:

在android上,如果你的應(yīng)用程序有一段時(shí)間響應(yīng)不移靈敏,系統(tǒng)會向用戶提示“應(yīng)用程序無響應(yīng)”(ANR:application Not Responding)對話框。因此,在程序里對響應(yīng)性能的設(shè)計(jì)很重要,這樣,系統(tǒng)不會顯示ANR給用戶。

如何避免:

首先來研究下為什么它會在android的應(yīng)用程序里發(fā)生和如何最佳構(gòu)建應(yīng)用程序來避免ANR.
??? android應(yīng)用程序通常是運(yùn)行在一個(gè)單獨(dú)的線程(例如:main)里,這就意味你的應(yīng)用程序所做的事情如果在主線程里占用了大長時(shí)間的話,就會引發(fā)ANR對話框,因?yàn)槟愕膽?yīng)用程序并沒有給自己機(jī)會來處理輸入事件或者Intent廣播。

??? 因此,運(yùn)行在主線程里的任何訪求都盡可能少做事情。特別是,activity應(yīng)該在它的關(guān)鍵生命周期方法(onCreate()和onResume())里盡可能少的去作創(chuàng)建操作。潛在的耗時(shí)操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作,或者高耗時(shí)的計(jì)算如改變位圖尺寸,應(yīng)該在子線程里(或者以數(shù)據(jù)庫操作為例,通過異步請求的方式)來完成。然而,不是說你的主線程阻塞在那里等待子線程的完成---也不是調(diào)用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應(yīng)該為子線程提供一個(gè)Handler,以便完成時(shí)能夠提交給主線程。以這種方式設(shè)計(jì)你的應(yīng)用程序,將能保證你的主線程保持對輸入的響應(yīng)性并能避免由5秒輸入事件的超時(shí)引發(fā)的ANR對話框。這種做法應(yīng)該在其它顯示UI的線程里效仿,因?yàn)樗鼈兌际芟嗤某瑫r(shí)影響。

??? IntentReceiver執(zhí)行時(shí)間的特殊限制意味著它應(yīng)該做:在后臺里做小的、瑣碎的工作,如保存設(shè)定或注冊一個(gè)Notification。和在主線程里調(diào)用的其它方法一樣,應(yīng)用程序應(yīng)該避免在BroadcastReceiver里做耗時(shí)的操作或計(jì)算,但也不是在子線程里做這些任務(wù)(因?yàn)锽roadcastReceiver的生命周期短),替代的是,如果響應(yīng)Intent廣播需要執(zhí)行一個(gè)耗時(shí)的動作的話,應(yīng)用程序應(yīng)該啟動一個(gè)Service。順便提及一句,你也應(yīng)該避免在Intent Receiver里啟動一個(gè)Activity,因?yàn)樗鼤?chuàng)建一個(gè)新的畫面,并從當(dāng)前用戶正在運(yùn)行的程序上搶奪焦點(diǎn)。如果你的應(yīng)用程序在響應(yīng)Intent廣播時(shí)需要向用戶展示什么,你應(yīng)該使用Notification Manager來實(shí)現(xiàn)。

??? 一般來說,在應(yīng)用程序里,100到200ms是用戶能感知阻滯的時(shí)間閾值,下面總結(jié)了一些技巧來避免ANR,并有助于讓你的應(yīng)用程序看起來有響應(yīng)性。

??? 如果你的應(yīng)用程序?yàn)轫憫?yīng)用戶輸入正在后臺工作的話,可以顯示工作的進(jìn)度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是游戲,在子線程里做移動的計(jì)算。如果你的程序有一個(gè)耗時(shí)的初始化過程的話,考慮可以顯示一個(gè)Splash Screen或者快速顯示主畫面并異步來填充這些信息。在這兩種情況下,你都應(yīng)該顯示正在進(jìn)行的進(jìn)度,以免用戶認(rèn)為程序被凍結(jié)了。

?

14.什么情況會導(dǎo)致Force Close?如何避免?能否捕獲導(dǎo)致其的異常?

答:如空指針等可以導(dǎo)致ForceClose;可以看Logcat,然后找到對應(yīng)的程序代碼來解決錯(cuò)誤。

15.橫豎屏切換時(shí)候的activity的生命周期:

答:

1) 新建一個(gè)activity,并把各個(gè)生命周期打印出來

2) 運(yùn)行activity,得到如下信息:

onCreate()à

onStart()à

onResume()à

??? 3)? 按ctrl+F12切換成橫屏?xí)r

??? ??? onSaveInstanceState()à

??????? onPause()à

??????? onStop()à

??????? onDestroy()à

??????? onCreate()à

??????? onStart()à

??????? onRestoreInstanceState()à

??????? onResume()à

??? 4)? 再按ctrl+f12切換成豎屏?xí)r,發(fā)現(xiàn)打印了兩次相同的Log

??????? onSaveInstanceState()à

??????? onPause()à

??????? onStop()à

??????? onDestroyà

??????? onCreate()à

??????? onStart()à

??????? onRestoreInstanceState()à

??????? onResume()à

?

??????? onSaveInstanceState()à

??????? onPause()à

??????? onStop()à

??????? onDestroyà

??????? onCreate()à

??????? onStart()à

??????? onRestoreInstanceState()à

??????? onResume()à

??? 5)? 修改AndroidManifest.xml,把該Activity添加android:configChanges=“orientation”,執(zhí)行步驟3

??????? onSaveInstanceState()à

??????? onPause()à

??????? onStop()à

??????? onDestroy()à

??????? onCreate()à

??????? onStart()à

??????? onRestoreInstanceState()à

??????? onResume()à

??? 6)? 修改AndroidManifest.xml,把該Activity添加android:configChanges=“orientation”,執(zhí)行步驟4,發(fā)現(xiàn)不會再打印相同信息,但多打印了一行onConfigChanged

??????? onSaveInstanceState()à

??????? onPause()à

??????? onStop()à

??????? onDestroy()à

??????? onCreate()à

??????? onStart()à

??????? onRestoreInstanceState()à

??????? onResume()à

??????? onConfigurationChanged()à

??? 7)? 把步驟5的android:configChanges=“orientation”改成

android:configChanges=“orientation|keyboradHidden”,執(zhí)行步驟3,就只打印onConfigChanged

??????? onConfigurationChanged()à

??? 8)? 把步驟5的android:configChanges=“orientation”改成

android:configChanges=“orientation|keyboradHidden”,執(zhí)行步驟4

??????? onConfigurationChanged()à

??????? onConfigurationChanged()à

??? 總結(jié):

1) 不設(shè)置activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次。

2) 設(shè)置activity的android:configChanges=“orientation”時(shí), 切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏、豎屏?xí)r都只會執(zhí)行一次,但是豎屏最后多打印一條onConfigurationChanged()

3) 設(shè)置activity的android:configChanges=“orientation|keyboardHidden”時(shí),切屏不會重新調(diào)用各個(gè)生命周期,只會執(zhí)行onConfigurationChanged(),橫屏一次,豎屏兩次

再總結(jié)下整個(gè)activity的生命周期:

1)? 當(dāng)前activity產(chǎn)生事件彈出Toast和AlertDialog的時(shí)候Activity的生命周期不會有改變

2)? Activity運(yùn)行時(shí)按下HOME鍵(跟被完全覆蓋一樣的)

onSavaInstanceStateà

onPauseà

onStopà

?

onRestartà

onStartà

onResumeà

??? 3)? 未被完全覆蓋,只是失去焦點(diǎn):

??????? onPauseà

??????? onResumeà

16.如何將SQLite數(shù)據(jù)庫(.db文件)與apk文件一起發(fā)布?

答:可以將.db文件復(fù)制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將.db文件復(fù)制到res aw目錄中

17.如何將打開res aw目錄中的數(shù)據(jù)庫文件?

答:在Android中不能直接打開res aw目錄中的數(shù)據(jù)庫文件,而需要在程序第一次啟動時(shí)將該文件復(fù)制到手機(jī)內(nèi)存或SD卡的某個(gè)目錄中,然后再打開該數(shù)據(jù)庫文件。復(fù)制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然后將該InputStream對象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫文件。

18.android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區(qū)別:

答:XML解析主要有三種方式,SAX、DOM、PULL。常規(guī)在PC上開發(fā)我們使用Dom相對輕松些,但一些性能敏感的數(shù)據(jù)庫或手機(jī)上還是主要采用SAX方 式,SAX讀取是單向的,優(yōu)點(diǎn):不占內(nèi)存空間、解析屬性方便,但缺點(diǎn)就是對于套嵌多個(gè)分支來說處理不是很方便。而DOM方式會把整個(gè)XML文件加載到內(nèi)存 中去,這里Android開發(fā)網(wǎng)提醒大家該方法在查找方面可以和XPath很好的結(jié)合如果數(shù)據(jù)量不是很大推薦使用,而PULL常常用在J2ME對于節(jié)點(diǎn)處 理比較好,類似SAX方式,同樣很節(jié)省內(nèi)存,在J2ME中我們經(jīng)常使用的KXML庫來解析。

19.DDMS和TraceView的區(qū)別?

答:DDMS是一個(gè)程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器

20.談?wù)凙ndroid的IPC機(jī)制:

答:IPC是內(nèi)部進(jìn)程通信的簡稱,是共享"命名管道"的資源。Android中的IPC機(jī)制是為了讓Activity和Service之間可以隨時(shí)的進(jìn)行交互,故在Android中該機(jī)制,只適用于Activity和Service之間的通信,類似于遠(yuǎn)程方法調(diào)用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實(shí)現(xiàn)IPC接口,Client端調(diào)用IPC接口本地代理。

21.NDK是什么:

答:NDK是一系列工具的集合

??? NDK提供了一系列的工具,幫助開發(fā)者迅速的開發(fā)C/C++的動態(tài)庫,并能自動將so和java應(yīng)用打成apk包

??? NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件和隔離cpu,平臺等的差異,開發(fā)人員只需簡單的修改mk文件就可以創(chuàng)建出so

22.描述一下android的系統(tǒng)架構(gòu):

答:android系統(tǒng)架構(gòu)分從下往上為Linux內(nèi)核層、運(yùn)行庫、應(yīng)用程序框架層和應(yīng)用程序?qū)印?/p>

??? Linux內(nèi)核層:負(fù)責(zé)硬件的驅(qū)動程序、網(wǎng)絡(luò)、電源、系統(tǒng)安全以及內(nèi)存管理等功能。

運(yùn)行庫和androidruntion:運(yùn)行庫:即c/c++函數(shù)庫部分,大多數(shù)都是開放源代碼的函數(shù)庫,例如webkit,該函數(shù)庫負(fù)責(zé)android網(wǎng)頁瀏覽器的運(yùn)行;例如標(biāo)準(zhǔn)的c函數(shù)庫libc、openssl、sqlite等,當(dāng)然也包括支持游戲開發(fā)的2dsgl和3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體文件格式。Androidruntion負(fù)責(zé)解釋和執(zhí)行生成的dalvik格式的字節(jié)碼

應(yīng)用軟件架構(gòu):java應(yīng)用程序開發(fā)人員主要是使用該層封裝好的api進(jìn)行快速開發(fā)的。

應(yīng)用程序?qū)?#xff1a;該層是java的應(yīng)用程序?qū)?#xff0c;android內(nèi)置的googlemaps、email、IM、瀏覽器等,都處于該層,java開發(fā)人員工發(fā)的程序也處于該層,而且和內(nèi)置的應(yīng)用程序具有平等的地位,可以調(diào)用內(nèi)置的應(yīng)用程序,也可以替換內(nèi)置的應(yīng)用程序

23.Activity 與 Task的啟動模式有哪些,它們含義具體是什么?

答:在一個(gè)activity中,有多次調(diào)用startActivity來啟動另一個(gè)activity,要想只生成一個(gè)activity實(shí)例,可以設(shè)置啟動模式。

??? 一個(gè)activity有四種啟動模式:standed,signleTop,singleTask,singleInstance

??? Standed:標(biāo)準(zhǔn)模式,一調(diào)用startActivity()方法就會產(chǎn)生一個(gè)新的實(shí)例。

??? SingleTop:如果已經(jīng)有一個(gè)實(shí)例位于activity棧頂,就不產(chǎn)生新的實(shí)例,而只是調(diào)用activity中的newInstance()方法。如果不位于棧頂,會產(chǎn)生一個(gè)新的實(shí)例。

??? singleTask:會在一個(gè)新的task中產(chǎn)生這個(gè)實(shí)例,以后每次調(diào)用都會使用這個(gè),不會去產(chǎn)生新的實(shí)例了。

??? SingleInstance:這個(gè)和singleTask基本一樣,只有一個(gè)區(qū)別:在這個(gè)模式下的activity實(shí)例所處的task中,只能有這個(gè)activity實(shí)例,不能有其他實(shí)例

24.Application類的作用:

答:API里的第一句是:

Base class for those who need to maintain global application state?

如果想在整個(gè)應(yīng)用中使用全局變量,在java中一般是使用靜態(tài)變量,public類型;而在android中如果使用這樣的全局變量就不符合Android的框架架構(gòu),但是可以使用一種更優(yōu)雅的方式就是使用Application context。?
? 首先需要重寫Application,主要重寫里面的onCreate方法,就是創(chuàng)建的時(shí)候,初始化變量的值。然后在整個(gè)應(yīng)用中的各個(gè)文件中就可以對該變量進(jìn)行操作了。?
? 啟動Application時(shí),系統(tǒng)會創(chuàng)建一個(gè)PID,即進(jìn)程ID,所有的Activity就會在此進(jìn)程上運(yùn)行。那么我們在Application創(chuàng)建的時(shí)候初始化全局變量,同一個(gè)應(yīng)用的所有Activity都可以取到這些全局變量的值,換句話說,我們在某一個(gè)Activity中改變了這些全局變量的值,那么在同一個(gè)應(yīng)用的其他Activity中值就會改變

25.說明onSaveInstanceState() 和 onRestoreInstanceState()在什么時(shí)候被調(diào)用:

答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會被觸發(fā)。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足、用戶直接按Home鍵)由系統(tǒng)銷毀一個(gè)Activity時(shí),onSaveInstanceState()才會被調(diào)用。但是當(dāng)用戶主動去銷毀一個(gè)Activity時(shí),例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會被調(diào)用。因?yàn)樵谶@種情況下,用戶的行為決定了不需要保存Activity的狀態(tài)。通常onSaveInstanceState()只適合用于保存一些臨時(shí)性的狀態(tài),而onPause()適合用于數(shù)據(jù)的持久化保存。

另外,當(dāng)屏幕的方向發(fā)生了改變, Activity會被摧毀并且被重新創(chuàng)建,如果你想在Activity被摧毀前緩存一些數(shù)據(jù),并且在Activity被重新創(chuàng)建后恢復(fù)緩存的數(shù)據(jù)。可以重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。

26.android的service的生命周期?哪個(gè)方法可以多次被調(diào)用:

答:1)與采用Context.startService()方法啟動服務(wù)有關(guān)的生命周期方法

onCreate() -> onStart() -> onDestroy()

onCreate()該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用,該方法只會被調(diào)用一次,無論調(diào)用多少次startService()或bindService()方法,服務(wù)也只被創(chuàng)建一次。
onStart() 只有采用Context.startService()方法啟動服務(wù)時(shí)才會回調(diào)該方法。該方法在服務(wù)開始運(yùn)行時(shí)被調(diào)用。多次調(diào)用startService()方法盡管不會多次創(chuàng)建服務(wù),但onStart() 方法會被多次調(diào)用。
onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用。


2)與采用Context.bindService()方法啟動服務(wù)有關(guān)的生命周期方法
onCreate() -> onBind() -> onUnbind() -> onDestroy()

onBind()只有采用Context.bindService()方法啟動服務(wù)時(shí)才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用Context.bindService()方法并不會導(dǎo)致該方法被多次調(diào)用。
onUnbind()只有采用Context.bindService()方法啟動服務(wù)時(shí)才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)解除綁定時(shí)被調(diào)用。
如果先采用startService()方法啟動服務(wù),然后調(diào)用bindService()方法綁定到服務(wù),再調(diào)用unbindService()方法解除綁定,最后調(diào)用bindService()方法再次綁定到服務(wù),觸發(fā)的生命周期方法如下:
onCreate() ->onStart() ->onBind() ->onUnbind()[重載后的方法需返回true] ->onRebind()

27.android的broadcast的生命周期:

答:1)Broadcast receiver生命周期中僅有一個(gè)回調(diào)方法:?
void onReceive(Context curContext, Intent broadcastMsg)?
當(dāng)接收器接收到一條broadcast消息,Android就會調(diào)用onReceiver(),并傳遞給它一個(gè)Intent對象,這個(gè)對象攜帶著那條broadcast消息。我們認(rèn)為僅當(dāng)執(zhí)行這個(gè)方式時(shí),Broadcast receiver是活動的;這個(gè)方法返回時(shí),它就終止了。這就是Broadcast receiver的生命周期。?


2)由于Broadcast receiver的生命周期很短,一個(gè)帶有活動的Broadcast receiver的進(jìn)程是受保護(hù)的,以避免被干掉;但是別忘了有一點(diǎn),Android會在任意時(shí)刻干掉那些攜帶不再活動的組件的進(jìn)程,所以很可能會造成這個(gè)問題。?


3)解決上述問題的方案采用一個(gè)Service來完成這項(xiàng)工作,Android會認(rèn)為那個(gè)進(jìn)程中(Service所在的進(jìn)程)仍然有在活動的組件。?

28.android view,surfaceview,glsurfaceview的區(qū)別:

答:SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceView和VideoView,可以看出GL和視頻播放以及Camera攝像頭一般均使用SurfaceView
SurfaceView和View最本質(zhì)的區(qū)別在于,surfaceView是在一個(gè)新起的單獨(dú)線程中可以重新繪制畫面而View必須在UI的主線程中更新畫面。?
那么在UI的主線程中更新畫面 可能會引發(fā)問題,比如你更新畫面的時(shí)間過長,那么你的主UI線程會被你正在畫的函數(shù)阻塞。那么將無法響應(yīng)按鍵,觸屏等消息。?
當(dāng)使用surfaceView 由于是在新的線程中更新畫面所以不會阻塞你的UI主線程。但這也帶來了另外一個(gè)問題,就是事件同步。比如你觸屏了一下,你需要surfaceView中thread處理,一般就需要有一個(gè)event queue的設(shè)計(jì)來保存touch event,這會稍稍復(fù)雜一點(diǎn),因?yàn)樯婕暗骄€程同步。?

所以基于以上,根據(jù)游戲特點(diǎn),一般分成兩類。?

1)被動更新畫面的。比如棋類,這種用view就好了。因?yàn)楫嬅娴母率且蕾囉?onTouch 來更新,可以直接使用 invalidate。 因?yàn)檫@種情況下,這一次Touch和下一次的Touch需要的時(shí)間比較長些,不會產(chǎn)生影響。?

2)主動更新。比如一個(gè)人在一直跑動。這就需要一個(gè)單獨(dú)的thread不停的重繪人的狀態(tài),避免阻塞main UI thread。所以顯然view不合適,需要surfaceView來控制。

總結(jié)

以上是生活随笔為你收集整理的Android之面试题精选,自己收藏下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。