現在做Android開發有前途嗎?附面試題答案

開頭

籠統來說,中年程序員容易被淘汰的原因其實不外乎三點。
1、輸出能力已到頂點。這個人奮斗十來年了,依舊碌碌無為,很明顯這人的天花板就這樣了,說白了,天賦就這樣。
2、適應能力越來越差。年紀大,有家庭,老油條,學習能力下降,磨洋工等等。
3、性價比逐漸降低。到了35歲的年薪基本都不會低的,然而輸出能力到天花板了,隨著年紀的逐漸增大,性價比會越來越低。說來說去就那經典的一句話:可替代性太高。25歲的年輕人便宜且前途可期,35歲已兌現天賦價格還高,這兩選誰都差不多的時候,你說企業會怎么選……任何一個當了老板的人都會選前者。而如何增加自己的不可替代性?

正文如下

  • Activity面試題
  • Fragment面試題
  • Service面試題
  • Broadcast Receiver面試題
  • WebView面試題
  • Binder面試題
  • Handler面試題
  • AsyncTask面試題
  • HandlerThread面試題
  • IntentService面試題
  • 視圖工作機制面試題
  • 事件分發機制面試題
  • ListView面試題
  • Android項目構建面試題(由于篇幅太長,今天就先分享到這里)
  • ANR面試題
  • OOM面試題
  • Bitmap面試題
  • UI卡頓面試題
  • 內存泄漏面試題
  • 內存管理面試題
  • 冷啟動和熱啟動面試題
  • 其他優化面試題
  • 架構模式面試題
  • 插件化面試題
  • 熱更新面試題
  • 進程保活面試題
  • Lint面試題
  • Kotlin面試題

Activity面試題

1、Activity是什么

Activity是四大組件之一,它提供一個界面讓用戶點擊和各種滑動操作,這就是Activity

2、Activity四種狀態

  • runing
  • paused
  • stopped
  • killed

3、Activity生命周期

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroy()
  • onRestart()

4、進程的優先級

  • 空進程
  • 后臺進程
  • 服務進程
  • 可見進程
  • 前臺進程

5、Activity任務棧

  • 先進后出

6、Activity啟動模式

  • standard
  • singletop
  • singletask
  • singleinstance

7、scheme跳轉協議

Android中的scheme是一種頁面內跳轉協議,通過定義自己的scheme協議,可以跳轉到app中的各個頁面

  • 服務器可以定制化告訴app跳轉哪個頁面
  • App可以通過跳轉到另一個App頁面
  • 可以通過H5頁面跳轉頁面

Fragment面試題

1、Fragment為什么被稱為第五大組件

Fragment比Activity更節省內存,其切換模式也更加舒適,使用頻率不低于四大組件,且有自己的生命周期,而且必須依附于Activity

2、Activity創建Fragment的方式

  • 靜態創建
  • 動態創建

3、FragmentPageAdapter和FragmentPageStateAdapter的區別

  • FragmentPageAdapter在每次切換頁面的的時候,是將Fragment進行分離,適合頁面較少的Fragment使用以保存一些內存,對系統內存不會多大影響

  • FragmentPageStateAdapter在每次切換頁面的時候,是將Fragment進行回收,適合頁面較多的Fragment使用,這樣就不會消耗更多的內存

4、Fragment生命周期

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy()
  • onDetach()

5、Fragment的通信

  • Fragment調用Activity中的方法:getActivity
  • Activity調用Fragment中的方法:接口回調
  • Fragment調用Fragment中的方法:FragmentManager.findFragmentById

6、Fragment的replace、add、remove方法

  • replace:替代Fragment的棧頂頁面
  • add:添加Fragment到棧頂頁面
  • remove:移除Fragment棧頂頁面

Service面試題

1、Service是什么

Service是四大組件之一,它可以在后臺執行長時間運行操作而沒有用戶界面的應用組件

2、Service和Thread的區別

  • Service是安卓中系統的組件,它運行在獨立進程的主線程中,不可以執行耗時操作。Thread是程序執行的最小單元,分配CPU的基本單位,可以開啟子線程執行耗時操作

  • Service在不同Activity中可以獲取自身實例,可以方便的對Service進行操作。Thread在不同的Activity中難以獲取自身實例,如果Activity被銷毀,Thread實例就很難再獲取得到

