您好,登錄后才能下訂單哦!
在工作中有不少朋友聯系我,問我有沒有相關推薦的書或者資料可以學習的。
自己也在不斷的學習和提升,所以再這些過程中吧遇到的面試題整理了出來
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:mm14525201314)
onCreate()
-> onStart()
-> onResume()
-> onPause()
-> onStop()
-> onDetroy()
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對象
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組件,而頁面的生命周期方法也就是在這個方法中進行調用。
此處延伸:Volley里用的哪種請求方式(2.3前HttpClient
,2.3后HttpUrlConnection
)
首先HttpClient
和HttpUrlConnection
這兩種方式都支持Https
協議,都是以流的形式進行上傳或者下載數據,也可以說是以流的形式進行數據的傳輸,還有ipv6,以及連接池等功能。HttpClient這個擁有非常多的API,所以如果想要進行擴展的話,并且不破壞它的兼容性的話,很難進行擴展,也就是這個原因,Google在Android6.0的時候,直接就棄用了這個HttpClient.
而HttpUrlConnection
相對來說就是比較輕量級了,API比較少,容易擴展,并且能夠滿足Android大部分的數據傳輸。比較經典的一個框架volley,在2.3版本以前都是使用HttpClient
,在2.3以后就使用了HttpUrlConnection
。
Java虛擬機:
Dalvik虛擬機:
此處延伸:進程的優先級是什么
Context是一個抽象基類。在翻譯為上下文,也可以理解為環境,是提供一些程序的運行環境基礎信息。Context下有兩個子類,ContextWrapper
是上下文功能的封裝類,而ContextImpl
則是上下文功能的實現類。
而ContextWrapper
又有三個直接的子類, ContextThemeWrapper
、Service
和Application
。其中,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)
這個問題真的很不好回答。所以這里先來個算是比較恰當的比喻來形容下它們的關系吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater
像剪刀,Xml
配置像窗花圖紙。
1 Activity構造的時候會初始化一個Window,準確的說是
PhoneWindow
。
2 這個PhoneWindow
有一個“ViewRoot
”,這個“ViewRoot
”是一個View或者說ViewGroup
,是最初始的根視圖。
3 “ViewRoot
”通過addView
方法來一個個的添加View。比如TextView
,Button
等
4 這些View的事件監聽,是由WindowManagerService
來接受消息,并且回調Activity函數。比如onClickListener
,onKeyDown
等。
此處延伸:棧(First In Last Out)與隊列(First In First Out)的區別
棧與隊列的區別:
1.?隊列先進先出,棧先進后出
- 對插入和刪除操作的"限定"。 棧是限定只能在表的一端進行插入和刪除操作的線性表。 隊列是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
- 遍歷數據速度不同
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。
幀動畫:指通過指定每一幀的圖片和播放時間,有序的進行播放而形成動畫效果,比如想聽的律動條。
補間動畫:指通過指定View的初始狀態、變化時間、方式,通過一系列的算法去進行圖形變換,從而形成動畫效果,主要有Alpha、Scale、Translate、Rotate四種效果。注意:只是在視圖層實現了動畫效果,并沒有真正改變View的屬性,比如滑動列表,改變標題欄的透明度。
屬性動畫:在Android3.0的時候才支持,通過不斷的改變View的屬性,不斷的重繪而形成動畫效果。相比于視圖動畫,View的屬性是真正改變了。比如view的旋轉,放大,縮小。
此處延伸:簡述Binder
?AIDL: 每一個進程都有自己的Dalvik VM實例,都有自己的一塊獨立的內存,都在自己的內存上存儲自己的數據,執行著自己的操作,都在自己的那片狹小的空間里過完自己的一生。而aidl就類似與兩個進程之間的橋梁,使得兩個進程之間可以進行數據的傳輸,跨進程通信有多種選擇,比如 BroadcastReceiver
, Messenger 等,但是 BroadcastReceiver
占用的系統資源比較多,如果是頻繁的跨進程通信的話顯然是不可取的;Messenger 進行跨進程通信時請求隊列是同步進行的,無法并發執行。
?
Binde機制簡單理解:
在Android系統的Binder機制中,是有Client
,Service
,ServiceManager
,Binder
驅動程序組成的,其中Client
,service
,Service Manager
運行在用戶空間,Binder驅動程序是運行在內核空間的。而Binder就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder驅動程序,Service Manager
提供輔助管理的功能,而Client和Service正是在Binder驅動程序和Service Manager
提供的基礎設施上實現C/S 之間的通信。其中Binder驅動程序提供設備文件/dev/binder與用戶控件進行交互,
Client
、Service
,Service Manager
通過open和ioctl文件操作相應的方法與Binder驅動程序進行通信。而Client和Service之間的進程間通信是通過Binder驅動程序間接實現的。而Binder Manager是一個守護進程,用來管理Service,并向Client提供查詢Service接口的能力。
Android中主線程是不能進行耗時操作的,子線程是不能進行更新UI的。所以就有了handler,它的作用就是實現線程之間的通信。
handler整個流程中,主要有四個對象,handler
,Message
,MessageQueue
,Looper
。當應用創建的時候,就會在主線程中創建handler對象,
我們通過要傳送的消息保存到Message
中,handler通過調用sendMessage
方法將Message
發送到MessageQueue
中,Looper
對象就會不斷的調用loop()方法
不斷的從MessageQueue
中取出Message交給handler進行處理。從而實現線程之間的通信。
在Android系統的Binder機制中,是有Client
,Service
,ServiceManager
,Binder
驅動程序組成的,其中Client
,service
,Service Manager
運行在用戶空間,Binder驅動程序是運行在內核空間的。而Binder就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder驅動程序,Service Manager
提供輔助管理的功能,而Client
和Service
正是在Binder驅動程序和Service Manager
提供的基礎設施上實現C/S 之間的通信。其中Binder驅動程序提供設備文件/dev/binder與用戶控件進行交互,Client
、Service
,Service Manager
通過open和ioctl文件操作相應的方法與Binder驅動程序進行通信。而Client和Service之間的進程間通信是通過Binder驅動程序間接實現的。而Binder Manager
是一個守護進程,用來管理Service,并向Client提供查詢Service接口的能力。
我們知道Java虛擬機 —— JVM 是加載類的class文件的,而Android虛擬機——Dalvik/ART VM 是加載類的dex
文件,
而他們加載類的時候都需要ClassLoader,ClassLoader
有一個子類BaseDexClassLoader
,而BaseDexClassLoader
下有一個
數組——DexPathList
,是用來存放dex
文件,當BaseDexClassLoader
通過調用findClass
方法時,實際上就是遍歷數組,
找到相應的dex
文件,找到,則直接將它return。而熱修復的解決方法就是將新的dex
添加到該集合中,并且是在舊的dex
的前面,
所以就會優先被取出來并且return返回。
(1) 對圖片本身進行操作。盡量不要使用
setImageBitmap
、setImageResource
、BitmapFactory.decodeResource
來設置一張大圖,因為這些方法在完成decode后,
最終都是通過java層的createBitmap
來完成的,需要消耗更多內存.
(2) 圖片進行縮放的比例,SDK中建議其值是2的指數值,值越大會導致圖片不清晰。
(3) 不用的圖片記得調用圖片的recycle()方法
此處延伸:手寫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
完成。還有一點就是Presenter
與View
之間的交互是通過接口的
(1) 安裝和下載Cygwin,下載 Android NDK
(2) 在ndk項目中JNI接口的設計
(3) 使用C/C++實現本地方法
(4) JNI生成動態鏈接庫.so文件
(5) 將動態鏈接庫復制到java工程,在java工程中調用,運行java工程即可
RecyclerView
可以完成ListView
,GridView
的效果,還可以完成瀑布流的效果。同時還可以設置列表的滾動方向(垂直或者水平);
RecyclerView
中view的復用不需要開發者自己寫代碼,系統已經幫封裝完成了RecyclerView
可以進行局部刷新。
RecyclerView
提供了API來實現item的動畫效果。
在性能上:
如果需要頻繁的刷新數據,需要添加動畫,則RecyclerView
有較大的優勢。
如果只是作為列表展示,則兩者區別并不是很大。
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 三次握手,四次揮 手
文章有點長,所以部分問題沒有輔之答案,
所有的答案,請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:mm14525201314)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。