天天看點

Android面試題-Activity

1、橫豎屏切換時Activity的生命周期變化?

1.如果沒有在AndroidManifest.xml配置android:ConfigChanges,切屏會銷毀目前Activity,然後重新加載調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次;此時Activity的生命周期如下:onPause,onStop: , onDestroy: , onCreate: ,onStart: onRestoreInstanceState,onResume。

2.如果設定 android:configChanges=“orientation|keyboardHidden|screenSize”>,此時Activity的生命周期不會重走一遍,Activity不會重建,隻會回調onConfigurationChanged方法。

經過機型測試

在 Android5.1 即 API 3 23 級别下,切屏還是會重新調用各個生命周期,切橫、豎屏時隻會執行一次

在 Android9 即 API 8 28 級别下,切屏不會重新調用各個生命周期,隻會執行 onConfigurationChanged方法

官方糾正後,原話如下

如果您的應用面向 Android 2 3.2 即 API 級别 3 13 或更

進階别(按照 minSdkVersion 和 targetSdkVersion)

2、activity的startActivity和context的startActivity差別?

1.從Activity中啟動新的Activity時可以直接 mContext.startActivity(intent)就好,

2.從非Activity中用Context中啟動Activity則必須給intent設定Flag:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;

mContext.startActivity(intent);

3、Activity啟動模式有哪些,分别有什麼不同?

Activity有四種啟動模式,分别是standard,singleTop,singleTask,singleInstance

1、standard标準模式: 這個是android預設的Activity啟動模式, 每次啟動一個 Activity 都會重新建立一個新的執行個體,不管這個執行個體是否已經存在,此模式的 Activity 預設會進入啟動它的 Activity 所屬的任務棧中,并位于棧頂。

2、singleTop棧頂複用模式:如果目前要啟動的Activity 已經位于任務棧的棧頂,那麼此 Activity 不會被重新建立,會複用該Activity,并且不會重走onCreate方法,會直接走它的onNewIntent方法,如果新 Activity 執行個體已經存在但不在棧頂,那麼Activity 依然會被重新建立。如果目前activity已經在前台顯示着,突然來了一條推送消息,此時不想讓接收推送的消息的activity再次建立,那麼此時正好可以用該啟動模式,如果之前activity棧中是A–>B–>C如果點選了推動的消息還是A–>B–C,不過此時C是不會再次建立的,而是調用C的onNewIntent。而如果現在activity中棧是A–>C–>B,再次打開推送的消息,此時跟正常的啟動C就沒啥差別了,目前棧中就是A–>C–>B–>C了。

3、singleTask棧内複用模式:隻要 Activity 在一個任務棧中存在,那麼多次啟動此 Activity 都不會重新建立執行個體,并回調onNewIntent 方法,比如之前activity棧中有A–>B–>C—D,再次打開了B的時候,在B上面的activity都會從activity棧中被移除。下面的acitivity還是不用管,是以此時棧中是A–>B,一般項目中首頁面用到該啟動模式。

4、singleInstance:該種情況就用得比較少了,主要是指在該activity永遠隻在一個單獨的棧中,且此任務棧中隻有唯一一個執行個體。一旦該模式的activity的執行個體已經存在于某個棧中,任何應用在激活該activity時都會重用該棧中的執行個體,解決了多個task共享一個activity。其餘的基本和上面的singleTask保持一緻。

4、App啟動流程

從Linux核心系統到init程序的分裂,以及後面會啟動一個叫Zygote的程序開始,而Zygote會分裂出系統的核心服務程序SystemServer,也就是SystemServer裡面包括了底層的ActivityManagerService、PackageManagerService、WindowManagerService等,這些核心服務都是通過Zygote.init啟動的,ActivityManagerService就是我們後面通過binder的ipc通信機制來與用戶端ActivityThread建立通信的。

當我們點選了應用之後,系統的Launcher應用會通過startActivity的方式啟動應用,而Intent的擷取會經過如下幾部:

