Android部分(給出重點部分):
1. Activity 系列問題
1.1 請簡要介紹Android的四大組件。(會說即可,不用死記硬背)
- Activity:提供一個界面讓用戶點擊和各種滑動操作
- Service :可以在后臺執行長時間運行操作而沒有用戶界面的應用組件
- Broadcast Receiver :一種廣泛運用在應用程序之間傳輸信息的機制,通過發送Intent來傳送我們的數據
- Content Provider :內容提供者,它是用在不同的應用程序之間共享數據時,可以把一個應用的數據提供給其他的應用使用。
1.2 Android中Activity, Intent, Content Provider, Service各有什么區別。(說出他們是什么即可)
- Activity:
- Intent: 意圖,描述應用想干什么。最重要的部分是動作和動作對應的數據。
- Content Provider:
- Service:
1.3 Manifest.xml文件中主要包括哪些信息?
- 1.manifest:根節點,描述了package中所有的內容。
- 2.uses-permission:請求你的package正常運作所需賦予的安全許可。
- 3.permission: 聲明了安全許可來限制哪些程序能你package中的組件和功能。
- 4.instrumentation:聲明了用來測試此package或其他package指令組件的代碼。
- 5.application:包含package中application級別組件聲明的根節點。
- 6.activity:Activity是用來與用戶交互的主要工具。
- 7.receiver:IntentReceiver能使的application獲得數據的改變或者發生的操作,即使它當前不在運行。
- 8.service:Service是能在后臺運行任意時間的組件。
- 9.provider:ContentProvider是用來管理持久化數據并發布給其他應用程序使用的組件。
1.4 繪制Activity生命周期流程圖(Activity的生命周期)
1.4 介紹下不同場景下Activity生命周期的變化過程
- 啟動Activity: onCreate()--->onStart()--->onResume(),Activity進入運行狀態。
- Activity退居后臺: 當前Activity轉到新的Activity界面或按Home鍵回到主屏: onPause()--->onStop(),進入停滯狀態。
- Activity返回前臺: onRestart()--->onStart()--->onResume(),再次回到運行狀態。
- Activity退居后臺,且系統內存不足, 系統會殺死這個后臺狀態的Activity,若再次回到這個Activity,則會走onCreate()-->onStart()--->onResume()
- 鎖定屏與解鎖屏幕 只會調用onPause(),而不會調用onStop方法,開屏后則調用onResume()
1.5 內存不足時系統會殺掉后臺的Activity,若需要進行一些臨時狀態的保存,在哪個方法進行?
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會被觸發。
答:onSaveInstanceState() 方法,當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷毀一個Activity,onSaveInstanceState() 會被調用。但是當用戶主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。除非該activity是被用戶主動銷毀的,通常onSaveInstanceState()只適合用于保存一些臨時性的狀態,而onPause()適合用于數據的持久化保存。
1.6 onSaveInstanceState()被執行的場景有哪些:
系統不知道你按下HOME后要運行多少其他的程序,自然也不知道activity A是否會被銷毀,因此系統都會調用onSaveInstanceState(),讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則
- 當用戶按下HOME鍵時
- 長按HOME鍵,選擇運行其他的程序時
- 鎖屏時
- 從activity A中啟動一個新的activity時
- 屏幕方向切換時
1.7 兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?
一般情況下比如說有兩個 activity,分別叫 A,B,當在 A 里面激活 B 組件的時候, A 會調用 onPause()方法,然后 B 調用 onCreate() ,onStart(), onResume()。
這個時候 B 覆蓋了窗體, A 會調用 onStop()方法. 如果 B 是個透明的,或者 是對話框的樣式, 就不會調用 A 的 onStop()方法。
1.8 如何將一個 Activity 設置成窗口的樣式?
只需要給我們的 Activity 配置如下屬性即可。
android:theme="@android:style/Theme.Dialog"
1.9如何退出 Activity?如何安全退出已調用多個 Activity 的 Application?(知道即可)
- 1.通常情況用戶退出一個 Activity 只需按返回鍵,我們寫代碼想退出 activity 直接調用 finish()方法就行。
- 2.發送特定廣播:
在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播后,關閉 即可。
//給某個 activity 注冊接受接受廣播的意圖 registerReceiver(receiver, filter)
//如果過接受到的是 關閉 activity 的廣播 activity finish()掉
- 3.遞歸退出
就調用 finish()方法 把當前的
在打開新的 Activity 時使用 startActivityForResult,然后自己加標志,在 onActivityResult 中處理,遞歸關閉。 - 4.其實 也可以通過 intent 的 flag 來實現 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的 activity。 此時如果該任務棧中已經有該 Activity,那么系統會把這個 Activity 上面的所有 Activity 干掉。其實相當于給 Activity 配置的啟動模式為 SingleTop。
- 5.記錄打開的 Activity:
每打開一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity
//偽代碼
List<Activity> lists ;// 在 application 全局的變量里面 lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity: lists)
{
activity.finish();
}
lists.remove(this);
2.0 Android 中的 Context, Activity,Appliction 有什么區別?
-
相同:Activity 和 Application 都是 Context 的子類。
Context 從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理 上下文環境中各個參數和變量的總用,方便我們可以簡單的訪問到各種資源。 - 不同:維護的生命周期不同。Context 維護的是當前的 Activity 的生命周期, Application 維護的是整個項目的生命周期。使用 context 的時候,小心內存泄露,防止內存泄露,注意一下幾個方面:
2.1 Context 是什么?(理解)
1、它描述的是一個應用程序環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實 現類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作, 例如:啟動一個 Activity,發送廣播,接受 Intent,信息,等。
附加一張Context繼承關系圖
2.2如何獲取當前屏幕Activity的對象?
使用ActivityLifecycleCallbacks
傳送地址:
2.3你知道onNewIntent嗎?
如果IntentActivity處于任務棧的頂端,也就是說之前打開過的Activity,現在處于onPause、onStop 狀態的話,其他應用再發送Intent的話,執行順序為:
onNewIntent,onRestart,onStart,onResume。
2.4 除了用Intent 去啟動一個Activity,還有其他方法嗎?
使用adb shell am 命令
am啟動一個activity
adb shell am start com.example.fuchenxuan/.MainActivity
am發送一個廣播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER
2.5 Android Service與Activity之間通信的幾種方式?
- 通過Binder對象
當Activity通過調用bindService(Intent service, ServiceConnection conn,int flags),得到一個Service的一個對象,通過這個對象我們可以直接訪問Service中的方法。 - 通過Broadcast Receiver(廣播)的形式
- EventBus
2.6 如果新Activity是透明主題時,舊Activity會不會走onStop
不會!
2.7 介紹Activity的幾中啟動模式,并簡單說說自己的理解或者使用場景
standard
默認模式,可以不用寫配置。在這個模式下,都會默認創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。singleTop
可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂的時候,啟動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。singleTask
只有一個實例。在同一個應用程序中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉并調用它的onNewIntent方法。
如果是在別的應用程序中啟動它,則會新建一個task,并在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的實例中再打開新的Activity,這個新的Activity還是會在singleTask的實例的task中。singleInstance
只有一個實例,并且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。
2.8 什么是ANR,如何避免他
2.9 Activity的管理機制
經驗總結
面試官問這個問題,想看看大家對Activity了解是否深入,什么是ActivityRecord,什么是TaskRecord,什么是ActivityManagerService,如果這些大家都能說出來,起碼是一個好多年工作經驗的老司機了,一般很多對Activity的了解還是停留在界面上
簡述通過ContentResolver獲取ContentProvider內容的基本步驟
基本步驟:
得到ContentResolver類對象:ContentResolver cr = getContentResolver()。
定義要查詢的字段String數組。
使用cr.query();返回一個Cursor對象。
使用while循環得到Cursor里面的內容。
Android中如何訪問自定義ContentProvider?
通過ContentProvider的Uri訪問開放的數據。
- 1.ContenResolver對象通過Context提供的方法getContenResolver()來獲得。
- 2.ContenResolver提供了以下方法來操作:insert delete update query這些方法分別會調用ContenProvider中與之對應的方法并得到返回的結果。
SurfaceView和View的區別是什么?
SurfaceView中采用了雙緩存技術,在單獨的線程中更新界面;View在UI線程中更新界面
你在項目中哪些地方用到了XML?
XML的主要作用有兩個方面:數據交換和信息配置。在做數據交換時,XML將數據用標簽組裝成起來,然后壓縮打包加密后通過網絡傳送給接收者,接收解密與解壓縮后再從XML文件中還原相關信息進行處理,XML曾經是異構系統間交換數據的事實標準,但此項功能幾乎已經被JSON(JavaScript Object Notation)取而代之。當然,目前很多軟件仍然使用XML來存儲配置信息,我們在很多項目中通常也會將作為配置信息的硬代碼寫在XML文件中,Java的很多框架也是這么做的,而且這些框架都選擇了dom4j作為處理XML的工具,因為Sun公司的官方JavaSE實在不怎么好用。Android里的布局文件和配置文件都用的XML。
Android中定義style和theme的區別
經驗總結:
一般面試官問這樣
不同點:
Theme是應用于Activity或者是整個Application的,作用于單個Activity或者所有Acity,不能作用于某個控件的
Style是應用于某個(些)控件,Layout的,作用于控件級別的。
兩者總結一句就是:相對而言Theme是作用于全局的,而Style是作用于局部的。定義方式一樣,使用的地方不一樣。
相同點:
都位于values文件夾下的style.xml中,定義的方法一樣,都是控制UI的一堆屬性。
如何打開res raw目錄中的數據庫文件
面試經驗:
一般面試官問到raw這個問題,都會在擴展下問問raw和assets的區別,所以這個地方也大家需要注意下
答案解析:
android raw與assets區別
- res/raw和assets的相同點:
- 兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制。
- res/raw和assets的不同點:
res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾
- 讀取文件資源:
讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作
讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作