格式化

廣告

廣告2

2012年11月15日 星期四

[Android基本概念] 了解Android四大組件功能

了解Android四大組件功能



Activity

了解android最基本知道4個"大人物",完整吃透這4個你就成功了一大半了那麼是哪4個呢它們是Activity,Service,BroadCast Receiver,Content Proivder這些分別對應著界面(UI)服務廣播接收器內容接收器以上這些組件大概都是面試必問的那麼先從Activity開始 

什麼是Activity?
Activity中文意思是「活動」,在android系統中意思是就是一個「界面」,每一個界面都需要繼承Activity,用SetContentView方法去加載佈局文件,也可以設定主題如漂浮式,對話框式等,它的回調函數特別多,幾乎每一個Activity都要和使用者互動,不
互動就不是好的Activity

Activity之間通訊
Activity之間通訊包括兩種,一種是資料傳遞,第二種跳轉到另一個Activity,這兩種需要另一個傢伙Intent本來意思目的不僅能啟動Activity還能啟動服務廣播。跳轉到另一個Activity就是實體化Intent
對象,參數里放當前Activity,this,目標Activity,class。This和class順序不能顛倒。傳遞資料是呼叫putExera方法參數是鍵,值,在前一個傳遞是int類型,接收也要int 類型,如getintent,String類型也是如此。否則報空指針異常。接收時用一個叫Bundle來接收那個值

Activity 的Intent Filter(Intent的過濾器)
Intent Filter 描述了一個組件願意接收什麼樣的Intent 對象,Android 將其抽象為android,content,IntentFilter 類。在Android 的AndroidManifest,xml 組態文件中可以通過節點為一個Activity 指定其Intent Filter,以便告訴系統該Activity 可以響應什麼類型的Intent。當使用startActivity(intent) 來啟動另外一個Activity 時,如果直接指定intent 對象的Component 屬性,那麼Activity Manager 將試圖啟動其Component 屬性指定的Activity。否則Android 將通過Intent 的其它屬性從安裝在系統中的所有Activity 中查找與之最匹配的一個啟動,如果沒有找到合適的Activity,應用程序會得到一個系統拋出的異常。這個往往就是新建項目取消自動建立avtivity忘記了的原因。其實自動建立Activity可以省去不必要的麻煩


Service

大概敘述
Service意思地球人都知道,就是服務嘛。其實我認為服務比Activity還要高級。服務是一直常駐在後台。你是看不到它的,因為它是不可見的。你非要看見它用別的代替吧。什麼時候才用到它呢?其實有些操作太複雜了,可以交給服務去做,如播放音樂,後台下載。我們可以看到瀏覽器UC瀏覽器下載操作是交給服務,至於進度在通知欄顯示,播放音樂也是一樣。怎麼播放,如開始播放,暫停,停止播放,上,下一首。這些操作扔後台最大好處在於,在Activity播放無意退出了音樂會停止。這對一邊音樂一邊在手機干其他事情來說就是不好的。所以,交給服務,就算關閉Activity人家還是照樣歌還是能放對吧。
 

生命週期
Service也有生命週期的,最初建立的OnCreate,只呼叫一次。然後OnStart,更新到android4.1時把OnStart方法給刪除了。只能StartCmmand方法以及OnDestroy,當我們第一次啟動Service時,先後呼叫了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這裡需要注意的是,如果Service已經啟動了,當我們再次啟動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法
 

Service與Activity通訊
Service後端的資料最終還是要呈現在前端Activity之上的,因為啟動Service時,系統會重新開啟一個新的進程,這就涉及到不同進程間通訊的問題了(AIDL ),當我們想獲取啟動的Service實體時,我們可以用到bindService和onBindService方法,它們分別執行了Service中IBinder()和onUnbind()方法。 Service啟動方式: context,startService() context,bindService(); 使用Service之前必須在androidMainfest.xml中註冊。



BroadCastReceiver

什麼是廣播
廣播是一種廣泛運用的在應用程序之間傳輸訊息的機制。
每當有簡訊、來電、電池電量過低等事件,Android系統都會發送廣播,所以程式設計師藉由
BroadcastReceiver就可以接收這些廣播訊息。而BroadcastReceiver是對發送出來的廣播進行過濾接收並響應的一類組件;來自普通應用程序,如一個應用程序通知其他應用程序某些資料已經下載完畢。BroadcastReceiver自身並不實現圖形使用者界面,但是當它收到某個通知後, BroadcastReceiver可以啟動Activity作為響應,或者可以通過NotificationMananger提醒使用者,或者啟動Service 等等。 

生命週期
廣播當中一個OnReceiver方法,生命週期10秒,超過10秒沒有完成任務,就會彈出異常,但在10秒內沒有執行完畢,就會彈出ANR異常。也就是說廣播裡無法對UI耗時操作。


Content Provider

Content Provider是Android提供的第三方應用資料的訪問方案。在Android中,對資料的保護是很嚴密的,除了放在SD卡中的資料,一個應用所持有的資料庫、文件、等等內容,都是不允許其他直接訪問的。Andorid當然不會真的把每個應用都做成一座孤島,它為所有應用都準備了一扇窗,這就是Content Provider。應用想對外提供的資料,可以通過派生ContentProvider類, 封裝成一枚Content Provider,每個Content Provider都用一個uri作為獨立的標識,形如:content://com.xxxxx。所有東西看著像REST的樣子,但實際上,它比REST 更為靈活。和REST類似,uri也可以有兩種類型,一種是帶id的,另一種是列表的,但實現者不需要按照這個模式來做,給你id的uri你也可以返回列表類型的資料,只要呼叫者明白,就無妨,不用苛求所謂的REST。

另外,Content Provider不和REST一樣只有uri可用,還可以接受Projection,Selection,OrderBy等參數,這樣,就可以像資料庫那樣進行投影,選擇和排序。Content Provider屏蔽了內部資料的存儲細節,向外提供了上述統一的介面模型,這樣的抽象層次,大大簡化了上層應用的書寫,也對資料的整合提供了更方便的途徑。Content Provider內部,常用資料庫來實現,Android提供了強大的Sqlite支持,但很多時候,你也可以封裝文件或其他混合的資料。

在Android中,ContentResolver是用來發起Content Provider的定位和訪問的。不過它僅提供了同步訪問的Content Provider的介面。但通常,Content Provider需要訪問的可能是資料庫等大資料源,效率上不足夠快,會導致呼叫線程的擁塞。因此Android提供了一個AsyncQueryHandler(參見),幫助進行非同步訪問Content Provider。

在各大組件中,Service和Content Provider都是那種需要持續訪問的。Service如果是一個耗時的場景,往往會提供非同步訪問的介面,而Content Provider不論效率如何,都提供的是約定的同步訪問介面。

沒有留言 :