9419頁最新一線網際網路Android面試題解析大全
網上高階工程師面試相關文章魚龍混雜,要麼一堆內容,要麼內容質量太淺, 鑑於此我整理了如下安卓開發高階工程師面試題以及答案幫助大家順利進階,下面進入正題:
一、Android相關
1.Activity
1.1生命週期
- Activity A 啟動另一個Activity B,回撥如下:
Activity A 的onPause() → Activity B的onCreate() → onStart() → onResume() → Activity A的onStop();如果B是透明主題又或則是個DialogActivity,則不會回撥A的onStop;
- 使用onSaveInstanceState()儲存簡單,輕量級的UI狀態
lateinit var textView: TextView
var gameState: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
gameState = savedInstanceState?.getString(GAME_STATE_KEY)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.text_view)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
textView.text = savedInstanceState?.getString(TEXT_VIEW_KEY)
}
override fun onSaveInstanceState(outState: Bundle?) {
outState?.run {
putString(GAME_STATE_KEY, gameState)
putString(TEXT_VIEW_KEY, textView.text.toString())
}
super.onSaveInstanceState(outState)
}
1.2如何儲存Activity的狀態?
一般來說,呼叫onPause()和onStop()方法後的Activity例項仍然存在於記憶體中,Activity的所有資訊和狀態資料不會消失,當Activity重新回到前臺後,所有的改變都會得到保留。
但是當系統記憶體不足時,呼叫onPause()和onStop()方法後的Activity可能會被系統摧毀,此時記憶體中就不會存有該Activity的例項物件了。如果之後這個Activity重新回到前臺,之前所做的改變就會消失,為避免此種情況的發生,我們可以複寫onSaveIntanceState()方法。onSaveInatanceState()方法接受一個Bundle型別的引數,開發者可以將狀態資料儲存到這個Bundle物件中。如果滴啊用onSaveInstanceState()方法,呼叫將發生在onPause()或onStop()方法之前。
1.3如何儲存 Activity 的狀態?
Activity 的狀態通常情況下系統會自動儲存的,只有當我們需要儲存額外的資料時才需要使用到這樣的功能。
一般來說, 呼叫 onPause()和 onStop()方法後的 activity 例項仍然存在於記憶體中, activity的所有資訊和狀態資料不會消失, 當 activity 重新回到前臺之後, 所有的改變都會得到保留。
但是當系統記憶體不足時, 呼叫 onPause()和 onStop()方法後的 activity 可能會被系統摧毀, 此時記憶體中就不會存有該activity 的例項物件了。如果之後這個 activity 重新回到前臺, 之前所作的改變就會消失。為了避免此種情況的發生 ,我們可以覆寫 onSaveInstanceState() 方法。onSaveInstanceState()方法接受一個 Bundle型別的引數, 開發者可以將狀態資料儲存到這個Bundle物件中, 這樣即使activity被系統摧毀,當用戶重新啟動這個activity而呼叫它的onCreate()方法時, 上述的 Bundle 物件會作為實參傳遞給onCreate()方法, 開發者可以從 Bundle 物件中取出儲存的資料, 然後利用這些資料將 activity恢復到被摧毀之前的狀態。
需要注意的是, onSaveInstanceState()方法並不是一定會被呼叫的, 因為有些場景是不需要儲存狀態資料的. 比如使用者按下 BACK 鍵退出 activity 時, 使用者顯然想要關閉這個 activity, 此時是沒有必要儲存資料以供下次恢復的, 也就是 onSaveInstanceState() 方法不會被呼叫. 如果呼叫onSaveInstanceState()方法, 呼叫將發生在 onPause()或 onStop()方法之前。
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub super.onSaveInstanceState(outState);
}
- 1.4 兩個Activity之間跳轉時必然會執行的是哪幾個方法?
- 1.5 橫豎屏切換時Activity的生命週期
- 1.6 如何將一個Activity設定成視窗的樣式
- 1.7 如何退出Activity?如何安全退出已呼叫多個Activity的Application?
- 1.8 Android中的Context,Activity,Appliction有什麼區別?
........
面試題解析內容全部免費分享,有需要完整版的小夥伴【點選我】免費獲取哦!
2.Service
2.1Service是否在main thread中執行, service裡面是否能執行耗時的操作?
預設情況,如果沒有顯示的指servic所執行的程序, Service和activity是執行在當前app所在程序的main thread(UI主執行緒)裡面。
service裡面不能執行耗時的操作(網路請求,拷貝資料庫,大檔案 )
特殊情況 ,可以在清單檔案配置 service 執行所在的程序 ,讓service在另外的程序中執行。
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
2.2Activity怎麼和Service繫結,怎麼在Activity中啟動自己對應的Service?
Activity通過bindService(Intent service, ServiceConnection conn, int flags)跟Service進行繫結,當繫結成功的時候Service會將代理物件通過回撥的形式傳給conn,這樣我們就拿到了Service提供的服務代理物件。
在Activity中可以通過startService和bindService方法啟動Service。一般情況下如果想獲取Service的服務物件那麼肯定需要通過bindService()方法,比如音樂播放器,第三方支付等。如果僅僅只是為了開啟一個後臺任務那麼可以使用startService()方法。
2.3說說Activity、Intent、Service是什麼關係
他們都是Android開發中使用頻率最高的類。其中Activity和Service都是Android四大元件之一。他倆都是Context類的子類ContextWrapper的子類,因此他倆可以算是兄弟關係吧。不過兄弟倆各有各自的本領,Activity負責使用者介面的顯示和互動,Service負責後臺任務的處理。Activity和Service之間可以通過Intent傳遞資料,因此可以把Intent看作是通訊使者。
- 2.4 Service和Activity在同一個執行緒嗎?
- 2.5 Service有哪些啟動方法,有什麼區別,怎樣停用Service?
- 2.6 什麼是IntentService?有何優點?
- 2.7 請描述一下Service的生命週期
- 2.8 Service啟動過程
......
面試題解析內容全部免費分享,有需要完整版的小夥伴【點選我】免費獲取哦!
3. ListView
3.1ListView如何提高其效率?
當convertView為空時,用setTag()方法為每個View繫結一個存放控制元件的ViewHolder物件。當convertView不為空,重複利用已經建立的view的時候,使用getTag()方法獲取繫結的ViewHolder物件,這樣就避免了findViewById對控制元件的層層查詢,而是快速定位到控制元件。
① 複用ConvertView,使用歷史的view,提升效率200%
② 自定義靜態類ViewHolder,減少findViewById的次數。提升效率50%
③ 非同步載入資料,分頁載入資料。
④ 使用WeakRefrence引用ImageView物件。
3.2ListView如何實現分頁載入
① 設定ListView的滾動監聽器:setOnScrollListener(new OnScrollListener{….})
在監聽器中有兩個方法: 滾動狀態發生變化的方法(onScrollStateChanged)和listView被滾動時呼叫的方法(onScroll)
② 在滾動狀態發生改變的方法中,有三種狀態:
手指按下移動的狀態:SCROLL_STATE_TOUCH_SCROLL: // 觸控滑動
慣性滾動(滑翔(flgin)狀態):SCROLL_STATE_FLING: // 滑翔
靜止狀態: SCROLL_STATE_IDLE: // 靜止
對不同的狀態進行處理:
分批載入資料,只關心靜止狀態:關心最後一個可見的條目,如果最後一個可見條目就是資料介面卡(集合)裡的最後一個,此時可載入更多的資料。在每次載入的時候,計算出滾動的數量,當滾動的數量大於等於總數量的時候,可以提示使用者無更多資料了。
3.3ListView可以顯示多種型別的條目嗎
這個當然可以的,ListView顯示的每個條目都是通過baseAdapter的getView(int position, View convertView, ViewGroup parent)來展示的,理論上我們完全可以讓每個條目都是不同型別的view。
比如:從伺服器拿回一個標識為id=1,那麼當id=1的時候,我們就載入型別一的條目,當id=2的時候,載入型別二的條目。常見佈局在資訊類客戶端中可以經常看到。
除此之外adapter還提供了getViewTypeCount()和getItemViewType(int position)兩個方法。在getView方法中我們可以根據不同的viewtype載入不同的佈局檔案。
- 3.4當ListView資料集改變後,如何更新ListView
- 3.5ListView如何定位到指定位置
- 3.6如何在ScrollView中如何嵌入ListView
- 3.7ListView中如何優化圖片
- 3.8ListView中圖片錯位的問題是如何產生的
......
4.Fragment
- 什麼是Fragment ?
- Fragment的生命週期
- Fragment的使用方式
- Fragment 生命週期和 Activity 對比
- 什麼是Fragment的回退棧?
- Fragment重疊問題
......
5.Android 效能優化
- 如何對Android應用進行效能分析
- 什麼情況下會導致記憶體洩露
- 如何避免OOM異常
- Android中如何捕獲未捕獲的異常
- ANR是什麼?怎樣避免和解決ANR
......
面試題解析內容全部免費分享,有需要完整版的小夥伴【點選我】免費獲取哦!
6.Handler
- Handler Looper Message 關係是什麼?
- Messagequeue 的資料結構是什麼?為什麼要用這個資料結構?
- Handler post 方法原理?
- 如何在子執行緒中建立 Handler?
......
7.Flutter相關面試題
- Flutter 是什麼?
- Flutter 特性有哪些?
- Flutter 中的生命週期
- PlatformView
- Platform Channel
- Flutter 和 Dart的關係是什麼?
- Widget 和 element 和 RenderObject 之間的關係?
- mixin extends implement 之間的關係?
- 使用mixins的條件是什麼?
最後
面試是跳槽漲薪最直接有效的方式,現在可以開始準備明年春季的面試了,各位做好面試造飛機,工作擰螺絲的準備了嗎?
掌握了這些知識點,面試時在候選人中又可以奪目不少,暴擊9999點。機會都是留給有準備的人,只有充足的準備,才可能讓自己可以在候選人中脫穎而出。
以下是所有面試題資料截圖:
面試題解析內容全部免費分享,有需要完整版的小夥伴【點選我】免費獲取哦!