導航:首頁 > 編程語言 > javaandroid面試題

javaandroid面試題

發布時間:2025-09-01 08:42:41

① android面試題會出現什麼內容

這是一篇介紹android面試題的文章,下面就讓我們一起來了解一下吧!
1.android dvm 的進程和的進程,應用程序的進程是否為同一個概念:
答:dvm是dalivk虛擬機。每一個android應用程序都在自己的進程中運行,都擁有一個dalivk虛擬機實例。而每一個dvm都是在linux的一個進程。所以說可以認為是同一個概念。
2.android的動畫有哪幾種?他們的特點和區別是什麼?
答:兩種,一種是tween動畫,一種是frame動畫。tween動畫,這種實現方式可以使視圖組件移動,放大或縮小以及產生透明度的變化。frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
3.handler進制的原理:
答:android提供了handler和looper來滿足線程間的通信。Handler先進先出原則。looper用來管理特定線程內對象之間的消息交換(message Exchange).
1)looper:一個線程可以產生一個looper對象,由它來管理此線程里的message queue(消息隊列)
2)handler:你可以構造一個handler對象來與looper溝通,以便push新消息到messagequeue里;或者接收looper(從messagequeue里取出)所送來的消息。
3)messagequeue:用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而android啟動程序時會為它建立一個message queue.
4.android view的刷新:
答:Android中對View的更新有很多種方式,使用時要區分不同的應用場合。我感覺最要緊的是分清:多線程和雙緩沖的使用情況。
1).不使用多線程和雙緩沖
這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用 View的onDraw()方法。
2).使用多線程和不使用雙緩沖
這種情況需要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報:android.view.ViewRoot$:Only the originalthread that created a view hierarchy can touch its views.
這時候你需要創建一個繼承了android.os.Handler的子類,並重寫handleMessage(Messagemsg)方法。android.os.Handler是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然後再你的Handler(可以使用匿名內部類)中處理消息(因為匿名內部類可以訪問父類變數,你可以直接調用View對象中的invalidate()方法 )。也就是說:在新線程創建並發送一個Message,然後再主線程中捕獲、處理該消息。
3).使用多線程和雙緩沖
Android中SurfaceView是View的子類,她同時也實現了雙緩沖。你可以定義一個她的子類並實現SurfaceHolder.Callback介面。由於實現SurfaceHolder.Callback介面,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制玩新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。
5.說說mvc模式的原理,它在android中的運用:
答:android的官方建議應用程序的開發採用mvc模式。何謂mvc?
mvc是model,view,controller的縮寫,mvc包含三個部分:
l模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
2視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
3控制器(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裡面處理,當然對業務計算等操作也是必須放在的該層的。
6.Activity的生命周期:
答:onCreate: 在這里創建界面,做一些數據 的初始化工作
onStart: 到這一步變成用戶可見不可交互的
onResume:變成和用戶可交互 的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,運行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可交互的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這里保存你的一些數據,因為這個時候你的程序的優先順序降低,有可能被系統收回。在這里保存的數據,應該在
onstop: 變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被調用方法了,可能是外面類調用finish方法或者是系統為了節省空間將它暫時性的幹掉
7.讓Activity變成一個窗口:
答:Activity屬性設定:有時候會做個應用程序是漂浮在手機主界面的。這個只需要在設置下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的五種數據存儲方式:
答:sharedPreferences;文件;SQLite;contentProvider;網路
10.請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系:
答:Handler獲取當前線程中的looper對象,looper用來從存有Message的Message Queue里取出message,再由Handler進行message的分發和處理。
11.AIDL的全稱是什麼?如何工作?能處理哪些類型的數據?
答:AIDL(AndroidInterface Definition Language)android介面描述語言
12.系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由:
答:通過直接發送Uri把參數帶過去,或者通過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上,如果你的應用程序有一段時間響應不移靈敏,系統會向用戶提示「應用程序無響應」(ANR:application Not Responding)對話框。因此,在程序里對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。
如何避免:
首先來研究下為什麼它會在android的應用程序里發生和如何最佳構建應用程序來避免ANR.
android應用程序通常是運行在一個單獨的線程(例如:main)里,這就意味你的應用程序所做的事情如果在主線程里佔用了大長時間的話,就會引發ANR對話框,因為你的應用程序並沒有給自己機會來處理輸入事件或者Intent廣播。
因此,運行在主線程里的任何訪求都盡可能少做事情。特別是,activity應該在它的關鍵生命周期方法(onCreate()和onResume())里盡可能少的去作創建操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子線程里(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子線程的完成---也不是調用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程序,將能保證你的主線程保持對輸入的響應性並能避免由5秒輸入事件的超時引發的ANR對話框。這種做法應該在其它顯示UI的線程里效仿,因為它們都受相同的超時影響。
IntentReceiver執行時間的特殊限制意味著它應該做:在後台里做小的、瑣碎的工作,如保存設定或注冊一個Notification。和在主線程里調用的其它方法一樣,應用程序應該避免在BroadcastReceiver里做耗時的操作或計算,但也不是在子線程里做這些任務(因為BroadcastReceiver的生命周期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個Service。順便提及一句,你也應該避免在Intent Receiver里啟動一個Activity,因為它會創建一個新的畫面,並從當前用戶正在運行的程序上搶奪焦點。如果你的應用程序在響應Intent廣播時需要向用戶展示什麼,你應該使用Notification Manager來實現。
一般來說,在應用程序里,100到200ms是用戶能感知阻滯的時間閾值,下面總結了一些技巧來避免ANR,並有助於讓你的應用程序看起來有響應性。
如果你的應用程序為響應用戶輸入正在後台工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是游戲,在子線程里做移動的計算。如果你的程序有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面並非同步來填充這些信息。在這兩種情況下,你都應該顯示正在進行的進度,以免用戶認為程序被凍結了。
14.什麼情況會導致Force Close?如何避免?能否捕獲導致其的異常?
答:如空指針等可以導致ForceClose;可以看Logcat,然後找到對應的程序代碼來解決錯誤。
15.橫豎屏切換時候的activity的生命周期:
答:
1) 新建一個activity,並把各個生命周期列印出來
2) 運行activity,得到如下信息:
onCreate()à
onStart()à
onResume()à
3) 按ctrl+F12切換成橫屏時
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
4) 再按ctrl+f12切換成豎屏時,發現列印了兩次相同的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
5) 修改AndroidManifest.xml,把該Activity添加android:configChanges=「orientation」,執行步驟3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
6) 修改AndroidManifest.xml,把該Activity添加android:configChanges=「orientation」,執行步驟4,發現不會再列印相同信息,但多列印了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
7) 把步驟5的android:configChanges=「orientation」改成
android:configChanges=「orientation|keyboradHidden」,執行步驟3,就只列印onConfigChanged
onConfigurationChanged()à
8) 把步驟5的android:configChanges=「orientation」改成
android:configChanges=「orientation|keyboradHidden」,執行步驟4
onConfigurationChanged()à
onConfigurationChanged()à
總結:
1) 不設置activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
2) 設置activity的android:configChanges=「orientation」時, 切屏會重新調用各個生命周期,切橫屏、豎屏時都只會執行一次,但是豎屏最後多列印一條onConfigurationChanged()
3) 設置activity的android:configChanges=「orientation|keyboardHidden」時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged(),橫屏一次,豎屏兩次
再總結下整個activity的生命周期:
1) 當前activity產生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變
2) Activity運行時按下HOME鍵(跟被完全覆蓋一樣的)
onSavaInstanceStateà
onPauseà
onStopà
onRestartà
onStartà
onResumeà
3) 未被完全覆蓋,只是失去焦點:
onPauseà
onResumeà
16.如何將SQLite資料庫(.db文件)與apk文件一起發布?
答:可以將.db文件復制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將.db文件復制到res aw目錄中
17.如何將打開res aw目錄中的資料庫文件?
答:在Android中不能直接打開res aw目錄中的資料庫文件,而需要在程序第一次啟動時將該文件復制到手機內存或SD卡的某個目錄中,然後再打開該資料庫文件。復制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然後將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite資料庫文件。
18.android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別:
答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些性能敏感的資料庫或手機上還是主要採用SAX方 式,SAX讀取是單向的,優點:不佔內存空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML文件載入到內存 中去,這里Android開發網提醒大家該方法在查找方面可以和XPath很好的結合如果數據量不是很大推薦使用,而PULL常常用在J2ME對於節點處 理比較好,類似SAX方式,同樣很節省內存,在J2ME中我們經常使用的KXML庫來解析。
19.DDMS和TraceView的區別?
答:DDMS是一個程序執行查看器,在裡面可以看見線程和堆棧等信息,TraceView是程序性能分析器
20.談談Android的IPC機制:
答:IPC是內部進程通信的簡稱,是共享"命名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中該機制,只適用於Activity和Service之間的通信,類似於遠程方法調用,類似於C/S模式的訪問。通過定義AIDL介面文件來定義IPC介面。Servier端實現IPC介面,Client端調用IPC介面本地代理。
21.NDK是什麼:
答:NDK是一系列工具的集合
NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java應用打成apk包
NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu,平台等的差異,開發人員只需簡單的修改mk文件就可以創建出so
22.描述一下android的系統架構:
答:android系統架構分從下往上為Linux內核層、運行庫、應用程序框架層和應用程序層。
Linux內核層:負責硬體的驅動程序、網路、電源、系統安全以及內存管理等功能。
運行庫和androidruntion:運行庫:即c/c++函數庫部分,大多數都是開放源代碼的函數庫,例如webkit,該函數庫負責android網頁瀏覽器的運行;例如標準的c函數庫libc、openssl、sqlite等,當然也包括支持游戲開發的2dsgl和3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體文件格式。Androidruntion負責解釋和執行生成的dalvik格式的位元組碼
應用軟體架構:java應用程序開發人員主要是使用該層封裝好的api進行快速開發的。
應用程序層:該層是java的應用程序層,android內置的googlemaps、email、IM、瀏覽器等,都處於該層,java開發人員工發的程序也處於該層,而且和內置的應用程序具有平等的地位,可以調用內置的應用程序,也可以替換內置的應用程序

