1. 程式人生 > >安卓面試及答案2

安卓面試及答案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 中註冊

2)在程式碼中註冊 1. IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和廣播 中 Intent 的 action 對應 2. MyBroadcastReceiver br = new MyBroadcastReceiver(); 3. registerReceiver(new MyBroadcastReceiver(), filter);  請介紹下 ContentProvider 是如何實現資料共享的。 ContentProvider 是通過提供 Uri 來實現資料共享  請介紹下 Android 的資料儲存方式。 Android 提供了 5 種方式儲存資料: 使用 SharedPreferences 儲存資料; 檔案儲存資料; SQLite 資料庫儲存資料; 使用 ContentProvider 儲存資料; 網路儲存資料;  為什麼要用 ContentProvider?它和 sql 的實現上有什麼差別? 使用 ContentProvider 可以將資料共享給其他應用,讓除本應用之外的應用也可以訪問本應 用的資料。它的底層是用 SQLite 資料庫實現的,所以其對資料做的各種操作都是以 Sql 實 現,只是在上層提供的是 Uri。  請介紹下 Android 中常用的五種佈局。 最常用的佈局方式為 LinearLayout、RelativeLayout、FrameLayout、TableLayout AbsoluteLayout。其中 LinearLayout 和 RelativeLayout 是最常用的方式,他們可以通過在 xml 配置檔案或者程式碼中進行佈局。 FrameLayout 最簡單的佈局方式,放置的控制元件都只能羅列到左上角,控制元件會有重疊,不能 進行復雜的佈局。 LinearLayou 可以通過 orientation 屬性設定線性排列的方向是垂直(vertical)還是縱向 (horizontal).每行或每列只有一個元素,可以進行復雜的佈局。 AbsoluteLayout 可以讓子元素指定準確的 x/y 座標值,並顯示在螢幕上。AbsoluteLayout 沒 有頁邊框,允許元素之間互相重疊(儘管不推薦)。他是絕對座標,所以在實際中不提倡使 用。 RelativeLayout 允許子元素指定他們相對於其它元素或父元素的位置(通過 ID 指定)。因 此,你可以以右對齊,或上下,或置於螢幕中央的形式來排列兩個元素。元素按順序排列, 因此如果第一個元素在螢幕的中央,那麼相對於這個元素的其它元素將以螢幕中央的相對位 置來排列。這個是相對於 AbsoluteLayout 的,採用的相對座標,所以在實際中比較常用。 TableLayout 將子元素的位置分配到行或列中。一個 TableLayout 由許多的 TableRow 組成, 每個 TableRow 都會定義一個 row 。TableLayout 容器不會顯示 row 、column 或 cell 的 邊框線。每個 row 擁有 0 個或多個的 cell ;和 html 中的 table 差不多。在實際中也經常使 用。 有的時候我們也會用到 GridView,就像我們手機螢幕上擺放的各個圖示應該就是用 GridView 排版的。 Padding 是文字相對於邊框,而 Margin 是邊框相對於父窗體。  談談 UI 中, Padding 和 Margin 有什麼區別? Padding 是文字相對於邊框,而 Margin 是邊框相對於父窗體。  widget 相對位置的完成在 antivity 的哪個生命週期階段實現。  請解釋下在單執行緒模型中 Message、Handler、Message Queue、Looper 之間的關係。  AIDL 的全稱是什麼?如何工作?能處理哪些型別的資料? AIDL 是一種介面定義語言,用於約束兩個程序間的通訊規則,供編譯器生成程式碼,實現 Android 裝置上的程序間通訊。 程序之間的通訊資訊首先會被轉換成 AIDL 協議訊息,然後傳送給對方,對方受到 AIDL 協 議訊息後再轉換成相應的物件。 AIDL 支援的型別包括 Java 基礎型別和 String,List,Map,CharSequence,如果使用自定 義型別,必須實現 Parcelable 介面。  請解釋下 Android 程式執行時許可權與檔案系統許可權的區別。 執行時 Dalvik( android 授權) 檔案系統 linux 核心授權  系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面? 在action 賦值為”android.intent.action.VIEW“ 時可接收如下scheme 為"http" 等等型別的 data 。所以突發奇想,啟動該程式後,指定 action 及 Uri ,即訪問指定網頁。  對多執行緒的運用和理解,及多執行緒之間 handle 的傳值。  對 android 虛擬機器的理解,包括記憶體管理機制垃圾回收機制。  Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什麼。  android 本身的一些限制,比如 apk 包大小限制,讀取大檔案時的時間限。  如何載入的音樂資訊,如何改善其效率。 Android 系統提供了 MediaScanner,MediaProvider,MediaStore 等介面,並且提供了一套 資料庫表格,通過 Content Provider 的方式提供給使用者。當手機開機或者有 SD 卡插拔等事 件發生時,系統將會自動掃描 SD 卡和手機記憶體上的媒體檔案,如 audio,video,圖片等, 將相應的資訊放到定義好的資料庫表格中。 改善效率可以從介面需要查詢必備資料,不需要的不進行查詢。  ListView 如何提高其效率? 使用分頁載入,不要一次性載入所有資料。  啟動應用後,改變系統語言,應用的語言會改變麼? 不會  啟動一個程式,可以主介面點選圖示進入,也可以從一個程式中跳轉過去,二者有什麼 區別? 從主介面啟動一個應用程式是通過快捷方式直接呼叫 mainActivity 啟動的,從其他應用程式 呼叫需要隱式的通過 Action 或者在 Intent 中需要使用 setClass(),且要寫明包路徑。  Android 程式與 Java 程式的區別? android 程式是 Java 編寫的,但程式使用的 android 開發的 API,就是 andriod 的庫。  Android 中 Task 任務棧的分配。  在 Android 中,怎麼節省記憶體的使用,怎麼主動回收記憶體?  不同工程中的方法是否可以相互呼叫?  在 Android 中是如何實現判斷區分通話記錄中的電話狀態,去電,來電、未接來電?  dvm 的程序和 Linux 的程序, 應用程式的程序是否為同一個概念 DVM 指 dalivk 的虛擬機器.每一個 Android 應用程式都在它自己的程序中執行,都擁有一個獨立 的 Dalvik 虛擬機器例項.而每一個 DVM 都是在 Linux 中的一個程序,所以說可以認為是同一個 概念.  sim 卡的 EF 檔案有何作用 SIM 卡的檔案系統有自己規範,主要是為了和手機通訊,SIM 卡本身可以有自己的操作系 統,EF 就是作儲存並和手機通訊用的。  如何判斷是否有 SD 卡? 在程式中訪問 SDCard,你需要申請訪問 SDCard 的許可權。 在 AndroidManifest.xml 中加入訪問 SDCard 的許可權如下: Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) Environment.getExternalStorageState()方法用於獲取 SDCard 的狀態,如果手機裝有 SDCard,並且可以進行讀寫,那麼方法返回的狀態等於 Environment.MEDIA_MOUNTED。  嵌入式作業系統記憶體管理有哪幾種, 各有何特性。  什麼是嵌入式實時作業系統, Android 作業系統屬於實時作業系統嗎?  一條最長的簡訊息約佔多少 byte?  Linux 中跨程序通訊的幾種方式 。  談談對 Android NDK 的理解。 Android NDK 是一套工具,允許 Android 應用開發者嵌入從 C、C++原始碼檔案編譯來的本 地機器程式碼到各自的應用軟體包中。  談談 Android 的優點和不足之處。  Android 系統中 GC 什麼情況下會出現記憶體洩露呢? 出現情況: 1. 資料庫的 cursor 沒有關閉 2.構造 adapter 時,沒有使用快取 contentview 衍生 listview 的優化問題-----減少建立 view 的物件,充分使用 contentview,可以使用一靜 態類來優化處理 getview 的過程/ 3.Bitmap 物件不使用時採用 recycle()釋放記憶體 4.activity 中的物件的生命週期大於 activity 除錯方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]  Android UI 中的 View 如何重新整理。 一般只是希望在 View 發生改變時對 UI 進行重繪。你只需在 Activity 中顯式地呼叫 View 對 象中的 invalidate()方法即可。系統會自動呼叫 View 的 onDraw()方法。  簡單描述下 Android 數字簽名。  什麼是 ANR 如何避免它?  android 中的動畫有哪幾類,它們的特點和區別是什麼? 兩種,一種是 Tween 動畫、還有一種是 Frame 動畫。Tween 動畫,這種實現方式可以使視 圖元件移動、放大、縮小以及產生透明度的變化;另一種 Frame 動畫,傳統的動畫方法, 通過順序的播放排列好的圖片來實現,類似電影。  handler 機制的原理。 Andriod 提供了 Handler 和 Looper 來滿足執行緒間的通訊.Handler 先進先出原則.Looper 類用 來管理特定執行緒內物件之間的訊息交換(Message Exchange). 1)Looper: 一個執行緒可以產生一個 Looper 物件,由它來管理此執行緒裡的 Message Queue(訊息佇列). 2)Handler:你可以構造 Handler 物件來與 Looper 溝通,以便 push 新訊息到 Message Queue 裡;或者接收 Looper 從 Message Queue 取出)所送來的訊息. android 中執行緒與執行緒,程序與程序之間如何通訊。 執行緒通訊使用 Handler,  說說 mvc 模式的原理,它在 android 中的運用。 MVC(Model_view_contraller)”模型_檢視_控制器”。 MVC 應用程式總是由這三個部分組成。 Event(事件)導致 Controller 改變 Model 或 View,或者同時改變兩者。只要 Controller 改變 了 Models 的資料或者屬性,所有依賴的 View 都會自動更新。類似的,只要 Contro Android 中各種介面的監聽操作就是 MVC 的應用。  android 中有哪幾種解析 xml 的類,官方推薦哪種?以及它們的原理和區別。 DOM 解析 優點: XML 樹在記憶體中完整儲存,因此可以直接修改其資料和結構。 2.可以通過該解析器隨時 訪問 XML 樹中的任何一個節點。 3.DOM 解析器的 API 在使用上也相對比較簡單。 缺點: 如果 XML 文件體積比較大時,將文件讀入記憶體是非常消耗系統資源的。 使用場景: DOM 是用與平臺和語言無關的方式表示 XML 文件的官方 W3C 標準。DOM 是以層次 結構組織的節點的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構 通常需要載入整個文件和構造層次結構,然後才能進行任何工作。DOM 是基於物件層次 結構的。 SAX 解析 優點: SAX 對記憶體的要求比較低,因為它讓開發人員自己來決定所要處理的標籤。特別是當開 發人員只需要處理文件中所包含的部分資料時,SAX 這種擴充套件能力得到了更好的體現。 缺點: 用 SAX 方式進行 XML 解析時,需要順序執行,所以很難訪問到同一文件中的不同資料。 此外,在基於該方式的解析編碼過程也相對複雜。 使用場景: 對於含有資料量十分巨大,而又不用對文件的所有資料進行遍歷或者分析的時候,使用 該方法十分有效。該方法不用將整個文件讀入記憶體,而只需讀取到程式所需的文件標籤 處即可。 Xmlpull 解析 android SDK 提供了 xmlpull api,xmlpull 和 sax 類似,是基於流(stream)操作檔案, 然後根據節點事件回撥開發者編寫的處理程式。因為是基於流的處理,因此 xmlpull 和 sax 都比較節約記憶體資源,不會象 dom 那樣要把所有節點以對橡樹的形式展現在記憶體中。 xmlpull 比 sax 更簡明,而且不需要掃描完整個流。  DDMS 與 TraceView 的區別? Traceview 是 android 平臺配備一個很好的效能分析的工具。它可以通過圖形化的方式讓我 們瞭解我們要跟蹤的程式的效能,並且能具體到 method。 http://wbdban.iteye.com/blog/564309 DDMS 為我們提供例如:為測試裝置截圖,針對特定的程序檢視正在執行的執行緒以及堆資訊、  res 目錄有預設幾項 resource。 6 項,drawable-hdpi,drawable-ldpi,drawable-mdpi,layout,values。  android 的哪個版本是一次重大的升級? 1、6 版本。 系統新功能 快速搜尋框(全域性搜尋) 新的攝像機和照相機 電池用量指示 Android Market(菜場)升級 新平臺的新技術 Android 1.6 升級 Linux 核心從 2.6.27 到 2.6.29. NotifactionManager 使用原理 1. 通過 getSystemService 方法獲得一個 NotificationManager 物件。 2. 建立一個 Notification 物件。每一個 Notification 對應一個 Notification 物件。在這 一步需要設定顯示在螢幕上方狀態列的通知訊息、通知訊息前方的影象資源 ID 和發出通知 的時間。一般為當前時間。 3. 由於 Notification 可以與應用程式脫離。也就是說,即使應用程式被關閉, Notification 仍然會顯示在狀態列 中。當應用程式再次啟動後,又可以重新控制這些 Notification。如清除或替換它們。因此,需要建立一個 PendingIntent 物件。該物件由 Android 系統負責維護,因此,在應用程式關閉後,該物件仍然不會被釋放。 4. 使用 Notification 類的 setLatestEventInfo 方法設定 Notification 的詳細資訊。 5. 使用 NotificationManager 類的 notify 方法顯示 Notification 訊息。在這一步需要指 定標識 Notification 的唯一 ID。這個 ID 必須相對於同一個 NotificationManager 物件是唯一 的,否則就會覆蓋相同 ID 的 Notificaiton。