3、Service啟動方式

  • startService
  • bindService

4、Service生命周期

  • startService
    • onCreate()
    • onStartCommand()
    • onDestroy()
  • bindService
    • onCreate()
    • onBind()
    • onUnbind()
    • onDestroy()

Broadcast Receiver面試題

1、Broadcast Receiver是什么

Broadcast是四大組件之一,是一種廣泛運用在應用程序之間傳輸信息的機制,通過發送Intent來傳送我們的數據

2、Broadcast Receiver的使用場景

  • 同一App具有多個進程的不同組件之間的消息通信
  • 不同App之間的組件之間的消息通信

3、Broadcast Receiver的種類

  • 普通廣播
  • 有序廣播
  • 本地廣播
  • Sticky廣播

4、Broadcast Receiver的實現

  • 靜態注冊:注冊后一直運行,盡管Activity、進程、App被殺死還是可以接收到廣播

  • 動態注冊:跟隨Activity的生命周期

5、Broadcast Receiver實現機制

  • 自定義廣播類繼承BroadcastReceiver,復寫onReceiver()
  • 通過Binder機制向AMS進行注冊廣播
  • 廣播發送者通過Binder機制向AMS發送廣播
  • AMS查找符合相應條件的廣播發送到BroadcastReceiver相應的循環隊列中
  • 消息隊列執行拿到廣播,回調BroadcastReceiver的onReceiver()

6、LocalBroadcastManager特點

  • 本地廣播只能在自身App內傳播,不必擔心泄漏隱私數據
  • 本地廣播不允許其他App對你的App發送該廣播,不必擔心安全漏洞被利用
  • 本地廣播比全局廣播更高效
  • 以上三點都是源于其內部是用Handler實現的

WebView面試題

1、WebView安全漏洞

API16之前存在遠程代碼執行安全漏洞,該漏洞源于程序沒有正確限制使用WebView.addJavascriptInterface方法,遠程攻擊者可通過使用Java反射機制利用該漏洞執行任意Java對象的方法

2、WebView銷毀步驟

WebView在其他容器上時(如:LinearLayout),當銷毀Activity時,需要在onDestroy()中先移除容器上的WebView,然后再將WebView.destroy(),這樣就不會導致內存泄漏

3、WebView的jsbridge

客戶端和服務端之間可以通過Javascript來互相調用各自的方法

4、WebViewClient的onPageFinished

WebViewClient的onPageFinished在每次完成頁面的時候調用,但是遇到未加載完成的頁面跳轉其他頁面時,就會一直調用,使用WebChromeClient.onProgressChanged可以替代

5、WebView后臺耗電

在WebView加載頁面的時候,會自動開啟線程去加載,如果不很好的關閉這些線程,就會導致電量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)結束當前正在運行中的java虛擬機

6、WebView硬件加速

Android3.0引入硬件加速,默認會開啟,WebView在硬件加速的情況下滑動更加平滑,性能更加好,但是會出現白塊或者頁面閃爍的副作用,建議WebView暫時關閉硬件加速

7、WebView內存泄漏

由于WebView是依附于Activity的,Activity的生命周期和WebView啟動的線程的生命周期是不一致的,這會導致WebView一直持有對這個Activity的引用而無法釋放,解決方案如下

  • 獨立進程,簡單暴力,不過可能涉及到進程間通信(推薦)

  • 動態添加WebView,對傳入WebView中使用的Context使用弱引用

Binder面試題

1、Linux內核的基本知識

  • 進程隔離/虛擬地址空間:進程間是不可以共享數據的,相當于被隔離,每個進程被分配到不同的虛擬地址中

  • 系統調用:Linux內核對應用有訪問權限,用戶只能在應用層通過系統調用,調用內核的某些程序

  • binder驅動:它負責各個用戶的進程,通過binder通信內核來進行交互的模塊

2、為什么使用Binder

  • 性能上,相比傳統的Socket更加高效
  • 安全性高,支持協議雙方互相校驗

