2017 Android 面試題 [ 基礎與細節 ]

感謝@chuyao拋出的這些問題,平時業務代碼寫多了,不少基礎的東西變得含糊不清了,此次裸辭出來找工做確實沒有以前順利,順便求上海Android開發的坑。
我本身整理了些答案,不對或者不妥的地方請你們指出,謝謝。css

1. Activity創建在哪些窗口組件之上?順帶涉及View的事件傳遞問題。

沒讀懂問題,=。=不知道是否是問Activity的UI結構,若是是能夠參考這篇文章
html

對於View的事件傳遞,則能夠從 Activity --> ViewGroup --> ...... --> Activity 的** U型 **消費結構去說。java

2. 什麼狀況下,Activity的onNewInstent()方法會執行?Activity的啓動模式相關。

當此Activity的實例已經存在,而且此時的啓動模式爲SingleTaskSingleInstance,另外當這個實例位於棧頂且啓動模式爲SingleTop時也會觸發onNewInstent()android

3. Activity A使用startForResult啓動Activity B,B什麼都不作並返回A,A中的onActivityResult回調是否會執行?

startActivity()方法,最終都是調用startActivityForResult()方法。默認的requestCode = -1 resultCode = RESULT_CANCELED = 0,當你的requestCode != -1時,onActivityResult()必定會被調用。git

4. Fragment可否不依賴於Activity存在?簡析一下Fragment的棧管理。

Fragment不能獨立存在,它必須嵌入到activity中,並且Fragment的生命週期直接受所在的activity的影響。github

// Create new fragment and transaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit();

transaction只是記錄了從一個狀態到另外一個狀態的變化過程,即好比從FragmentA替換到FragmentB的過程,當經過函數transaction.addToBackStack(null)將這個事務添加到回退棧,則會記錄這個事務的狀態變化過程,如從FragmentA —>FragmentB,當用戶點擊手機回退鍵時,由於transaction的狀態變化過程被保存,則能夠將事務的狀態變化過程還原,即將FragmentB —> FragmentA.sql

添加到回退棧的函數:transaction.addToBackStack(null);編程

參考文章: http://blog.csdn.net/u011026329/article/details/47903177segmentfault

5. 可否將一個Activity放到系統的最近任務列表裏,獨立於宿主app任務卡以外?

我印象中是能夠作到了,平時沒用到,知道的同窗請@我,謝謝!

6. 對於同一個Service,在被start啓動以後還能不能被bind?

服務器

服務基本上分爲兩種形式:
啓動
當應用組件(如 Activity)經過調用 startService() 啓動服務時,服務即處於「啓動」狀態。一旦啓動,服務便可在後臺無限期運行,即便啓動服務的組件已被銷燬也不受影響。 已啓動的服務一般是執行單一操做,並且不會將結果返回給調用方。例如,它可能經過網絡下載或上傳文件。 操做完成後,服務會自行中止運行。
綁定
當應用組件經過調用 bindService() 綁定到服務時,服務即處於「綁定」狀態。綁定服務提供了一個客戶端-服務器接口,容許組件與服務進行交互、發送請求、獲取結果,甚至是利用進程間通訊 (IPC) 跨進程執行這些操做。 僅當與另外一個應用組件綁定時,綁定服務纔會運行。 多個組件能夠同時綁定到該服務,但所有取消綁定後,該服務即會被銷燬。

雖然本文檔是分開歸納討論這兩種服務,可是您的服務能夠同時以這兩種方式運行,也就是說,它既能夠是啓動服務(以無限期運行),也容許綁定。問題只是在於您是否實現了一組回調方法:onStartCommand()(容許組件啓動服務)和 onBind()(容許綁定服務)。
來自官方文檔

7. Service有哪些派生類?這些派生類的使用場景是什麼?

這個問題不知道問的具體是什麼,若是是要 IntentService那麼能夠參考官方文檔的解釋與使用說明:
擴展 IntentService 類
因爲大多數啓動服務都沒必要同時處理多個請求(實際上,這種多線程狀況可能很危險),所以使用 IntentService 類實現服務也許是最好的選擇。

IntentService 執行如下操做:

建立默認的工做線程,用於在應用的主線程外執行傳遞給 onStartCommand() 的全部 Intent。 建立工做隊列,用於將 Intent 逐一傳遞給 onHandleIntent() 實現,這樣您就永遠沒必要擔憂多線程問題。 在處理完全部啓動請求後中止服務,所以您永遠沒必要調用 stopSelf()。 提供 onBind() 的默認實現(返回 null)。 提供 onStartCommand() 的默認實現,可將 Intent 依次發送到工做隊列和 onHandleIntent() 實現。 綜上所述,您只需實現 onHandleIntent() 來完成客戶端提供的工做便可。(不過,您還須要爲服務提供小型構造函數。)

如下是 IntentService 的實現示例:

public class HelloIntentService extends IntentService { /** * A constructor is required, and must call the super IntentService(String) * constructor with a name for the worker thread. */ public HelloIntentService() { super("HelloIntentService"); } /** * The IntentService calls this method from the default worker thread with * the intent that started the service. When this method returns, IntentService * stops the service, as appropriate. */ @Override protected void onHandleIntent(Intent intent) { // Normally we would do some work here, like download a file. // For our sample, we just sleep for 5 seconds. try { Thread.sleep(5000); } catch (InterruptedException e) { // Restore interrupt status. Thread.currentThread().interrupt(); } } }

您只須要一個構造函數和一個 onHandleIntent() 實現便可。

若是您決定還重寫其餘回調方法(如 onCreate()、onStartCommand() 或 onDestroy()),請確保調用超類實現,以便 IntentService 可以妥善處理工做線程的生命週期。

例如,onStartCommand() 必須返回默認實現(即,如何將 Intent 傳遞給 onHandleIntent()):

@Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); return super.onStartCommand(intent,flags,startId); }

除 onHandleIntent() 以外,您無需從中調用超類的惟一方法就是 onBind()(僅當服務容許綁定時,才須要實現該方法)。

8. Service與其它組件之間的通訊實現方式有哪些?

  1. binder
  2. broadcast
  3. 其餘參見線程和進程的通訊方式

9. View的post(Runnable r)方法裏,r會帶來一個新的線程嗎?多線程相關。

不會,最終仍是handler發送消息,執行在UI線程。
以下是源碼和註釋:

/** * <p>Causes the Runnable to be added to the message queue. * The runnable will be run on the user interface thread.</p> * * @param action The Runnable that will be executed. * * @return Returns true if the Runnable was successfully placed in to the * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. * * @see #postDelayed * @see #removeCallbacks */ public boolean post(Runnable action) { final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { return attachInfo.mHandler.post(action); } // Postpone the runnable until we know on which thread it needs to run. // Assume that the runnable will be successfully placed after attach. getRunQueue().post(action); return true; }

10. 在非UI線程中使用Handler須要注意哪些問題?

new Thread(){ public void run(){ Looper.prepare();//給當前線程初始化Looper Toast.makeText(getApplicationContext(),"更新UI",0).show();//Toast初始化的時候會new Handler();無參構造默認獲取當前線程的Looper,若是沒有prepare過,則拋出題主描述的異常。上一句代碼初始化過了,就不會出錯。 Looper.loop();//這句執行,Toast排隊show所依賴的Handler發出的消息就有人處理了,Toast就能夠吐出來了。可是,這個Thread也阻塞這裏了,由於loop()是個for (;;) ... } }.start();

參考:
https://www.zhihu.com/question/51099935
https://www.zhihu.com/question/34652589

11. 自定義View時有哪些重要的方法,它們的做用及執行順序是怎樣的?

按照順序:onMeasure() --> onLayout() --> onDraw().其餘的本身擴展吧。

12. 如何單獨對ListView上的一個item進行更新?

  1. 更新對應view的內容
  2. 經過ViewHolder去設置值
  3. 調用一次getView()方法(Google IO 推薦)

參考文章 http://blog.csdn.net/linglongxin24/article/details/53020164

13. 簡析一下大圖片的加載處理。

對Bitmap的理解,而後就是壓縮圖片。

14. 設計師只給了一套1280*800的UI圖標註,如何進行其它分辨率尺寸屏幕的適配?

名稱 像素密度範圍 圖片大小
mdpi 120dp~160dp 48×48px
hdpi 160dp~240dp 72×72px
xhdpi 240dp~320dp 96×96px
xxhdpi 320dp~480dp 144×144px
xxxhdpi 480dp~640dp 192×192px

以 720*1080 5英寸爲例:
(720^2 + 1080^2)開方=260
放在xhdpi中。

本題中同理能夠算得 293,仍是xhdpi中。

15. 6.0系統新權限機制的解決方案。

這個。。。沒什麼好說的,真正瞭解的很好說,不瞭解的話就有點繞。

? 大家精通的開源框架,問題來了

寫各類精通實際上是能夠的,要麼真牛x,若是不是很牛x那就在最後加上一條精通----精通各類被打臉

16. EventBus的機制是什麼?和Handler的區別怎樣?

EventBus是採用觀察者模式實現的事件訂閱總線,能夠用在應用程序中,組件之間,線程之間的通訊,而且因爲事件能夠是任意類型的對象,因此使用起來更加的方便快捷。
Handler是 Android 的消息機制,集中解決線程間通訊問題。

17. RxJava的機制是什麼?

RxJava是使用Java語言,以響應式編程思惟來進行編程的Java類庫。參考ReactiveX

18. Butterknife的機制是什麼?

Java Annotation Processing技術,在Java代碼編譯成Java字節碼的時候就已經處理了@Bind、@OnClick(ButterKnife還支持不少其餘的註解)這些註解了。

Annotation processing 是javac中用於編譯時掃描和解析Java註解的工具
Annotation processing是在編譯階段執行的,它的原理就是讀入Java源代碼,解析註解,而後生成新的Java代碼。新生成的Java代碼最後被編譯成Java字節碼,註解解析器(Annotation Processor)不能改變讀入的Java 類,好比不能加入或刪除Java方法。
參考:ButterKnife框架原理

19. Okhttp是基於HTTP鏈接仍是Socket鏈接?

基於Http的。

20. 例舉一種ORM框架,說說它的優缺點。

我熟悉的兩種GreenDao3AndroidActive,GreenDao 比較常規,註解很少(我這裏都是指3.0版本後,以前的版本在生存實體的時候略顯麻煩。),AndroidActive 相對而言註解較多,最後的綜合性能上 GreenDao 排第一毫無爭議。硬要說缺點的話就是 GreenDao 體積稍大。

相關文章
相關標籤/搜索