安卓面試及答案2
什麼是 Activity?
通俗一點說 Activity 就是一個介面,這個介面裡面可以放置各種控制元件。Activity 的介面也是
用 xml 檔案表示的,放置在 res->layout 下面。每生成一個新的 Activity 後,我們需要在
AndroidManifest.xml 中註冊一下這個 activity
請描述一下 Activity 生命週期。
onCreate(Bundle savedInstanceState):建立 activity 時呼叫。設定在該方法中,還以 Bundle
的形式提供對以前儲存的任何狀態的訪問!
onStart():activity 變為在螢幕上對使用者可見時呼叫。
onResume():activity 開始與使用者互動時呼叫(無論是啟動還是重新啟動一個活動,該方法
總是被呼叫的)。
onPause():activity 被暫停或收回 cpu 和其他資源時呼叫,該方法用於儲存活動狀態的,也
是保護現場,壓棧吧!
onStop():activity 被停止並轉為不可見階段及後續的生命週期事件時呼叫。
onRestart():重新啟動 activity 時呼叫。該活動仍在棧中,而不是啟動新的活動。
onDestroy():activity 被完全從系統記憶體中移除時呼叫,該方法被呼叫
兩個 Activity 之間跳轉時必然會執行的是哪幾個方法。
onCrante() //在 Activity 生命週期開始時呼叫
onRestoreInstanceState()//用來恢復 UI 狀態
onReStart()//當 Activity 重新啟動時呼叫
onStart()//Activity 對使用者即將可見時呼叫
onResume()//當 Activity 與使用者互動時,繪製介面
onSaveInstanceState()//activity 即將移出棧頂保留 UI 狀態時呼叫
onPause()//暫停當前活動 activity,提交持久資料的改變,停止動畫和其他佔用 CPU 資源的
東西,由於下一個 activity 在這個方法返回之前不會 resume,所以這個方法的程式碼執行要快。
onStop()//activity 不再可見時呼叫
onDestroy()//在 Activity 銷燬錢被呼叫的最後一個方法。
橫豎屏切換時候 Activity 的生命週期。
1、不設定 Activity 的 android:configChanges 時,切屏會重新呼叫各個生命週期,切橫屏時
會執行一次,切豎屏時會執行兩次
2、設定 Activity 的 android:configChanges="orientation"時,切屏還是會重新呼叫各個生命
週期,切橫、豎屏時只會執行一次
3、設定 Activity 的 android:configChanges="orientation|keyboardHidden"時,切屏不會重
新呼叫各個生命週期,只會執行 onConfigurationChanged 方法
如何將一個 Activity 設定成視窗的樣式。
1、在你的 styles.xml 檔案中可以新建一如下的類似 Dialog 的 style
2、在 AndroidManifest.xml 中在你需要顯示為視窗的 activity 中新增如下屬性:
android:theme="@style/Theme.FloatActivity" 即可
也可以直接新增您對應需要展示為 Dialog style 的 Activity 的 android:theme 屬性值為
android:theme="@android:style/Theme.Dialog"。
你後臺的 Activity 被系統回收怎麼辦?
系統會幫我們記錄下回收前 Activity 的狀態,再次呼叫被回收的 Activity 就要重新呼叫
onCreate()方法,不同於直接啟動的是這回 onCreate()裡是帶上引數 savedInstanceState。
savedInstanceState是一個Bundle物件,你基本上可以把他理解為系統幫你維護的一個Map
物件,我們使用 savedInstanceState 可以恢復到回收前的狀態。
如何退出 Activity?如何安全退出已呼叫多個 Activity 的 Application?
用 finish()方法退出 activity.
在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。
它可以直接結束整個應用。在使用時需要許可權 android.permission.RESTART_PACKAGES。
在 2.2,這個方法失效了,可使用以下幾個人工的方法
1、記錄開啟的 Activity:
每開啟一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。
2、傳送特定廣播:
在需要結束應用時,傳送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。
如果後臺的 Activity 由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態?
被回收前呼叫 onSaveInstanceState()方法儲存當前狀態。
兩個 Activity 之間怎麼傳遞資料?
在 Intent 的物件中增加要傳遞的引數既可。
在 Intent 的物件的請求中加入鍵值對,物件名字.putExtra(“鍵值對的名字”,“鍵值對的值”);
在另一個 Activity 中將 Intent 請求中的資料取出來:
Intent intent=getIntent();//
String value = intent.getStringExtra(“testIntent”);//將 testIntent 對應的值賦值給 value
怎麼在啟動一個 Activity 時就啟動一個 service?
將啟動 Service 的語句放在 onCreate()方法中。
同一個程式,但不同的 Activity 是否可以放在不同的 Task 任務棧中?
可以放在不同的 Task 中。需要為不同的 activity 設定不同的 taskaffinity 屬性,啟動 activity
的 Intent 需要包含 FLAG_ACTIVITY_NEW_TASK 標記。
Activity 怎麼和 service 繫結,怎麼在 activity 中啟動自己對應的 service?
1、Activity 能進行繫結得益於 Service 的介面。為了支援 Service 的繫結,實現 onBind 方法。
2、Service 和 Activity 的連線可以用 ServiceConnection 來實現。你需要實現一個新的
ServiceConnection,重寫 onServiceConnected 和 onServiceDisconnected 方法,一旦連線
建立,你就能得到 Service 例項的引用。
3、執行繫結,呼叫 bindService 方法,傳入一個選擇了要繫結的 Service 的 Intent(顯式或
隱式)和一個你實現了的 ServiceConnection 例項
什麼是 Service 以及描述下它的生命週期。
Android Service 是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序,也可以
執行在其他應用程式程序的上下文裡。需要通過某一個 Activity 或者其他 Context 物件來調
用, Context.startService() 和 Context.bindService()。 如果在 Service 執行耗時的操作
需要啟動一個新執行緒來執行。
Android Service 只繼承了 onCreate(),onStart(),onDestroy()三個方法,當我們第一次啟動
Service 時,先後呼叫了 onCreate(),onStart()這兩個方法,當停止 Service 時,則執行
onDestroy()方法,這裡需要注意的是,如果 Service 已經啟動了,當我們再次啟 Service 時,
不會在執行 onCreate()方法,而是直接執行 onStart()方法。
Service 有哪些啟動方法,有什麼區別,怎樣停用 Service?
兩種啟動 Service 的方式 Context.startService() 和 Context.bindService()。 區別
為 Context.startService():Service 會經歷 onCreate -> onStart(如果 Service 還沒有執行,
則android先呼叫onCreate()然後呼叫onStart();如果Service已經執行,則只調用onStart(),
所以一個 Service 的 onStart 方法可能會重複呼叫多次 );stopService 的時候直接
onDestroy,如果是呼叫者自己直接退出而沒有呼叫 stopService 的話,Service 會一直在後
臺執行。該 Service 的呼叫者再啟動起來後可以通過 stopService 關閉 Service
Context.bindService():Service 會經歷 onCreate() -> onBind(),onBind 將返回給客戶端
一個 IBind 介面例項,IBind 允許客戶端回撥服務的方法,比如得到 Service 執行的狀態或其
他操作。這個時候把呼叫者(Context,例如 Activity)會和 Service 繫結在一起,Context
退出了,Srevice 就會呼叫 onUnbind -> onDestroyed 相應退出,所謂繫結在一起就共存亡
了 。
停用 service 使用 context.stopService()
不用 service,B 頁面為音樂播放,從 A 跳轉到 B,再返回,如何使音樂繼續播放?
a 使用 startActivityForResult() 方法開啟 b,b 類結束時呼叫 finish();
a 類的 intent 有一個子 activity 結束事件 onActivityResult(),在事件裡繼續播放音樂
什麼是 IntentService?有何優點?
IntentService 也是一個 Service,是 Service 的子類,
IntentService 和 Service 有所不同,通過 Looper 和 Thread 來解決標準 Service 中處理邏輯
的阻塞問題。
優點:Acitivity 的程序,當處理 Intent 的時候,會產生一個對應的 Service
Android 的程序處理器現在會盡可能的不 kill 掉你
非常容易使用
日曆中 IntentService 的應用
什麼時候使用 Service?
比如播放多媒體的時候使用者啟動了其他 Activity 這個時候程式要在後臺繼續播放,比如檢測
SD 卡上檔案的變化,再或者在後臺記 錄你地理資訊位置的改變等等,總之服務嘛,總是藏
在後頭的。
請描述一下 Intent 和 Intent Filter。
Intent 在 Android 中被翻譯為"意圖",熟語來講就是目的,他們是三種應用程式基本元件
—activity,service 和 broadcast receiver 之間互相啟用的手段。 在呼叫 Intent 名稱時使用
ComponentName 也就是類的全名時為顯示呼叫。這種方式一般用於應用程式的內部呼叫,
因為你不一定會知道別人寫的類的全名。我們來看看隱式 Intent 怎麼用? 首先我們先配置
我們的 Activity 的 Intent Filter
這樣在呼叫的時候指定 Intent 的 action,系統就是自動的去對比是哪個 intent-filter 符合我
們的 Activity,找到後就會啟動 Activity。
一個 intent filter 是 IntentFilter 類的例項, 但是它一般不出現在程式碼中,而是出現在 android
Manifest 檔案中, 以的形式. (有一個例外是 broadcast receiver 的 intent filter
是使用 Context.registerReceiver()來動態設定的, 其 intent filter 也是在程式碼中建立的.)
一個 filter 有 action, data, category 等欄位. 一個隱式 intent 為了能被某個 intent filter 接受,
必須通過 3 個測試. 一個 intent 為了被某個元件接受, 則必須通過它所有的 intent filter 中
的一個.
Intent 傳遞資料時,可以傳遞哪些型別資料?
Intent 間傳送資料一般有兩種常用的辦法:
1.extra
2.data.
extra 可以用 Intent.putExtra 放入資料。新啟動的 Activity 可用 Intent.getExtras 取出來
Bundle, 然後用 Bundles.getLong, getInt, getBoolean, getString 等函式來取放進入的值。
而 data 則是傳輸 url。url 可以是指我們熟悉的 http, ftp 等網路地址, 也可以指 content
來指向 ContentProvider 提供的資源。Intent.setData 可以放入資料,Intent.getData 可以取
出資料。
說說 Activity,Intent,Service 是什麼關係 。
一個 Activity 通常是一個單獨的螢幕,每一個 Activity 都被實現為一個單獨的類,這些類都
是從 Activity 基類中繼承來的,Activity 類會顯示由檢視控制元件組成的使用者介面,並對檢視控
件的事件做出響應。
Intent 的呼叫是用來進行架構螢幕之間的切換的。Intent 是描述應用想要做什麼。Intent 數
據結構中兩個最重要的部分是動作和動作對應的資料,一個動作對應一個動作資料。
Android Service 是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序,也可以
執行在其他應用程式程序的上下文裡。需要通過某一個 Activity 或者其他 Context 物件來調
用。
Activity 跳轉到 Activity,Activity 啟動 Service,Service 開啟 Activity 都需要 Intent 表明跳轉
的意圖,以及傳遞引數,Intent 是這些元件間訊號傳遞的承載者。
請描述一下 Broadcast Receiver。
Broadcast Receiver 用於接收並處理廣播通知(broadcast announcements)。多數的廣播是
系統發起的,如地域變換、電量不足、來電來信等。程式也可以播放一個廣播。程式可以有
任意數量的 broadcast receivers 來響應它覺得重要的通知。broadcast receiver 可以通過多
種方式通知使用者:啟動 activity、使用 NotificationManager、開啟背景燈、振動裝置、播放
聲音等,最典型的是在狀態列顯示一個圖示,這樣使用者就可以點它開啟看通知內容。通常我
們的某個應用或系統本身在某些事件(電池電量不足、來電來簡訊)來臨時會廣播一個 Intent
出去,我們可以利用註冊一個 Broadcast Receiver 來監聽到這些 Intent 並獲取 Intent 中的
資料。
在 manifest 和程式碼中如何註冊和使 用 broadcast receiver 。
1)在 AndroidManifest.xml 中註冊