② java基礎面試題有哪些

下面是10道java基礎面試題,後附答案

1.什麼是 Java 虛擬機?為什麼 Java 被稱作是「平台無關的編程語言」?

Java 虛擬機是一個可以執行 Java 位元組碼的虛擬機進程。Java 源文件被編譯成能被 Java 虛擬機執行的位元組碼文件。

Java 被設計成允許應用程序可以運行在任意的平台,而不需要程序員為每一個平台單獨重寫或者是重新編譯。Java 虛擬機讓這個變為可能,因為它知道底層硬體平台的指令長度和其他特性。

2.「static」關鍵字是什麼意思?Java 中是否可以覆蓋(override)一個 private 或者是static 的方法?

「static」關鍵字表明一個成員變數或者是成員方法可以在沒有所屬的類的實例變數的情況下被訪問。

Java 中 static 方法不能被覆蓋,因為方法覆蓋是基於運行時動態綁定的,而 static 方法是編譯時靜態綁定的。static 方法跟類的任何實例都不相關,所以概念上不適用。

3.JDK 和 JRE 的區別是什麼?

Java 運行時環境(JRE)是將要執行 Java 程序的 Java 虛擬機。它同時也包含了執行 applet 需要的瀏覽器插件。Java 開發工具包 (JDK)是完整的 Java 軟體開發包,包含了 JRE,編譯器和其他的工具(比如:JavaDoc,Java 調試器),可以讓開發者開發、編譯、執行 Java 應用程序。