3、Binder通信模型

  • Service服務端通過Binder驅動在ServiceManager的查找表中注冊Object對象的add方法

  • Client客戶端通過Binder驅動在ServiceManager的查找表中找到Object對象的add方法,并返回proxy的add方法,add方法是個空實現,proxy也不是真正的Object對象,是通過Binder驅動封裝好的代理類的add方法

  • 當Client客戶端調用add方法時,Client客戶端通過Binder驅動將proxy的add方法,請求ServiceManager來找到Service服務端真正對象的add方法,進行調用

4、AIDL

  • 客戶端通過aidl文件的Stub.asInterface()方法,拿到Proxy代理類

  • 通過調用Proxy代理類的方法,將參數進行封包后,調用底層的transact()方法

  • transact()方法會回調onTransact()方法,進行參數的解封

  • 在onTransact()方法中調用服務端對應的方法,并將結果返回

Handler面試題

1、Handler是什么

Handler通過發送和處理Message和Runnable對象來關聯相對應線程的MessageQueue

2、Handler使用方法

  • post(runnable)
  • sendMessage(message)

3、Handler工作原理

4、Handler引起的內存泄漏

原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放

解決:

  • Handler內部持有外部Activity的弱引用
  • Handler改為靜態內部類
  • Handler.removeCallback()

AsyncTask面試題

1、AsyncTask是什么

它本質上就是一個封裝了線程池和Handler的異步框架

2、AsyncTask使用方法

三個參數

  • Params:表示后臺任務執行時的參數類型,該參數會傳給AysncTask的doInBackground()方法

  • Progress:表示后臺任務的執行進度的參數類型,該參數會作為onProgressUpdate()方法的參數

  • Result:表示后臺任務的返回結果的參數類型,該參數會作為onPostExecute()方法的參數

五個方法

  • onPreExecute():異步任務開啟之前回調,在主線程中執行

  • doInBackground():執行異步任務,在線程池中執行

  • onProgressUpdate():當doInBackground中調用publishProgress時回調,在主線程中執行

  • onPostExecute():在異步任務執行之后回調,在主線程中執行

  • onCancelled():在異步任務被取消時回調

3、AsyncTask工作原理

4、AsyncTask引起的內存泄漏

原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放

解決:

  • AsyncTask內部持有外部Activity的弱引用
  • AsyncTask改為靜態內部類
  • AsyncTask.cancel()

5、AsyncTask生命周期

在Activity銷毀之前,取消AsyncTask的運行,以此來保證程序的穩定

6、AsyncTask結果丟失

由于屏幕旋轉、Activity在內存緊張時被回收等情況下,Activity會被重新創建,此時,舊的AsyncTask持有舊的Activity引用,這個時候會導致AsyncTask的onPostExecute()對UI更新無效

7、AsyncTask并行or串行

  • AsyncTask在Android 2.3之前默認采用并行執行任務,AsyncTask在Android 2.3之后默認采用串行執行任務

  • 如果需要在Android 2.3之后采用并行執行任務,可以調用AsyncTask的executeOnExecutor()

HandlerThread面試題

1、HandlerThread產生背景

當系統有多個耗時任務需要執行時,每個任務都會開啟一個新線程去執行耗時任務,這樣會導致系統多次創建和銷毀線程,從而影響性能。為了解決這一問題,Google提供了HandlerThread,HandlerThread是在線程中創建一個Looper循環器,讓Looper輪詢消息隊列,當有耗時任務進入隊列時,則不需要開啟新線程,在原有的線程中執行耗時任務即可,否則線程阻塞

2、HanlderThread的特點、

  • HandlerThread本質上是一個線程,繼承自Thread
  • HandlerThread有自己的Looper對象,可以進行Looper循環,可以創建Handler
  • HandlerThread可以在Handler的handlerMessage中執行異步方法
  • HandlerThread優點是異步不會堵塞,減少對性能的消耗
  • HandlerThread缺點是不能同時繼續進行多任務處理,需要等待進行處理,處理效率較低
  • HandlerThread與線程池不同,HandlerThread是一個串行隊列,背后只有一個線程。

IntentService面試題

1、IntentService是什么

