中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

46道面試題,帶你了解中高級面試(View+Handler+

發布時間:2020-03-07 13:46:01 來源:網絡 閱讀:347 作者:Android丶VG 欄目:移動開發

在工作中有不少朋友聯系我,問我有沒有相關推薦的書或者資料可以學習的。
自己也在不斷的學習和提升,所以再這些過程中吧遇到的面試題整理了出來

46道面試題,帶你了解中高級面試(View+Handler+
46道面試題,帶你了解中高級面試(View+Handler+

(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:mm14525201314)

一.Android中高級面試題

1、Activity生命周期?

onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

2、Service生命周期?

service 啟動方式有兩種,一種是通過startService()方式進行啟動,另一種是通過bindService()方式進行啟動。不同的啟動方式他們的生命周期是不一樣.

通過startService()這種方式啟動的service,生命周期是這樣:調用startService() --> onCreate()--> onStartConmon()--> onDestroy()。這種方式啟動的話,需要注意一下幾個問題,
第一:當我們通過startService被調用以后,多次在調用startService(),onCreate()方法也只會被調用一次,而onStartConmon()會被多次調用當我們調用stopService()的時候,onDestroy()就會被調用,從而銷毀服務。
第二:當我們通過startService啟動時候,通過intent傳值,在onStartConmon()方法中獲取值的時候,一定要先判斷intent是否為null。

通過bindService()方式進行綁定,這種方式綁定service,生命周期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy()?bingservice 這種方式進行啟動service好處是更加便利activity中操作service,比如加入service中有幾個方法,a,b ,如果要在activity中調用,在需要在activity獲取ServiceConnection對象,通過ServiceConnection來獲取service中內部類的類對象,然后通過這個類對象就可以調用類中的方法,當然這個類需要繼承Binder對象

3、Activity的啟動過程(不要回答生命周期)

app啟動的過程有兩種情況,第一種是從桌面launcher上點擊相應的應用圖標,第二種是在activity中通過調用startActivity來啟動一個新的activity。

我們創建一個新的項目,默認的根activity都是MainActivity,而所有的activity都是保存在堆棧中的,我們啟動一個新的activity就會放在上一個activity上面,而我們從桌面點擊應用圖標的時候,由于launcher本身也是一個應用,當我們點擊圖標的時候,系統就會調用startActivitySately(),一般情況下,我們所啟動的activity的相關信息都會保存在intent中,比如action,category等等。我們在安裝這個應用的時候,系統也會啟動一個PackaManagerService的管理服務,這個管理服務會對AndroidManifest.xml文件進行解析,從而得到應用程序中的相關信息,比如service,activity,Broadcast等等,然后獲得相關組件的信息。

當我們點擊應用圖標的時候,就會調用startActivitySately()方法,而這個方法內部則是調用startActivty(),而startActivity()方法最終還是會調用startActivityForResult()這個方法。而在startActivityForResult()這個方法。因為startActivityForResult()方法是有返回結果的,所以系統就直接給一個-1,就表示不需要結果返回了。

startActivityForResult()這個方法實際是通過Instrumentation類中的execStartActivity()方法來啟動activity,Instrumentation這個類主要作用就是監控程序和系統之間的交互。而在這個execStartActivity()方法中會獲取ActivityManagerService的代理對象,通過這個代理對象進行啟動activity。啟動會就會調用一個checkStartActivityResult()方法,如果說沒有在配置清單中配置有這個組件,就會在這個方法中拋出異常了。當然最后是調用的是Application.scheduleLaunchActivity()進行啟動activity,而這個方法中通過獲取得到一個ActivityClientRecord對象,而這個ActivityClientRecord通過handler來進行消息的發送,系統內部會將每一個activity組件使用ActivityClientRecord對象來進行描述,而ActivityClientRecord對象中保存有一個LoaderApk對象,通過這個對象調用handleLaunchActivity來啟動activity組件,而頁面的生命周期方法也就是在這個方法中進行調用。

4、Broadcast注冊方式與區別?
5、HttpClient與HttpUrlConnection的區別?

此處延伸:Volley里用的哪種請求方式(2.3前HttpClient,2.3后HttpUrlConnection

首先HttpClientHttpUrlConnection 這兩種方式都支持Https協議,都是以流的形式進行上傳或者下載數據,也可以說是以流的形式進行數據的傳輸,還有ipv6,以及連接池等功能。HttpClient這個擁有非常多的API,所以如果想要進行擴展的話,并且不破壞它的兼容性的話,很難進行擴展,也就是這個原因,Google在Android6.0的時候,直接就棄用了這個HttpClient.

HttpUrlConnection相對來說就是比較輕量級了,API比較少,容易擴展,并且能夠滿足Android大部分的數據傳輸。比較經典的一個框架volley,在2.3版本以前都是使用HttpClient,在2.3以后就使用了HttpUrlConnection

6、java虛擬機和Dalvik虛擬機的區別?

Java虛擬機:

  • java虛擬機基于棧。?基于棧的機器必須使用指令來載入和操作棧上數據,所需指令更多更多。
  • java虛擬機運行的是java字節碼。(java類會被編譯成一個或多個字節碼.class文件)

Dalvik虛擬機:

  • dalvik虛擬機是基于寄存器的
  • Dalvik運行的是自定義的.dex字節碼格式。(java類被編譯成.class文件后,會通過一個dx工具將所有的.class文件轉換成一個.dex文件,然后dalvik虛擬機會從其中讀取指令和數據
  • 常量池已被修改為只使用32位的索引,以 簡化解釋器。
  • 一個應用,一個虛擬機實例,一個進程(所有android應用的線程都是對應一個linux線程,都運行在自己的沙盒中,不同的應用在不同的進程中運行。每個android dalvik應用程序都被賦予了一個獨立的linux PID(app_*))
7、進程保活(不死進程)

此處延伸:進程的優先級是什么

8、講解一下Context?

Context是一個抽象基類。在翻譯為上下文,也可以理解為環境,是提供一些程序的運行環境基礎信息。Context下有兩個子類,ContextWrapper是上下文功能的封裝類,而ContextImpl則是上下文功能的實現類。

ContextWrapper又有三個直接的子類, ContextThemeWrapperServiceApplication。其中,ContextThemeWrapper是一個帶主題的封裝類,而它有一個直接子類就是Activity,所以Activity和Service以及Application的Context是不一樣的,只有Activity需要主題,Service不需要主題。Context一共有三種類型,分別是Application、Activity和Service。這三個類雖然分別各種承擔著不同的作用,但它們都屬于Context的一種,而它們具體Context的功能則是由ContextImpl類去實現的,因此在絕大多數場景下,Activity、Service和Application這三種類型的Context都是可以通用的。不過有幾種場景比較特殊,比如啟動Activity,還有彈出Dialog。

出于安全原因的考慮,Android是不允許Activity或Dialog憑空出現的,一個Activity的啟動必須要建立在另一個Activity的基礎之上,也就是以此形成的返回棧。而Dialog則必須在一個Activity上面彈出(除非是System Alert類型的Dialog),因此在這種場景下,我們只能使用Activity類型的Context,否則將會出錯。

?
getApplicationContext()getApplication()方法得到的對象都是同一個application對象,只是對象的類型不一樣。

Context數量 = Activity數量 + Service數量 + 1 (1為Application)

9、理解Activity,View,Window三者關系

這個問題真的很不好回答。所以這里先來個算是比較恰當的比喻來形容下它們的關系吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。

1 Activity構造的時候會初始化一個Window,準確的說是PhoneWindow
2 這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。
3ViewRoot”通過addView方法來一個個的添加View。比如TextViewButton
4 這些View的事件監聽,是由WindowManagerService來接受消息,并且回調Activity函數。比如onClickListeneronKeyDown等。

10、四種LaunchMode及其使用場景

此處延伸:棧(First In Last Out)與隊列(First In First Out)的區別

棧與隊列的區別:

1.?隊列先進先出,棧先進后出

  1. 對插入和刪除操作的"限定"。 棧是限定只能在表的一端進行插入和刪除操作的線性表。 隊列是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
  2. 遍歷數據速度不同

standard 模式

這是默認模式,每次激活Activity時都會創建Activity實例,并放入任務棧中。使用場景:大多數Activity。

singleTop 模式

如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例并放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。使用場景如新聞類或者閱讀類App的內容頁面。

singleTask 模式

如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。使用場景如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面。

singleInstance 模式

在一個新棧中創建該Activity的實例,并讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在于某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當于多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。使用場景如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用于中間頁面,如果用于中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。

11、View的繪制流程
12、View,ViewGroup事件分發
13、保存Activity狀態
14、Android中的幾種動畫

幀動畫:指通過指定每一幀的圖片和播放時間,有序的進行播放而形成動畫效果,比如想聽的律動條。

補間動畫:指通過指定View的初始狀態、變化時間、方式,通過一系列的算法去進行圖形變換,從而形成動畫效果,主要有Alpha、Scale、Translate、Rotate四種效果。注意:只是在視圖層實現了動畫效果,并沒有真正改變View的屬性,比如滑動列表,改變標題欄的透明度。

屬性動畫:在Android3.0的時候才支持,通過不斷的改變View的屬性,不斷的重繪而形成動畫效果。相比于視圖動畫,View的屬性是真正改變了。比如view的旋轉,放大,縮小。

15、Android中跨進程通訊的幾種方式
16、AIDL理解

此處延伸:簡述Binder

?AIDL: 每一個進程都有自己的Dalvik VM實例,都有自己的一塊獨立的內存,都在自己的內存上存儲自己的數據,執行著自己的操作,都在自己的那片狹小的空間里過完自己的一生。而aidl就類似與兩個進程之間的橋梁,使得兩個進程之間可以進行數據的傳輸,跨進程通信有多種選擇,比如 BroadcastReceiver, Messenger 等,但是 BroadcastReceiver 占用的系統資源比較多,如果是頻繁的跨進程通信的話顯然是不可取的;Messenger 進行跨進程通信時請求隊列是同步進行的,無法并發執行。

?
Binde機制簡單理解:

在Android系統的Binder機制中,是有Client,Service,ServiceManager,Binder驅動程序組成的,其中ClientserviceService Manager運行在用戶空間,Binder驅動程序是運行在內核空間的。而Binder就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder驅動程序,Service Manager提供輔助管理的功能,而Client和Service正是在Binder驅動程序和Service Manager提供的基礎設施上實現C/S 之間的通信。其中Binder驅動程序提供設備文件/dev/binder與用戶控件進行交互,

ClientServiceService Manager通過open和ioctl文件操作相應的方法與Binder驅動程序進行通信。而Client和Service之間的進程間通信是通過Binder驅動程序間接實現的。而Binder Manager是一個守護進程,用來管理Service,并向Client提供查詢Service接口的能力。

17、Handler的原理

Android中主線程是不能進行耗時操作的,子線程是不能進行更新UI的。所以就有了handler,它的作用就是實現線程之間的通信。

handler整個流程中,主要有四個對象,handlerMessage,MessageQueue,Looper。當應用創建的時候,就會在主線程中創建handler對象,

我們通過要傳送的消息保存到Message中,handler通過調用sendMessage方法將Message發送到MessageQueue中,Looper對象就會不斷的調用loop()方法

不斷的從MessageQueue中取出Message交給handler進行處理。從而實現線程之間的通信。

18、Binder機制原理

在Android系統的Binder機制中,是有Client,Service,ServiceManager,Binder驅動程序組成的,其中ClientserviceService Manager運行在用戶空間,Binder驅動程序是運行在內核空間的。而Binder就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder驅動程序,Service Manager提供輔助管理的功能,而ClientService正是在Binder驅動程序和Service Manager提供的基礎設施上實現C/S 之間的通信。其中Binder驅動程序提供設備文件/dev/binder與用戶控件進行交互,ClientServiceService Manager通過open和ioctl文件操作相應的方法與Binder驅動程序進行通信。而Client和Service之間的進程間通信是通過Binder驅動程序間接實現的。而Binder Manager是一個守護進程,用來管理Service,并向Client提供查詢Service接口的能力。

19、熱修復的原理

我們知道Java虛擬機 —— JVM 是加載類的class文件的,而Android虛擬機——Dalvik/ART VM 是加載類的dex文件,

而他們加載類的時候都需要ClassLoader,ClassLoader有一個子類BaseDexClassLoader,而BaseDexClassLoader下有一個

數組——DexPathList,是用來存放dex文件,當BaseDexClassLoader通過調用findClass方法時,實際上就是遍歷數組,

找到相應的dex文件,找到,則直接將它return。而熱修復的解決方法就是將新的dex添加到該集合中,并且是在舊的dex的前面,

所以就會優先被取出來并且return返回。

20、Android內存泄露及管理
21、Fragment與Fragment、Activity通信的方式
22、Android UI適配
23、app優化
24、圖片優化

(1) 對圖片本身進行操作。盡量不要使用setImageBitmapsetImageResourceBitmapFactory.decodeResource來設置一張大圖,因為這些方法在完成decode后,
最終都是通過java層的createBitmap來完成的,需要消耗更多內存.
(2) 圖片進行縮放的比例,SDK中建議其值是2的指數值,值越大會導致圖片不清晰。
(3) 不用的圖片記得調用圖片的recycle()方法

25、HybridApp WebView和JS交互
26、JAVA GC原理
27、ANR
28、設計模式
29、RxJava
30、MVP,MVC,MVVM

此處延伸:手寫mvp例子,與mvc之間的區別,mvp的優勢

MVP模式,對應著Model--業務邏輯和實體模型,view--對應著activity,負責View的繪制以及與用戶交互,Presenter--負責View和Model之間的交互,MVP模式是在MVC模式的基礎上,將Model與View徹底分離使得項目的耦合性更低,在Mvc中項目中的activity對應著mvc中的C--Controllor,而項目中的邏輯處理都是在這個C中處理,同時View與Model之間的交互,也是也就是說,mvc中所有的邏輯交互和用戶交互,都是放在Controllor中,也就是activity中。

View和model是可以直接通信的。而MVP模式則是分離的更加徹底,分工更加明確Model--業務邏輯和實體模型,view--負責與用戶交互,Presenter 負責完成View于Model間的交互,MVP和MVC最大的區別是MVC中是允許Model和View進行交互的,而MVP中很明顯,Model與View之間的交互由Presenter完成。還有一點就是PresenterView之間的交互是通過接口的

31、手寫算法(選擇冒泡必須要會)
32、JNI?

(1) 安裝和下載Cygwin,下載 Android NDK
(2) 在ndk項目中JNI接口的設計
(3) 使用C/C++實現本地方法
(4) JNI生成動態鏈接庫.so文件
(5) 將動態鏈接庫復制到java工程,在java工程中調用,運行java工程即可

33、RecyclerView和ListView的區別

RecyclerView可以完成ListView,GridView的效果,還可以完成瀑布流的效果。同時還可以設置列表的滾動方向(垂直或者水平);

RecyclerView中view的復用不需要開發者自己寫代碼,系統已經幫封裝完成了
RecyclerView可以進行局部刷新。

RecyclerView提供了API來實現item的動畫效果。

在性能上:

如果需要頻繁的刷新數據,需要添加動畫,則RecyclerView有較大的優勢。

如果只是作為列表展示,則兩者區別并不是很大。

34、Universal-ImageLoader,Picasso,Fresco,Glide對比
35、Xutils, OKhttp, Volley, Retrofit對比

二. Java

1、線程中sleep和wait的區別
2、Thread中的start()和run()方法有什么區別
3、關鍵字final和static是怎么使用的。
4、String,StringBuffer,StringBuilder區別
5、Java中重載和重寫的區別:
6、Http https區別
7、Http位于TCP/IP模型中的第幾層?為什么說Http是可靠的數據傳輸協議?
8、HTTP鏈接的特點
9、TCP和UDP的區別
10、Socket建立網絡連接的步驟
11 、Tcp /IP 三次握手,四次揮 手

文章有點長,所以部分問題沒有輔之答案46道面試題,帶你了解中高級面試(View+Handler+

所有的答案,請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:mm14525201314)
46道面試題,帶你了解中高級面試(View+Handler+

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

察哈| 吉安市| 庆云县| 滁州市| 嵊泗县| 普兰县| 华宁县| 正阳县| 来安县| 都安| 黄梅县| 永吉县| 南投市| 望城县| 怀安县| 布尔津县| 英山县| 玛多县| 甘德县| 萝北县| 新密市| 监利县| 太白县| 武定县| 理塘县| 会东县| 荥阳市| 鹰潭市| 龙井市| 宜州市| 获嘉县| 嵊泗县| 永清县| 沙坪坝区| 江门市| 亳州市| 临夏市| 无棣县| 达尔| 内黄县| 加查县|