2019年7月Android面試題總結(初中級)附詳細答案——Android篇

彙總一下最近面試碰到的問題,和一些我覺得需要特別注意的問題

目錄

1.請描述一下 Activity 生命週期

2.請介紹一下四大組件

3.介紹一下MVC/MVP模式

4.Activity的四種啓動模式

5.什麼是Context,它的繼承關係和作用

6.兩個Activity 之間跳轉時必然會執行的是哪幾個方法?

7.fragment之間傳遞數據的方式?

8.介紹一下Handler

9.Fragment 跟 Activity 之間是如何傳值的

10.Android中五種數據存儲方式分別是什麼?

11.android UI 線程與後臺線程交互的方式有幾種

12.Android Touch 事件處理機制


1.請描述一下 Activity 生命週期

生命週期流程圖:

  • onCreate : 該方法是在Activity被創建時回調,它是生命週期第一個調用的方法,我們在創建Activity時一般都需要重寫該方法,然後在該方法中做一些初始化的操作,如通過setContentView設置界面佈局的資源,初始化所需要的組件信息等。 
  • onStart : 此方法被回調時表示Activity正在啓動,此時Activity已處於可見狀態,只是還沒有在前臺顯示,因此無法與用戶進行交互。可以簡單理解爲Activity已顯示而我們無法看見擺了。 
  • onResume : 當此方法回調時,則說明Activity已在前臺可見,可與用戶交互了(處於前面所說的Active/Running形態),onResume方法與onStart的相同點是兩者都表示Activity可見,只不過onStart回調時Activity還是後臺無法與用戶交互,而onResume則已顯示在前臺,可與用戶交互。當然從流程圖,我們也可以看出當Activity停止後(onPause方法和onStop方法被調用),重新回到前臺時也會調用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。 
  • onPause : 此方法被回調時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接着被回調。但通過流程圖我們還可以看到一種情況是onPause方法執行後直接執行了onResume方法,這屬於比較極端的現象了,這可能是用戶操作使當前Activity退居後臺後又迅速地再回到到當前的Activity,此時onResume方法就會被回調。當然,在onPause方法中我們可以做一些數據存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因爲這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法纔會被執行。 
  • onStop : 一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在後臺運行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)。 
  • onRestart :表示Activity正在重新啓動,當Activity由不可見變爲可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接着又回到當前Activity頁面時,onRestart方法就會被回調。 
  • onDestroy :此時Activity正在被銷燬,也是生命週期最後一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。 

2.請介紹一下四大組件

四大組件的介紹https://blog.csdn.net/qq_17798399/article/details/96020562

  • Activity【活動】:用於表現功能。
  • Service【服務】:後臺運行服務,不提供界面呈現。
  • BroadcastReceiver【廣播接收器】:用來接收廣播。
  • Content Provider【內容提供商】:支持在多個應用中存儲和讀取數據,相當於數據庫。

3.介紹一下MVC/MVP模式

Android 中 MVC 的簡單理解https://blog.csdn.net/qq_17798399/article/details/95933628

Android MVP 架構介紹https://blog.csdn.net/qq_17798399/article/details/95934476

MVC模式

  • M 指模型層(網絡IO、文件IO等操作)
  • V 指視圖層(對應Android中的Layout和Activity/Fragment)
  • C 指控制層(對應Android中的Activity/Fragment)

MVP模式

  • Model:業務邏輯和實體模型,用來操作實際的數據,包含Bean和Model的抽象接口來降低耦合。
  • View:就是Android中的視圖,需要建立一個View的抽象接口View Interface。通過實現View的接口來實現View與Presenter的交互,從而降低耦合。對應於Activity,負責View的繪製與用戶交互;
  • Presenter:View和Model的中間樞紐,處理和用戶交互的邏輯。

 

4.Activity的四種啓動模式

  • Standard:標準的啓動模式,如果需要啓動一個activity就會創建該activity的實例。也是activity的默認啓動模式。
  • SingeTop:如果啓動的activity已經位於棧頂,那麼就不會重新創建一個新的activity實例。而是複用位於棧頂的activity實例對象。如果不位於棧頂仍舊會重新創建activity的實例對象。
  • SingleTask:設置了singleTask啓動模式的activity在啓動時,如果位於activity棧中,就會複用該activity,這樣的話,在該實例之上的所有activity都依次進行出棧操作,即執行對應的onDestroy()方法,直到當前要啓動的activity位於棧頂。一般應用在網頁的圖集,一鍵退出當前的應用程序。
  • singleInstance:如果使用singleInstance啓動模式的activity在啓動的時候會複用已經存在的activity實例。不管這個activity的實例是位於哪一個應用當中,都會共享已經啓動的activity的實例對象。使用了singlestance的啓動模式的activity會單獨的開啓一個共享棧,這個棧中只存在當前的activity實例對象。

5.什麼是Context,它的繼承關係和作用

Context是應用程序環境中全局信息的接口,多被譯爲上下文,它整合了許多系統級的服務,可以用來獲取應用中的類、資源,以及可以進行應用程序級的調起操作,比如啓動Activity、Service等等,而且Context這個類是abstract的,不包含具體的函數實現。

Application、Activity都間接繼承了Context

getApplication和getApplicationContext的區別

  • getApplication返回結果爲Application,且不同的Activity和Service返回的Application均爲同一個全局對象
  • getApplicationContext返回的也是Application對象,只不過返回類型爲Context,看看它的實現