IntentService是繼承自Service并處理異步請求的一個類,其內部采用HandlerThread和Handler實現的,在IntentService內有一個工作線程來處理耗時操作,其優先級比普通Service高。當任務完成后,IntentService會自動停止,而不需要手動調用stopSelf()。另外,可以多次啟動IntentService,每個耗時操作都會以工作隊列的方式在IntentService中onHandlerIntent()回調方法中執行,并且每次只會執行一個工作線程

2、IntentService使用方法

  • 創建Service繼承自IntentService
  • 覆寫構造方法和onHandlerIntent()方法
  • 在onHandlerIntent()中執行耗時操作

題外話

不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準備,當然除了這個還需要在平時把自己的基礎打扎實,這樣不論面試官怎么樣一個知識點里往死里鑿,你也能應付如流啊~

這里我為大家準備了一些我工作以來以及參與過的大大小小的面試收集總結出來的一套進階學習的視頻及面試專題資料包,點擊這里免費分享給大家,主要還是希望大家在如今大環境不好的情況下面試能夠順利一點,希望可以幫助到大家~

最后如果馬化騰把騰訊給你一天,你會來做什么?歡迎評論區討論。

tent()中執行耗時操作

題外話

不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準備,當然除了這個還需要在平時把自己的基礎打扎實,這樣不論面試官怎么樣一個知識點里往死里鑿,你也能應付如流啊~

這里我為大家準備了一些我工作以來以及參與過的大大小小的面試收集總結出來的一套進階學習的視頻及面試專題資料包,點擊這里免費分享給大家,主要還是希望大家在如今大環境不好的情況下面試能夠順利一點,希望可以幫助到大家~

[外鏈圖片轉存中…(img-bKz1jA5d-1621870995950)]

最后如果馬化騰把騰訊給你一天,你會來做什么?歡迎評論區討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386268.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++開發WPF,Step by Step

C開發WPF,Step by Step 示例代碼 使用C來開發WPF,主要是如何在MFC(Win32)的窗口中Host WPF的Page。下面我就做個詳細的介紹. 一、創建工程, 由于MFC的Wizard會生成很多用不到的代碼,所以我準備從一個空的工程開始創建一…

C#學習之unsafe

為了保持類型安 全,默認情況下,C# 不支持指針算法。 不過,通過使用 unsafe 關鍵字,可以定義可使用指針的不安全上下文。 unsafe 在C# 程 序中的使用場合: 1)實時應用,采用指針來提高性能&…

百度、華為、京東、B站最新面試題匯集,實戰篇

前言 回顧一下自己這段時間的經歷,因公司突然通知裁員,我匆匆忙忙地出去面了幾家,但最終都沒有拿到offer,我感覺今年的寒冬有點冷。公司開始第二波裁員,我決定主動拿賠償走人。后續的面試過程我做了一些準備&#xff…

php 常用正則運算

$regx "/^[0-9]*$/"; var_dump(preg_match($regx, $phone));常用的正則運算: ?驗證數字:^[0-9]*$ ?驗證n位的數字:^\d{n}$ ?驗證至少n位數字:^\d{n,}$ ?驗證m-n位的數字:^\d{m,n}$ ?驗證零和非零開頭的…

百度、阿里、滴滴、新浪的面試心經總結,一線互聯網公司面經總結

開頭 技術的發展產生了程序員這個職位,從這些年各大互聯網公司曝光的一些員工收入水平來看,程序員的工資還是相對比較高的,可是我們在互聯網上還聽到了另外一種聲音,很多程序員想轉行,特別是大齡程序員,這…

go build編譯不同環境

#usage: go build [-o output] [-i] [build flags] [packages] go build的使用比較簡潔,所有的參數都可以忽略,直到只有go build,這個時候意味著使用當前目錄進行編譯,下面的幾條命令是等價的: go buildgo build .go b…

百度、阿里、滴滴、新浪的面試心經總結,源碼+原理+手寫框架

前言 作為一個程序員,如果你在新知識、新技術面前仍一無所知,依然吃著十多年前的老本,那你在知識技術上肯定落伍,如果又未能進入管理層面,那你肯定就會被長江的后浪拍在沙灘上了。 而不少與時俱進、善于學習的程序員…

LINQ to SQL

Moved to http://blog.tangcs.com/2008/10/06/linq-to-sql/轉載于:https://www.cnblogs.com/WarrenTang/archive/2008/10/06/1304727.html

