Android面試常問基礎知識點

極力推薦文章:歡迎收藏
Android 乾貨分享 android

閱讀五分鐘,每日十點,和您一塊兒終身學習,這裏是程序員Android

1.四大組件是什麼?

1.Activity:

  用戶可操做的可視化界面,爲用戶提供一個完成操做指令的窗口。一個Activity一般是一個單獨的屏幕,Activity經過Intent來進行通訊。Android中會維持一個Activity Stack,當一個新Activity建立時,它就會放到棧頂,這個Activity就處於運行狀態。程序員

2.Service:

  服務,運行在手機後臺,適合執行不需和用戶交互且還需長期運行的任務。數據庫

3.ContentProvider:

  內容提供者,使一個應用程序的指定數據集提供給其餘應用程序,其餘應用可經過ContentResolver類從該內容提供者中獲取或存入數據。它提供了一種跨進程數據共享的方式,當數據被修改後,ContentResolver接口的notifyChange函數通知那些註冊監控特定URIContentObserver對象。瀏覽器

  若是ContentProvider和調用者在同一進程中,ContentProvider的方法(query/insert/update/delete等)和調用者在同一線程中;若是ContentProvider和調用者不在同一進程,ContentProvider方法會運行在它自身進程的一個Binder線程中。安全

4.Broadcast Receiver:

  廣播接收者,運用在應用程序間傳輸信息,可使用廣播接收器來讓應用對一個外部事件作出響應。微信

2.四大組件的生命週期和簡單用法

1.Activity:

  onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()網絡

onCreate():

  爲Activity設置佈局,此時界面還不可見;框架

onStart():

   Activity可見但還不能與用戶交互,不能得到焦點異步

onRestart():

   從新啓動Activity時被回調ide

onResume():

   Activity可見且可與用戶進行交互

onPause():

  當前Activity暫停,不可與用戶交互,但還可見。在新Activity啓動前被系統調用保存現有的Activity中的持久數據.中止動畫等。

onStop():

  當Activity被新的Activity覆蓋不可見時被系統調用

onDestory():

Activity被系統銷燬殺掉或是因爲內存不足時調用

2.Service

1.onBind方式綁定的:

  bind 服務的生命週期以下:
  onCreate->onBind->onUnBind->onDestory

  無論調用bindService幾回,onCreate只會調用一次,onStart不會被調用,創建鏈接後,service會一直運行,直到調用unBindService或是以前調用的bindServiceContext不存在了,系統會自動中止Service,對應的onDestory會被調用。

2.startService啓動的:

  啓動Service的聲明週期以下:
  onCreate->onStartCommand->onDestory

  start屢次,onCreate只會被調用一次,onStart會調用屢次,該service會在後臺運行,直至被調用stopService或是stopSelf

3.又被啓動又被綁定的服務

  無論如何調用,onCreate()只被調用一次,startService調用多少次,onStart就會被調用多少次,而unbindService不會中止服務,必須調用stopService或是stopSelf來中止服務。必須unbindServicestopService(stopSelf)同時都調用了纔會中止服務。

3.BroadcastReceiver

1.動態註冊:

  存活週期是在Context.registerReceiverContext.unregisterReceiver之間,BroadcastReceiver每次收到廣播都是使用註冊傳入的對象處理的。

2.靜態註冊:

  進程在的狀況下,receiver會正常收到廣播,調用onReceive方法;生命週期只存活在onReceive函數中,此方法結束,BroadcastReceiver就銷燬了。onReceive()只有十幾秒存活時間,在onReceive()內操做超過10S,就會報ANR

  進程不存在的狀況,廣播相應的進程會被拉活,Application.onCreate會被調用,再調用onReceive

4.ContentProvider:

  和應用的生命週期同樣,它屬於系統應用,應用啓動時,它會跟着初始化,應用關閉或被殺,它會跟着結束。

3.Activity之間的通訊方式

  1.經過Intent方式傳遞參數跳轉
  2.經過廣播方式
  3.經過接口回調方式
  4.藉助類的靜態變量或全局變量
  5.藉助SharedPreference或是外部存儲,如數據庫或本地文件

4.Activity各類狀況下的生命週期

1. 兩個Activity(A->B)切換(B正常的Activity)的生命週期:

  onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)