getContext 和 getActivity的區別

  • this:表示當前對象;一般而言,在哪個類中調用,就是指向該對象。
  • getContext():這個是View類中提供的方法,在繼承了View的類中纔可以調用,返回的是當前View運行在哪個Activity Context中。
  • getActivity():獲得Fragment依附的Activity對象。Fragment裏邊的getActivity()不推薦使用原因如下:這個方法會返回當前Fragment所附加的Activity,當Fragment生命週期結束並銷燬時,getActivity()返回的是null,所以在使用時要注意判斷null或者捕獲空指針異常。

6.兩個Activity 之間跳轉時必然會執行的是哪幾個方法?

首先定義兩個Activity,分別爲A和B。

當我們在A中激活B時,A調用onPause()方法,此時B出現在屏幕時,B調用onCreate()、onStart()、onResume()。

這個時候B【B不是一個透明的窗體或對話框的形式】已經覆蓋了A的窗體,A會調用onStop()方法。


7.fragment之間傳遞數據的方式?

方法一:

1、在MainFragment中設置一個setData()方法,在方法中設置更改按鈕名稱;

//MainFragment.java文件中

public void setData(String string) {

bt_main.setText(string);

}

2、在MenuFragment中的ListView條目點擊事件中通過標籤獲取到MainFragment,並調用對應的setData()方法,將數據設置進去,從而達到數據傳遞的目的。
 

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

MainFragment mainFragment =(MainFragment) getActivity()

.getSupportFragmentManager()

.findFragmentByTag("mainFragment");

mainFragment.setData(mDatas.get(position));

}

});

方法二:
採取接口回調的方式進行數據傳遞。


8.介紹一下Handler

Handler四大組件

                 1)Message

                       Message是在線程之間傳遞的消息,它可以在內部攜帶少量的信息,用於在不同線程之間交換數據。

                       例:Message的what字段、arg1字段、arg2字段來攜帶整型數據,obj字段攜帶一個Object對象。

                 2)Handler

                       處理者,它主要用來發送和處理消息。發送消息一般是使用Handler的sendMessage()方法,消息經過處理後,最終                        傳遞到Handler的handlerMessage()方法中。

                 3)MessageQueue

                      消息隊列,它主要用來存放所有通過Handler發送的消息,這部分消息會一直存在於消息隊列中,等待被處理。

                      注意:每個線程中只會有一個MessageQueue對象。

                 4)Looper

                     是每個線程中MessageQueue的管家,調用Looper的loop()方法後,就會進入到一個無限循環當中,每當發現                                  MessageQueue中存在一條消息,就會將其取出傳遞到Handler的handleMessage()方法當中。

                     注意:每個線程中只會有一個Looper對象。

 異步消息處理流程:

                                                       1)在主線程當中創建一個Handler對象;

                                                       2)重寫handleMessage()方法;

                                                       3)當子線程需要進行UI操作時,創建一個Message對象,並通過Handler將消息發送出去;

                                                       4)消息添加到MessageQueue的隊列中等待被處理;

                                                       5)Looper在MessageQueue中取出待處理消息,發回Handler的handleMessage()方法中。

【由於Handler是在主線程中創建的,因此我們的handleMessage()方法中的代碼也會在主線程中執行,避免了異常的產生】
 

9.Fragment 跟 Activity 之間是如何傳值的

當 Fragment 跟 Activity 綁定之後,在 Fragment 中可以直接通過 getActivity()方法獲取到
其綁定的Activity 對象,這樣就可以調用Activity 的方法了。在 Activity 中可以通過如下方法獲取到
Fragment實例
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
Fragment fragment = fragmentManager.findFragmentById(id);
獲取到 Fragment之後就可以調用Fragment的方法。也就實現了通信功能。

 

10.Android中五種數據存儲方式分別是什麼?

(1)SharedPreference,存放較少的五種類型的數據,只能在同一個包內使
            用,生成XML的格式存放在設備中
(2) SQLite數據庫,存放各種數據,是一個輕量級的嵌入式數據庫
(3) File文件,通過讀取寫入方式生成文件存放數據
(4) ContentProvider,主要用於讓其他應用程序使用保存的數據
(5) 通過網絡獲取數據和寫入數據到網絡存儲空間

11.android UI 線程與後臺線程交互的方式有幾種

1、handler
2、Activity.runOnUIThread(Runnable)
3、View.Post(Runnable)
4、View.PostDelayed(Runnabe,long)
5、AsyncTask
 

12.Android Touch 事件處理機制

當 TouchEvent 發生時,首先 Activity 將 TouchEvent 傳遞給最頂層的 View,TouchEvent 最先到達最頂層 view 的 dispatchTouchEvent ,然後由 dispatchTouchEvent 方法進行分發,如果 dispatchTouchEvent 返回true ,則交給這個 view 的 onTouchEvent 處理,如果 dispatchTouchEvent 返回false ,則交給這個 view 的 interceptTouchEvent 方法來決定是否要攔截這
個事件,如果 interceptTouchEvent 返回 true ,也就是攔截掉了,則交給它的 onTouchEvent 來處理,如果 interceptTouchEvent 返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchTouchEvent 再來開始這個事件的分發。

如果事件傳遞到某一層的子 view 的 onTouchEvent 上了,這個方法返回了false ,那麼這個事件會從這個 view 往上傳遞,都是 onTouchEvent 來接收。而如果傳遞到最上面的 onTouchEvent 也返回 false 的話,這個事件就會“消失”,而且接收不到下一次事件
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章