4.是否可以在 static 環境中訪問非 static 變數?

static 變數在 Java 中是屬於類的,它在所有的實例中的值是一樣的。當類被 Java 虛擬機載入的時候,會對 static 變數進行初始化。如果你的代碼嘗試不用實例來訪問非 static 的變數,編譯器會報錯,因為這些變數還沒有被創建出來,還沒有跟任何實例關聯上。

5.Java 支持的數據類型有哪些?什麼是自動拆裝箱?

Java 語言支持的 8 中基本數據類型是:

byte

short

int

long

float

double

boolean

char

自動裝箱是 Java 編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。比如:把 int 轉化成 Integer,double 轉化成 double,等等。反之就是自動拆箱。

6.Java 支持多繼承么?

不支持,Java 不支持多繼承。每個類都只能繼承一個類,但是可以實現多個介面。

7.Java 中,什麼是構造函數?什麼是構造函數重載?什麼是復制構造函數?

當新對象被創建的時候,構造函數會被調用。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,Java 編譯器會為這個類創建一個默認的構造函數。

Java 中構造函數重載和方法重載很相似。可以為一個類創建多個構造函數。每一個構造函數必須有它自己唯一的參數列表。

Java 不支持像 C++中那樣的復制構造函數,這個不同點是因為如果你不自己寫構造函數的情況下,Java 不會創建默認的復制構造函數。

8.Java 中的方法覆蓋(Overriding)和方法重載(Overloading)是什麼意思?

Java 中的方法重載發生在同一個類裡面兩個或者是多個方法的方法名相同但是參數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。

9.介面和抽象類的區別是什麼?

Java 提供和支持創建抽象類和介面。它們的實現有共同點,不同點在於:

介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。

類可以實現很多個介面,但是只能繼承一個抽象類

類如果要實現一個介面,它必須要實現介面聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。

抽象類可以在不提供介面方法實現的情況下實現介面。

Java 介面中聲明的變數默認都是 final 的。抽象類可以包含非 final 的變數。

Java 介面中的成員函數默認是 public 的。抽象類的成員函數可以是 private, protected 或者是 public。

