第一種解決思路:設置配置文件中Activity的configChanges屬性。 咱們可在AndroidManifest.xml中對應的Activity中設置android:configChanges="orientation|screenSize"。再次旋轉屏幕,Activity不會被殺死重建,會直接調用onConfigurationChanged。所以,在這種狀況下,咱們只須要指定configChanges屬性,而且重寫onConfigurationChanged()方法便可。android
Activity從新建立時會調用onRestoreInstanceState(注意:此時調用該方法是在onStart以後),而且將onSaveInstanceState所保存的Bundle對象做爲參數傳到**onRestoreInstanceState(Bundle savedInstanceState)和onCreate(Bundle savedInstanceState)**方法。咱們也能夠經過這兩種方法來判斷Activity是否被重建,並進行數據恢復。面試
首先咱們先保證權限性,在有權限的條件下,經過隱式Intent進行目標Activity的IntentFilter匹配:算法
1.Intent中的Action必須可以和Activity過濾規則中的Action匹配.(這裏的匹配是徹底相等). 一個過濾規則中有多個action,那麼只要Intent中的action可以和Activity過濾規則中的任何一個action相同便可匹配成功。編程
2.若是Intent中的存在category那麼全部的category都必須和Activity過濾規則中的category相同。才能和這個Activity匹配。Intent中的category數量可能少於Activity中配置的category數量,可是Intent中的這category必須和Activity中配置的category相同才能匹配。數組
3.若是Intent中的存在data那麼全部的data都必須和Activity過濾規則中的data相同。才能和這個Activity匹配。Intent中的data數量可能少於Activity中配置的data數量,可是Intent中的這data必須和Activity中配置的data相同才能匹配。緩存
Fragment完整的生命週期:onAttach(Fragment和Activity創建關聯時調用) ——> onCreate(fragment初始化) ——> onCreateView(Fragment建立視圖時調用) ——> onActivityCreated(與Fragment關聯的Activity完成onCreate()以後調用)——> onStart(正在啓動,此時可見可是沒處在前臺,不可與用戶交互) ——> onResume(得到焦點,可見且處於前臺,能夠進行活動) ——> onPause(正在中止,此時能夠進行數據存儲、中止動畫等操做) ——> onDestroyView(佈局移除時調用) ——> onDestroy(銷燬) ——> onDetch(解除Fragment和Activity的關聯)。安全
Fragment可做爲Activity的界面組成部分,可在Activity運行中動態的實現加入、移除和交換。性能優化
一個Activity能夠擁有多個Fragment,一個Fragment也能夠依附於多個Activity。服務器
Activity的FragmentManager負責調用隊列中的Fragment的生命週期方法,只要Fragment的狀態與Activity的狀態保持一致,宿主Activity的FragmentManager就會繼續調用其餘生命週期方法以保持Fragment和Activity的狀態一致。網絡
onCreate():服務第一次被建立時調用。
onStartCommand():服務啓動時調用。
onBind():服務被綁定時調用。
onUnBind():服務被解綁時調用。
onDestroy():服務中止時調用。
第一種啓動方式:其餘組件調用Context的StartService()方法啓動一個Service,並回調服務中的onStartCommand()。若是服務以前沒有建立,那麼回調的順序是onCreate() ——> onStartCommand()。服務啓動以後會一直保持運行狀態,直到stopService()或stopSelf()方法被調用,服務中止並回調onDestroy()。
第二種啓動方式:其餘組件調用Context的bindService()綁定一個Service,並回調服務中的onBind()方法,若是服務以前沒有建立,那麼回調的順序是onCreate() ——> onBind()。以後,調用方能夠獲取到onBind()方法中返回的IBinder對象的實例,從而實現和服務進行通訊。只要調用方和服務之間的鏈接沒有斷開,服務就會一直保持運行狀態,直到調用了UnBindService()方法服務中止,回調順序onUnBind() ——> onDestroy()。
Android:Activity與Fragment、Service之間的數據通訊
Service默認並不會運行在子線程中,也不運行在一個獨立的進程中,它一樣執行在主線程中(UI線程)。也就是說,咱們不要在Service中進行耗時操做,不然可能會出現主線程被阻塞(ANR)的狀況。
經過調用AlarmManager的set()方法就能夠設置一個定時任務,提供三個參數(工做類型,定時任務觸發的時間,PendingIntent對象),其中PendingIntent對象是關鍵,調用它的getBoardcast()方法來獲取一個可以執行廣播的PendingIntent。當定時任務被觸發時,廣播接收器的onReceive()方法得以執行。即經過服務和廣播的循環觸發實現定時服務。
一、三次揮手、四次揮手過程?
(1) 創建TCP鏈接:TCP的三次握手
步驟:客戶端向服務端發送一個表示創建鏈接的報文段SYN報文段;一旦包含SYN報文段的IP數據報到達服務器主機,服務器從IP數據報中提取出TCP、SYN報文段,爲該TCP鏈接分配須要的緩存和變量,並向客戶端發送表示容許鏈接的報文段ACK;在收到ACK報文段以後,客戶端也要給該鏈接分配緩存和變量,客戶端向服務器再發送一個報文段ACK,表示對容許鏈接的報文段進行了確認,自此完成一次TCP鏈接。【第三次握手能夠避免因爲客戶端延遲的請求鏈接的請求,使得服務端無端再次創建鏈接】
(2)解除TCP鏈接:TCP的四次揮手
步驟:因爲TCP鏈接是全雙工的,所以要解除鏈接咱們要在每一個方向都必須單獨關閉。客戶端在數據發送完畢後發送一個結束數據段FIN,服務端返回確認數據段ACK,在此結束了客戶端到服務端的鏈接,而後客戶端接收到服務端發送的FIN,且服務端也收到ACK以後,到此雙方的數據通訊就徹底結束。一共須要四個步驟:服務器讀通道關閉 -> 客戶端寫通道關閉 -> 客戶機讀通道通道關閉 -> 服務器寫通道關閉。
二、Http、Https的區別?
三、get、post的區別?
一、Java集合框架中有哪些類?都有什麼特色?
可將Java集合框架大體可分爲Set、List、Queue 和Map四種體系
二、ArrayList和LinkList的區別?
三、HashMap是如何擴容的?如何避免擴容?
HashMap幾個默認值,初始容量爲1六、填充因子默認爲0.7五、擴容時容量翻倍。也就是說當HashMap中元素個數超過160.75=12時會把數組的大小擴展爲216=32,而後從新計算每一個元素在數組中的位置 。
因爲每次擴容還須要從新計算元素Hash值,損耗性能,因此建議在使用HashMap時,最好先估算Map的大小,設置初始值,避免頻繁擴容。
四、synchronized和volatile的區別?
#操做系統
一、操做系統中進程和線程的區別?
二、進程的死鎖?
概述
死鎖是指多個進程因循環等待資源而形成沒法執行的現象,它會形成進程沒法執行,同時會形成系統資源的極大浪費。
產生
互斥使用:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。若是此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
不可搶佔:指進程已得到的資源,在未使用完以前,不能被剝奪,只能在使用完時由本身釋放。
請求和保持:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對本身已得到的其它資源保持不放。
循環等待:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
解決死鎖的方法
銀行家算法:判斷這次請求是否形成死鎖若會形成死鎖,不然拒絕該請求
鴕鳥算法:經常使用在極少發生死鎖的狀況
避免
經過合理的資源分配算法來確保永遠不會造成環形等待的封閉進程鏈,即「若是一個進程的當前請求的資源會致使死鎖,系統拒絕啓動該進程;若是一個資源的分配會致使下一步的死鎖,系統就拒絕本次的分配」。
最後送福利了,如今關注我而且加入羣聊能夠獲取包含源碼解析,自定義View,動畫實現,架構分享等。 內容難度適中,篇幅精煉,天天只需花上十幾分鍾閱讀便可。 你們能夠跟我一塊兒探討,歡迎加羣探討,有flutter—性能優化—移動架構—資深UI工程師 —NDK相關專業人員和視頻教學資料,還有更多面試題等你來拿~ 羣號:661841852