這時若是按回退鍵回退到 
  onPause(B)->onRestart(A)->onStart(A)->onResume(A)->onStop(B)

若是在切換到B後調用了A.finish(),則會走到onDestory(A),這時點回退鍵會退出應用

2. 兩個Activity(A->B)切換(B透明主題的Activity或是Dialog風格的Acivity)的生命週期:

  onPause(A)->onCreate(B)->onStart(B)->onResume(B)

這時若是回退到 
  onPause(B)->onResume(A)->onStop(B)->onDestory(B)

3. Activity(A)啓動後點擊Home鍵再回到應用的生命週期:

  onPause(A)->onStop(A)->onRestart(A)->onStart(A)->onResume(A)

5.橫豎屏切換的時候,Activity 各類狀況下的生命週期

1.切換橫屏時:

  onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume

2. 切換豎屏時:會打印兩次相同的log   

  onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume->onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume

3. 若是在AndroidMainfest.xml中修改該Activity的屬性,添加android:configChanges="orientation"

  橫豎屏切換,打印的log同樣,同1.

4. 若是AndroidMainfest.xml中該Activity中的android:configChanges="orientation|keyboardHidden"

  則只會打印onConfigurationChanged

6.Activity與Fragment之間生命週期比較

Fragment生命週期:

  onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestoryView->onDestory->onDetach

切換到該Fragment:

  onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume

按下Power鍵:

onPause->onSaveInstanceState->onStop

點亮屏幕解鎖:

  onStart->onRestoreInstanceState->onResume

切換到其餘Fragment:

  onPause->onStop->onDestoryView

切回到該Fragment:

   onCreateView->onActivityCreated->onStart->onResume

退出應用:

  onPause->onStop->onDestoryView->onDestory->onDetach

7.Activity上有Dialog的時候按Home鍵時的生命週期

  AlertDialog並不會影響Activity的生命週期,按Home鍵後纔會使ActivityonPause->onStopAlertDialog只是一個組件,並不會使Activity進入後臺。

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

  前一個ActivityonPause,後一個ActivityonResume

9.前臺切換到後臺,而後再回到前臺,Activity生命週期回調方法。彈出Dialog,生命值週期回調方法。

1.前臺切換到後臺

  會執行onPause->onStop,再回到前臺,會執行onRestart->onStart->onResume

2. 彈出Dialog

並不會影響Activity生命週期

10.Activity的四種啓動模式對比

1.standard:標準啓動模式(默認)

  每啓動一次Activity,都會建立一個實例,即便從ActivityA startActivity ActivityA,也會再次建立A的實例放於棧頂,當回退時,回到上一個ActivityA的實例。

2. singleTop:棧頂複用模式

  每次啓動Activity,若是待啓動的Activity位於棧頂,則不會從新建立Activity的實例,即不會走onCreate->onStart,會直接進入ActivityonPause->onNewIntent->onResume方法

3. singleInstance: 單一實例模式

  整個手機操做系統裏只有一個該Activity實例存在,沒有其餘Actvity,後續請求均不會建立新的Activity。若task中存在實例,執行實例的onNewIntent()。應用場景:鬧鐘瀏覽器電話