目前最全的《Android面試題及解析》!面試真題解析

背景 慣例,先簡單陳述一下自己的,91年生人,164年三本畢業后在深圳工作,末流小公司,工資13k,無房,無車,無戶口。 那時候感覺生活也還行,父母有退休金,我基本…

有效的形成傳感器(執行器)的控制方式

其實為了增加閉環的話需要再增加一個傳感器,比如編碼器。 轉載于:https://www.cnblogs.com/yjphhw/p/11285145.html

直接上干貨!技術水平真的很重要!復習指南

開頭 25歲那年,我從京東離職,入職百度。 在百度認識了當時的架構師久哥(T9級別),因為他的一番話,徹底改變了我的職業生涯,短短三年的時間,我從一枚普通程序員成長為別人眼中的技術…

實戰HMM-Viterbi角色標注地名識別

http://www.hankcs.com/nlp/ner/place-names-to-identify-actual-hmm-viterbi-role-labeling.html 命名實體識別(Named Entity Recognition)也是自然語言處理中的一個難關,特別是中文這樣沒有大小寫等固定形態的語言。上次介紹過《實戰HMM-Vi…

看完99%的人都學會了!9次Android面試經驗總結,我先收藏為敬

我們都是被圈養的人? 我的朋友程序員K,說他在電力行業的一家軟件公司做了八年Android開發,用到的各種技術,數據庫,網絡請求,事件傳遞,響應框架都很熟悉,甚至JNI/NDK/Framework&…

從外包公司到今日頭條offer,含BATJM大廠

前言 最近有不少人問我這樣一個問題:「我剛接觸編程,準備學習下Android開發,但是擔心現在市場飽和了,Android開發的前景怎么樣?」 想著可能有很多人都有這樣的擔心,于是就趕緊寫篇文章,來跟你…

PTA -- A1046 Shortest Distance

題意及思路 題意:有N個節點(1至N),求給定的st號到en號的距離最小值,這些點構成一個環,即1->2 ... ->N ->1。 思路:第一步,預處理操作,以dis[ i ] 表示&#xff…

從外包公司到今日頭條offer,聰明人已經收藏了!

開頭 讓我們一起來看看,字節跳動的第三面,面試官都問了什么?(第一二面的題目及答案已整理,需要的可以在文末領取) 從七月中旬開始,我前前后后差不多一共投遞了八十份簡歷,到目前為…

程序從高版本降到2.0,數據集報錯 TypedTableBase

錯誤 命名空間“System.Data”中不存在類型或命名空間名稱“TypedTableBase”(是缺少程序集引用嗎?) 解決&#xff1a; 該錯誤出現在自動生成的XXX.Designer.cs里。 .NET 3.5 : public partial class T_OPERATOR_WLDataTable : global::System.Data.TypedTableBase<T_OPER…

從外包月薪5K到阿里月薪15K,原理+實戰+視頻+源碼

前言 轉眼間&#xff0c;2020 年已過去一大半了&#xff0c;2020 年很難&#xff0c;各企業裁員的消息蠻多的&#xff0c;降職&#xff0c;不發年終獎等等。2020 年確實是艱難的一年。然而生活總是要繼續&#xff0c;時間不給你喪的機會&#xff01;如果我們能堅持下來&#x…

C#編寫的發送手機短信的類庫 C#開發短信的方法和簡介 短信編程實例

發送手機短信源代碼(針對國內短信編碼) / ///文 件&#xff1a;PDUdecoding.cs ///概 要&#xff1a;針對國內短信編碼&#xff08;USC2&#xff09; ///組成結構&#xff1a;包含四個函數&#xff1a; /// smsDecodedCenterNumber(string srvCenterNumber) …

從新手到Flutter架構師,一篇就夠!吐血整理

在開始回答前&#xff0c;先簡單概括性地說說Linux現有的所有進程間IPC方式&#xff1a; 1. **管道&#xff1a;**在創建時分配一個page大小的內存&#xff0c;緩存區大小比較有限&#xff1b; 2. 消息隊列&#xff1a;信息復制兩次&#xff0c;額外的CPU消耗&#xff1b;不合…