我經歷過的Android工程師之Android面試大綱
9 人贊了文章
文章目錄如下:
- Activity面試題
- Fragment面試題
- Service面試題
- Broadcast Receiver面試題
- WebView面試題
- Binder面試題
- Handler面試題
- AsyncTask面試題
- HandlerThread面試題
- IntentService面試題
- 視圖工作機制面試題
- 事件分發機制面試題
- ListView面試題
- Android項目構建面試題
- ANR面試題
- OOM面試題
- Bitmap面試題
- UI卡頓面試題
- 內存泄漏面試題
- 內存管理面試題
- 冷啟動和熱啟動面試題
- 其他優化面試題
- 架構模式面試題
- 插件化面試題
- 熱更新面試題
- 進程保活面試題
- Lint面試題
- Kotlin面試題
1Activity面試題
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頁面跳轉頁面
2Fragment面試題
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棧頂頁面
3Service面試題
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()
- onCreate()
- onBind()
- onUnbind()
- onDestroy()
4Broadcast 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實現的
5WebView面試題
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使用弱引用
6Binder面試題
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()方法中調用服務端對應的方法,並將結果返回
7Handler面試題
1、Handler是什麼
Handler通過發送和處理Message和Runnable對象來關聯相對應線程的MessageQueue
2、Handler使用方法
- post(runnable)
- sendMessage(message)
3、Handler工作原理
- Android進階——Android消息機制之Looper、Handler、MessageQueen
- http://blog.csdn.net/qq_30379689/article/details/53394061
4、Handler引起的內存泄漏
- 原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放
- 解決:
- Handler內部持有外部Activity的弱引用
- Handler改為靜態內部類
- Handler.removeCallback()
8AsyncTask面試題
1、AsyncTask是什麼
它本質上就是一個封裝了線程池和Handler的非同步框架
2、AsyncTask使用方法
- 三個參數
- Params:表示後台任務執行時的參數類型,該參數會傳給AysncTask的doInBackground()方法
- Progress:表示後台任務的執行進度的參數類型,該參數會作為onProgressUpdate()方法的參數
- Result:表示後台任務的返回結果的參數類型,該參數會作為onPostExecute()方法的參數
- 五個方法
- onPreExecute():非同步任務開啟之前回調,在主線程中執行
- doInBackground():執行非同步任務,在線程池中執行
- onProgressUpdate():當doInBackground中調用publishProgress時回調,在主線程中執行
- onPostExecute():在非同步任務執行之後回調,在主線程中執行
- onCancelled():在非同步任務被取消時回調
3、AsyncTask工作原理
- Android進階——多線程系列之非同步任務AsyncTask的使用與源碼分析
- http://blog.csdn.net/qq_30379689/article/details/53203556
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()
9HandlerThread面試題
1、HandlerThread產生背景
當系統有多個耗時任務需要執行時,每個任務都會開啟一個新線程去執行耗時任務,這樣會導致系統多次創建和銷毀線程,從而影響性能。為了解決這一問題,Google提供了HandlerThread,HandlerThread是在線程中創建一個Looper循環器,讓Looper輪詢消息隊列,當有耗時任務進入隊列時,則不需要開啟新線程,在原有的線程中執行耗時任務即可,否則線程阻塞
2、HanlderThread的特點、
- HandlerThread本質上是一個線程,繼承自Thread
- HandlerThread有自己的Looper對象,可以進行Looper循環,可以創建Handler
- HandlerThread可以在Handler的handlerMessage中執行非同步方法
- HandlerThread優點是非同步不會堵塞,減少對性能的消耗
- HandlerThread缺點是不能同時繼續進行多任務處理,需要等待進行處理,處理效率較低
- HandlerThread與線程池不同,HandlerThread是一個串列隊列,背後只有一個線程。
10 IntentService面試題
1、IntentService是什麼
IntentService是繼承自Service並處理非同步請求的一個類,其內部採用HandlerThread和Handler實現的,在IntentService內有一個工作線程來處理耗時操作,其優先順序比普通Service高。當任務完成後,IntentService會自動停止,而不需要手動調用stopSelf()。另外,可以多次啟動IntentService,每個耗時操作都會以工作隊列的方式在IntentService中onHandlerIntent()回調方法中執行,並且每次只會執行一個工作線程
2、IntentService使用方法
- 創建Service繼承自IntentService
- 覆寫構造方法和onHandlerIntent()方法
- 在onHandlerIntent()中執行耗時操作
11視圖工作機制面試題
- Android進階——Android視圖工作機制之measure、layout、draw
- http://blog.csdn.net/qq_30379689/article/details/54588736
- Android事件分發機制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
- http://blog.csdn.net/qq_30379689/article/details/53967177
12ListView面試題
1、ListView是什麼
ListView是能將一個數據集合以動態滾動的方式展示到用戶界面上的View
2、ListView的RecycleBin機制
3、ListView的優化
- 重用convertView
- 使用ViewHolder
- 圖片三級緩存
- 監聽滑動事件
- 少用透明View
- 開啟硬體加速
13Android項目構建面試題
1、android構建流程
2、jenkins持續集成構建
- 這裡可參考蒲公英文檔
- http://www.pgyer.com/doc/view/jenkins
3、Git常用命令
- git init:倉庫的初始化
- git status:查看當前倉庫的狀態
- git diff:查看倉庫與上次修改的內容
- git add:將文件放進暫存區
- git commit:提交代碼
- git clone:克隆代碼
- git bransh:查看當前分支
- git checkout:切換當前分支
4、git工作流
- fork/clone(主流)
- fork:將別人的倉庫代碼fork到自己的倉庫上
- clone:克隆下自己倉庫的代碼
- update、commit:修改代碼並提交到自己的倉庫
- push:提交到自己的倉庫
- pull request:請求添加到別人的倉庫
- clone
5、proguard是什麼
ProGuard工具是用於壓縮、優化和混淆我們的代碼,其主作用是移除或混淆代碼中無用類、欄位、方法和屬性
6、proguard技術功能
- 壓縮
- 優化
- 混淆
- 預檢測
7、proguard工作原理
將無用的欄位或方法存入到EntryPoint中,將非EntryPoint的欄位和方法進行替換
8、為什麼要混淆
由於Java是一門跨平台的解釋性語言,其源代碼被編譯成class位元組碼來適應其他平台,而class文件包含了Java源代碼信息,很容易被反編譯
14ANR面試題
1、什麼是ANR
Application Not Responding,頁面無響應的對話框
2、發生ANR的條件
應用程序的響應性是由ActivityManager和WindowManager系統服務監視的,當ANR發生條件滿足時,就會彈出ANR的對話框
- Activity超過5秒無響應
- BroadcastReceiver超過10秒無響應
- Service超過20秒無響應
3、造成ANR的主要原因
主線程被IO操作阻塞
- Activity的所有生命周期回調都是執行在主線程的
- Service默認執行在主線程中
- BoardcastReceiver的回調onReceive()執行在主線程中
- AsyncTask的回調除了doInBackground,其他都是在主線程中
- 沒有使用子線程Looper的Handler的handlerMessage,post(Runnable)都是執行在主線程中
4、如何解決ANR
- 使用AsyncTask處理耗時IO操作
- 使用Thread或HandlerThread提供優先順序
- 使用Handler處理工作線程的耗時操作
- Activity的onCreate和onResume回調盡量避免耗時操作
15OOM面試題
1、什麼是OOM
OOM指Out of memory(內存溢出),當前佔用內存加上我們申請的內存資源超過了Dalvik虛擬機的最大內存限制就會拋出Out of memory異常
2、OOM相關概念
- 內存溢出:指程序在申請內存時,沒有足夠的空間供其使用
- 內存泄漏:指程序分配出去的內存不再使用,無法進行回收
- 內存抖動:指程序短時間內大量創建對象,然後回收的現象
3、解決OOM
Bitmap相關
- 圖片壓縮
- 載入縮略圖
- 在滾動時不載入圖片
- 回收Bitmap
- 使用inBitmap屬性
- 捕獲異常
其他相關
- listview重用convertView、使用lru
- 避免onDraw方法執行對象的創建
- 謹慎使用多進程
16Bitmap面試題
1、recycle
- 在安卓3.0以前Bitmap是存放在堆中的,我們只要回收堆內存即可
- 在安卓3.0以後Bitmap是存放在內存中的,我們需要回收native層和Java層的內存
- 官方建議我們3.0以後使用recycle方法進行回收,該方法也可以不主動調用,因為垃圾回收器會自動收集不可用的Bitmap對象進行回收
- recycle方法會判斷Bitmap在不可用的情況下,將發送指令到垃圾回收器,讓其回收native層和Java層的內存,則Bitmap進入dead狀態
- recycle方法是不可逆的,如果再次調用getPixels()等方法,則獲取不到想要的結果
2、LruCache原理
LruCache是個泛型類,內部採用LinkedHashMap來實現緩存機制,它提供get方法和put方法來獲取緩存和添加緩存,其最重要的方法trimToSize是用來移除最少使用的緩存和使用最久的緩存,並添加最新的緩存到隊列中
3、計算inSampleSize
4、縮略圖
5、保存Bitmap
6、保存到SD卡
7、三級緩存
- 網路緩存
- 本地緩存
- 內存緩存
17UI卡頓面試題
1、UI卡頓原理
View的繪製幀數保持60fps是最佳,這要求每幀的繪製時間不超過16ms(1000/60),如果安卓不能在16ms內完成界面的渲染,那麼就會出現卡頓現象
2、UI卡頓的原因分析
- 在UI線程中做輕微的耗時操作,導致UI線程卡頓
- 布局Layout過於複雜,無法在16ms內完成渲染
- 同一時間動畫執行的次數過多,導致CPU和GPU負載過重
- overDraw,導致像素在同一幀的時間內被繪製多次,使CPU和GPU負載過重
- View頻繁的觸發measure、layout,導致measure、layout累計耗時過多和整個View頻繁的重新渲染
- 頻繁的觸發GC操作導致線程暫停,會使得安卓系統在16ms內無法完成繪製
- 冗餘資源及邏輯等導致載入和執行緩慢
- ANR
3、UI卡頓的優化
- 布局優化
- 使用include、ViewStub、merge
- 不要出現過於嵌套和冗餘的布局
- 使用自定義View取代複雜的View
- ListView優化
- 復用convertView
- 滑動不載入
- 背景和圖片優化
- 縮略圖
- 圖片壓縮
- 避免ANR
- 不要在UI線程中做耗時操作
18內存泄漏面試題
1、Java內存泄漏引起的主要原因
長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄漏
2、Java內存分配策略
- 靜態存儲區:又稱方法區,主要存儲全局變數和靜態變數,在整個程序運行期間都存在
- 棧區:方法體的局部變數會在棧區創建空間,並在方法執行結束後會自動釋放變數的空間和內存
- 堆區:保存動態產生的數據,如:new出來的對象和數組,在不使用的時候由Java回收器自動回收
3、Android解決內存泄漏的例子
- 單例造成的內存泄漏:在單例中,使用context.getApplicationContext()作為單例的context
- 匿名內部類造成的內存泄漏:由於非靜態內部類持有匿名外部類的引用,必須將內部類設置為static
- Handler造成的內存泄漏:使用static的Handler內部類,同時在實現內部類中持有Context的弱引用
- 避免使用static變數:由於static變數會跟Activity生命周期一致,當Activity退出後台被後台回收時,static變數是不安全,所以也要管理好static變數的生命周期
- 資源未關閉造成的內存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完後要關閉
- AsyncTask造成的內存泄漏:由於非靜態內部類持有匿名內部類的引用而造成內存泄漏,可以通過AsyncTask內部持有外部Activity的弱引用同時改為靜態內部類或在onDestroy()中執行AsyncTask.cancel()進行修復
19內存管理面試題
1、Android內存管理機制
- 分配機制
- 管理機制
2、內存管理機制的特點
- 更少的佔用內存
- 在合適的時候,合理的釋放系統資源
- 在系統內存緊張的時候,能釋放掉大部分不重要的資源
- 能合理的在特殊生命周期中,保存或還原重要數據
3、內存優化方法
- Service完成任務後應停止它,或用IntentService(因為可以自動停止服務)代替Service
- 在UI不可見的時候,釋放其UI資源
- 在系統內存緊張的時候,儘可能多的釋放非重要資源
- 避免濫用Bitmap導致內存浪費
- 避免使用依賴注入框架
- 使用針對內存優化過的數據容器
- 使用ZIP對齊的APK
- 使用多進程
20冷啟動和熱啟動面試題
1、什麼是冷啟動和熱啟動
- 冷啟動:在啟動應用前,系統中沒有該應用的任何進程信息
- 熱啟動:在啟動應用時,在已有的進程上啟動應用(用戶使用返回鍵退出應用,然後馬上又重新啟動應用)
2、冷啟動和熱啟動的區別
- 冷啟動:創建Application後再創建和初始化MainActivity
- 熱啟動:創建和初始化MainActivity即可
3、冷啟動時間的計算
這個時間值從應用啟動(創建進程)開始計算,到完成視圖的第一次繪製為止
4、冷啟動流程
- Zygote進程中fork創建出一個新的進程
- 創建和初始化Application類、創建MainActivity
- inflate布局、當onCreate/onStart/onResume方法都走完
- contentView的measure/layout/draw顯示在界面上
總結:Application構造方法->attachBaseContext()->onCreate()->Activity構造方法->onCreate()->配置主題中背景等屬性->onStart()->onResume()->測量布局繪製顯示在界面上
5、冷啟動優化
- 減少第一個界面onCreate()方法的工作量
- 不要讓Application參與業務的操作
- 不要在Application進行耗時操作
- 不要以靜態變數的方式在Application中保存數據
- 減少布局的複雜性和深度
- 不要在mainThread中載入資源
- 通過懶載入方式初始化第三方SDK
21其他優化面試題
1、Android不用靜態變數存儲數據
- 靜態變數等數據由於進程已經被殺死而被初始化
- 使用其他數據傳輸方式:文件/sp/contentProvider
2、SharePreference安全問題
- 不能跨進程同步
- 文件不宜過大
3、內存對象序列化
- Serializeble:是java的序列化方式,Serializeble在序列化的時候會產生大量的臨時對象,從而引起頻繁的GC
- Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要將數據存儲在硬碟上的情況
4、避免在UI線程中做繁重的操作
22架構模式面試題
- Android基礎——框架模式MVC在安卓中的實踐
- http://blog.csdn.net/qq_30379689/article/details/52909656
- Android基礎——框架模式MVP在安卓中的實踐
- http://blog.csdn.net/qq_30379689/article/details/52910567
- Android基礎——框架模式MVVM之DataBinding的實踐
- http://blog.csdn.net/qq_30379689/article/details/53037430
23插件化面試題
1、插件化解決的問題
- 動態載入APK(反射、類載入器)
- 資源載入(反射、AssetManager、獨立資源、分段資源)
- 代碼載入(反射獲取生命周期)
2、類載入器(Java中位元組碼添加到虛擬機中)
- DexClassLoader:能夠載入未安裝的jar/apk/dex,主要用於動態載入和代碼熱更新
- PathClassLoader:只能載入系統中已經安裝過的apk
24熱更新面試題
1、熱更新主要流程
- 線上檢查到Crash
- 拉出Bugfix分支修復Crash問題
- jenkins構建和補丁生成
- app通過推送或主動拉取補丁文件
- 將Bugfix代碼合到master上
2、熱更新主流框架
- Dexposed
- AndFix
- Nuwa
- Tinker
3、熱更新的原理
- 在ClassLoader創建一個dexElements數組
- 將修復好的dex文件存放在dexElements數組的最前面
- ClassLoader會遍歷dexElements數組,找到最前面的dex文件優先載入
25進程保活面試題
1、進程的優先順序
- 空進程
- 後台進程
- 服務進程
- 可見進程
- 前台進程
2、Android進程回收策略
- Low memory Killer(定時執行):通過一些比較複雜的評分機制,對進程進行打分,然後將分數高的進程判定為bad進程,殺死並釋放內存
- OOM_ODJ:判別進程的優先順序
3、Android保活方案
- 利用系統廣播拉活
- 利用系統Service機制拉活
- 利用Native進程拉活
- 利用JobScheduler機制拉活
- 利用賬號同步機制拉活
26Lint面試題
1、什麼是Android Lint
Android Lint是一個靜態代碼分析工具,它能夠對你的Android項目中潛在的Bug、可優化的代碼、安全性、性能、可用性、可訪問性、國際化等進行檢查
2、Lint工作流程
3、配置Lint
- 創建Lint.xml到根目錄下,自定義Lint安全等級等
- 在Java文件中可以使用@suppressLint(「NewApi」)來忽視Lint的報錯
- 在xml文件中可以使用tool:ignore(「UnusedResources」)來忽視Lint的報錯
- 自定義Lint檢查,可以創建類,繼承Detector和實現JavaPsiScanner
27Kotlin面試題
1、什麼是Kotlin
- Kotlin是一種基於JVM的編程語言
- 對Java的一種拓展,比Java更簡潔
- Kotlin支持函數式編程
- Kotlin類和Java類可以相互調用
2、Kotlin環境搭建
- 直接在Plugin中下載Kotlin插件即可
- 系統會自動配置到Kotlin環境
推薦閱讀:
※職場菜鳥請牢記:做好這六件事才能被重用,被人當丫鬟使沒前途
※熟知各類西裝,方能縱橫職場
※不要只做我告訴你的事(職場必讀)
※職場中如何快速獲得升職?
※①鎖定你的職場黃金期