4. singleTask:棧內複用

  啓動的Activity若是在指定的taskAffinitytask棧中存在相應的實例,則會把它上面的Activity都出棧,直到當前Activity實例位於棧頂,執行相應的onNewIntent()方法。若是指定的task不存在,建立指定的taskAffinitytask,taskAffinity的做用,進入指寫taskAffinitytask,若是指定的task存在,將task移到前臺,若是指定的task不存在,建立指定的taskAffinitytask`. 應用場景:應用的主頁面

11.Activity狀態保存於恢復

  Activity被主動回收時,如按下Back鍵,系統不會保存它的狀態,只有被動回收時,雖然這個Activity實例已被銷燬,但系統在新建一個Activity實例時,會帶上先前被回收Activity的信息。在當前Activity被銷燬前調用onSaveInstanceState(onPause和onStop之間保存),從新建立Activity後會在onCreate後調用onRestoreInstanceState(onStart和onResume之間被調用),它們的參數Bundle用來數據保存和讀取的。

保存View狀態有兩個前提:

  1.View的子類必須實現了onSaveInstanceState;
  2.必需要設定Id,這個ID做爲BundleKey;

12.fragment各類狀況下的生命週期

正常狀況下的生命週期:
  onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestoryView->onDestory->onDetach

1.Fragment在Activity中replace 

  onPause(舊)->onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onStop(舊)->onDestoryView(舊)
  若是添加到backStack中,調用remove()方法fragment的方法會走到onDestoryView,但不會執行onDetach(),即fragment自己的實例是存在的,成員變量也存在,可是view被銷燬了。若是新替換的Fragment已在BackStack中,則不會執行onAttach->onCreate

13.Fragment狀態保存onSaveInstanceState是哪一個類的方法,在什麼狀況下使用?

  在對應的FragmentActivity.onSaveInstanceState方法會調用FragmentController.saveAllState,其中會對mActive中各個Fragment的實例狀態和View狀態分別進行保存。當Activity在作狀態保存和恢復的時候, 在它其中的fragment天然也須要作狀態保存和恢復.

14.Fragment.startActivityForResult是和FragmentActivity的startActivityForResult?

  若是但願在FragmentonActivityResult接收數據,就要調用Fragment.startActivityForResult, 而不是Fragment.getActivity().startActivityForResult
Fragment.startActivityForResult->FragmentActivitymHost.HostCallbacks.onStartActivityFromFragment->FragmentActivity.startActivityFromFragment。若是request=-1則直接調用FragmentActivity.startActivityForResult,它會從新計算requestCode,使其大於0xfffff

15.如何實現Fragment的滑動?

  ViewPager+FragmentPagerAdapter+List<Fragment>

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

1.在相應的fragment中編寫方法,在須要回調的fragment裏獲取對應的Fragment實例,調用相應的方法;

2.採用接口回調的方式進行數據傳遞;

  a)在Fragment1中建立一個接口及接口對應的set方法;
  b)在Fragment1中調用接口的方法;
  c)在Fragment2中實現該接口;

3.利用第三方開源框架EventBus

17.service和activity怎麼進行數據交互?

1.經過bindService啓動服務,

  能夠在ServiceConnectiononServiceConnected中獲取到Service的實例,這樣就能夠調用service的方法,若是service想調用activity的方法,能夠在service中定義接口類及相應的set方法,在activity中實現相應的接口,這樣service就能夠回調接口;

2.經過廣播方式

18.說說ContentProvider、ContentResolver、ContentObserver 之間的關係

ContentProvider

  實現各個應用程序間數據共享,用來提供內容給別的應用操做。如聯繫人應用中就使用了ContentProvider,能夠在本身應用中讀取和修改聯繫人信息,不過須要獲取相應的權限。它也只是一箇中間件,真正的數據源是文件或SQLite等。

ContentResolver

  內容解析者,用於獲取內容提供者提供的數據,經過ContentResolver.notifyChange(uri)發出消息

ContentObserver

  內容監聽者,能夠監聽數據的改變狀態,觀察特定Uri引發的數據庫變化,繼而作一些相應的處理,相似於數據庫中的觸發器,當ContentObserver所觀察的Uri發生變化時,便會觸發它。

19.請描述一下廣播BroadcastReceiver的理解

  BroadcastReceiver是一種全局監聽器,用來實現系統中不一樣組件之間的通訊。有時候也會用來做爲傳輸少許並且發送頻率低的數據,可是若是數據的發送頻率比較高或者數量比較大就不建議用廣播接收者來接收了,由於這樣的效率很很差,由於BroadcastReceiver接收數據的開銷仍是比較大的。

20.廣播的分類

1.普通廣播:

  徹底異步的,能夠在同一時刻(邏輯上)被全部接收者接收到,消息傳遞的效率比較高,而且沒法中斷廣播的傳播。

2.有序廣播:

  發送有序廣播後,廣播接收者將按預先聲明的優先級依次接收Broadcast。優先級高的優先接收到廣播,而在其onReceiver()執行過程當中,廣播不會傳播到下一個接收者,此時當前的廣播接收者能夠abortBroadcast()來終止廣播繼續向下傳播,也能夠將intent中的數據進行修改設置,而後將其傳播到下一個廣播接收者。 sendOrderedBroadcast(intent, null);//發送有序廣播

3.粘性廣播:

  sendStickyBroadcast()來發送該類型的廣播信息,這種的廣播的最大特色是,當粘性廣播發送後,最後的一個粘性廣播會滯留在操做系統中。若是在粘性廣播發送後的一段時間裏,若是有新的符合廣播的動態註冊的廣播接收者註冊,將會收到這個廣播消息,雖然這個廣播是在廣播接收者註冊以前發送的,另一點,對於靜態註冊的廣播接收者來講,這個等同於普通廣播。

21.廣播使用的方式和場景

1.App全局監聽:

  在AndroidManifest中靜態註冊的廣播接收器,通常咱們在收到該消息後,須要作一些相應的動做,而這些動做與當前App的組件,好比Activity或者Service的是否運行無關,好比咱們在集成第三方Push SDK時,通常都會添加一個靜態註冊的BroadcastReceiver來監聽Push消息,當有Push消息過來時,會在後臺作一些網絡請求或者發送通知等等。

2.組件局部監聽:

  這種主要是在Activity或者Service中使用registerReceiver()動態註冊的廣播接收器,由於當咱們收到一些特定的消息,好比網絡鏈接發生變化時,咱們可能須要在當前Activity頁面給用戶一些UI上的提示,或者將Service中的網絡請求任務暫停。因此這種動態註冊的廣播接收器適合特定組件的特定消息處理。

22.在manifest 和代碼中如何註冊和使用BroadcastReceiver?

1.mainfest中註冊:

  靜態註冊的廣播接收者就是一個常駐在系統中的全局監聽器,也就是說若是你應用中配置了一個靜態的BroadcastReceiver,並且你安裝了應用而不管應用是否處於運行狀態,廣播接收者都是已常常駐在系統中了。

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.test.intent.mybroadcastreceiver"/>
    </intent-filter>
</receiver>

2. 動態註冊:

  動態註冊的廣播接收者只有執行了registerReceiver(receiver, filter)纔會開始監聽廣播消息,並對廣播消息做爲相應的處理。

IntentFilter fiter = new IntentFilter("com.test.intent.mybroadcastreceiver");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver(receiver, filter);

//撤銷廣播接受者的動態註冊
unregisterReceiver(receiver);

23.本地廣播和全局廣播有什麼差異?

1.LocalBroadcastReceiver

  僅在本身的應用內發送接收廣播,也就是隻有本身的應用能收到,數據更加安全。廣播只在這個程序裏,並且效率更高。只能動態註冊,在發送和註冊的時候採用LocalBroadcastManagersendBroadcast方法和registerReceiver方法。

2.全局廣播:

  發送的廣播事件可被其餘應用程序獲取,也能響應其餘應用程序發送的廣播事件(能夠經過 exported是否監聽其餘應用程序發送的廣播 在清單文件中控制) 全局廣播既能夠動態註冊,也能夠靜態註冊。

24.AlertDialog,popupWindow,Activity區別

  1.Popupwindow在顯示以前必定要設置寬高,Dialog無此限制。
  2.Popupwindow默認不會響應物理鍵盤的back,除非顯示設置了popup.setFocusable(true);而在點擊back的時候,Dialog會消失。
  3.Popupwindow不會給頁面其餘的部分添加蒙層,而Dialog會。
  4.Popupwindow沒有標題,Dialog默認有標題,能夠經過dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消標題
  5.兩者顯示的時候都要設置Gravity。若是不設置,Dialog默認是Gravity.CENTER
  6.兩者都有默認的背景,均可以經過setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
  7.Popupwindow彈出後,取得了用戶操做的響應處理權限,使得其餘UI控件不被觸發。而AlertDialog彈出後,點擊背景,AlertDialog會消失。

25.Application 和 Activity 的 Context 對象的區別

1.Application Context是伴隨應用生命週期;

  不能夠showDialog, startActivity, LayoutInflation
  能夠startService\BindService\sendBroadcast\registerBroadcast\load Resource values

2.Activity Context指生命週期只與當前Activity有關

  而Activity Context這些操做均可以,即凡是跟UI相關的,都得用Activity作爲Context來處理。
  一個應用Context的數量=Activity數量+Service數量+1Application數量
至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

微信關注公衆號:  程序員Android,領福利

相關文章
相關標籤/搜索