介面是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含 main 方法的話是可以被調用的。

10.什麼是值傳遞和引用傳遞?

對象被值傳遞,意味著傳遞了對象的一個副本。因此,就算是改變了對象副本,也不會影響源對象的值。

對象被引用傳遞,意味著傳遞的並不是實際的對象,而是對象的引用。因此,外部對引用對象所做的改變會反映到所有的對象上。

最後祝你面試順利!

③ Android開源框架面試題:RxJava框架線程切換的原理,RxJava1與RxJava2有哪些區別

這道題意在評估求職者對流行框架RxJava的掌握程度,尤其是線程切換的應用能力。RxJava線程切換主要通過`subscribeOn()`和`observeOn()`方法實現。

`subscribeOn()`方法接收一個`Scheler`類作為參數,這個類負責在特定的線程中執行任務。`Scheler`的類型包括但不限於`Immediate`、`SingleThread`、`Computation`、`NewThread`和`NewSingle`等。調用此方法後,系統會返回一個`ObservableSubscribeOn`對象,這代表了在特定線程中創建的Observable。

`observeOn()`方法與`subscribeOn()`類似,但其作用是將Observable的事件傳遞到另一個線程或調度器。當調用`observeOn()`方法時,系統返回一個`ObservableObserveOn`對象。通過這兩個方法,可以靈活地在執行數據處理任務的不同線程之間切換。

在實際應用中,`subscribeOn()`方法通常用於定義數據源的執行線程,而`observeOn()`則用於指定事件處理和結果生成的線程。當數據源在主線程或特定線程中生成事件時,`observeOn()`將確保這些事件在正確的目標線程中被處理。

在RxJava的底層實現中,`subscribeOn()`和`observeOn()`方法的調用會改變Observable的實現方式,從而影響數據流的執行路徑。當一個Observable實例被訂閱時,`subscribeActual()`方法會被調用,此時如果`observeOn()`已經設置,將會調用對應的`ObservableObserveOn`的`subscribeActual()`方法。這個過程涉及到線程的切換,確保數據處理和事件觸發在正確的時間和環境下進行。

具體實現細節中,`subscribeOn()`會創建一個`SubscribeTask`實例,用於在指定的線程中執行數據流。這個任務實例會調用源Observable的`subscribe()`方法,進而觸發`subscribeActual()`方法。在`subscribeActual()`方法內部,會進一步調用`ObserveOnObserver`實例的`onSubscribe()`方法,從而在正確的線程中開始數據處理流程。

`observeOn()`則涉及到在特定線程中處理事件的邏輯。當事件在`ObserveOnObserver`的隊列中積累時,它們會被以非同步方式推送到目標線程,例如Android的主線程。通過`Handler`機制,事件可以在UI線程中被處理,確保用戶界面的響應性和性能。

在比較RxJava1和RxJava2時,主要區別在於背壓處理機制。RxJava2引入了更有效的背壓處理方式,以解決非同步場景下數據發送速度過快導致的緩沖溢出問題。這使得RxJava2在處理大量數據流時,能夠更高效地管理和避免內存泄露,從而提供更好的性能和用戶體驗。

為了幫助求職者准備Android面試,整理了一系列分類明確的面試題,包括但不限於RxJava、Kotlin、Dagger等技術。這些資源可以作為面試前復習和准備的輔助材料。面試題的更新和多樣化意味著求職者需要不斷學習和掌握最新的技術動態,以應對不斷變化的行業需求。

閱讀全文

與javaandroid面試題相關的資料

熱點內容
三星自帶壁紙在哪個文件夾里 瀏覽:565
eclipse中如何修改文件名 瀏覽:778
2014版高洛峰php視頻教程打包下載 瀏覽:765
ad文件名後邊的數字怎麼去掉 瀏覽:560
w7無線網路沒有了 瀏覽:222
資料庫utf8頁面是gbk 瀏覽:339
java介面傳送報文 瀏覽:809
如用Excel和製作文件夾標識 瀏覽:44
java中產生4位隨機數字 瀏覽:591
cad異常退出文件沒保存如何找到 瀏覽:506
全局配置文件json 瀏覽:951
wsimport本地wsdl文件 瀏覽:914
三星t550拆機教程 瀏覽:654
小米電腦沒網路怎麼辦 瀏覽:416
javaandroid面試題 瀏覽:891
u盤文件刪不掉格式化也不行 瀏覽:971
趣味編程是學些什麼東西 瀏覽:710
文件存放路徑怎麼寫 瀏覽:489
少兒機器人教育和編程哪個好 瀏覽:20
log4j日誌配置文件 瀏覽:966

友情鏈接