(1) ActivityManagerService會通過PackageManager的resolveIntent()收集這個intent對象的指向資訊。

(2)指向資訊被存儲在一個intent對象中。

(3)下面重要的一步是通過grantUriPermissionLocked()方法來驗證使用者是否有足夠的權限去調用該intent對象指向的Activity。

(4)如果有權限, ActivityManagerService會檢查并在新的task中啟動目标activity.

(5)現在, 是時候檢查這個程序的ProcessRecord是否存在了。

是以如果ProcessRecord不是null,ActivityManagerService會建立新的程序來執行個體化該activity。

ActivityManagerService調用startProcessLocked()方法來建立新的程序, 該方法會通過前面講到的socket通道傳遞參數給Zygote程序. Zygote孵化自身, 并調用ZygoteInit.main()方法來執行個體化ActivityThread對象并最終傳回新程序的pid。

随後就是我們熟悉的ActivityThread.main方法通過Looper.prepare和Looper.loop方法開啟消息循環

緊接着就是建立Application對象的過程,先是建立好ContextImpl對象,然後通過makeApplication方法将app程序與Application建立聯系,這裡的Application建立交給了Instrumentation的對象,其實後面activity的建立,生命周期的回調都是通過它來觸發的。

建立完Application後,緊接着就是我們熟悉的Activity,activity的建立同樣交給了Instrumentation對象,上面說過ActivityManagerService會将攜帶的Intent對象交給了Lanucher應用,Lanucher的startActivity經過一系列的操作,最終會走Instrumentation的execStartActivity方法,該方法裡面會去請求ActivityManagerService服務,最終通過binder通信将資訊傳給了用戶端的ApplicationThread,最終會觸發ApplicationThread的scheduleLaunchActivity方法,該方法将消息發送給了ActivityThread的handler對象,最終交給了Instrumentation對象建立activity。後面也就觸發一系列的生命周期方法。

4、Activity的生命周期,能否改?

5、如何了解Activity的任務親和性

6、Activity的啟動過程

7、推送到達率如何提高

判手機系統,小米使用小米推送,華為使用華為推送,其他手機使用友盟推送

8、說下 Activity 跟 跟 window , view 之間的關系?

Activity 建立時通過 attach()初始化了一個 Window 也就是PhoneWindow,一個 PhoneWindow 持有一個DecorView 的執行個體,DecorView 本身是一個 FrameLayout,繼承于 View,Activty 通過setContentView 将xml 布局控件不斷 addView()添加到 View 中,最終顯示到 Window 于我們互動;

9、Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什麼?

所有的架構都是基于反射 和 配置檔案(manifest)的。 普通的情況: Activity 建立一個 view 是通過 ondraw

畫出來的, 畫這個 view 之前呢,還會調用 onmeasure方法來計算顯示的大小.複制代碼 特殊情況: Surfaceview

是直接操作硬體的,因為 或者視訊播放對幀數有要求,onDraw 效率太低,不夠使,Surfaceview 直接把資料寫到顯存。複制代碼

10、Android中任務棧的配置設定

Task實際上是一個Activity棧,通常使用者感受的一個Application就是一個Task。從這個定義來看,Task跟Service或者其他Components是沒有任何聯系的,它隻是針對Activity而言的。

Activity有不同的啟動模式, 可以影響到task的配置設定

11、Activity間通過Intent傳遞資料大小有沒有限制?

Intent在傳遞資料時是有大小限制的,這裡官方并未詳細說明,不過通過實驗的方法可以測出資料應該被限制在1MB之内(1024KB),筆者采用的是傳遞Bitmap的方法,發現當圖檔大小超過1024(準确地說是1020左右)的時候,程式就會出現閃退、停止運作等異常(不同的手機反應不同),是以可以判斷Intent的傳輸容量在1MB之内。

繼續閱讀