android開發技術

1.android框架、android系統啓動過程、binder框架、軟件開發架構、消息驅動模型java

             wKioL1Z-lTyySY4ZAAEarY2Zvdg346.jpg

wKiom1Z-lSaCtqL4AABvUn2VLJM745.png

            wKioL1Z-lT7A7GRlAAA-_jGg6OQ426.png

                       wKioL1Z-lY_RA5vlAAAihlRNtDY596.png

           wKiom1Z-lXiB3c0uAAA8hsqbYwo862.png

2.Activity、Service、ContentProvider、BraodcastReceiver和Intent   android

    四大組件的使用都必需要在AndroidManifest.xml配置文件中聲明,不然系統將不識別也不執行該組件。git

1)活動Activity
  (1)對Activity的理解:Android中的任務(activity棧)
(a)任務其實就是activity的棧,它由一個或多個Activity組成,共同完成一個完整的用戶體驗。棧底的是啓動整個任務的Activity,棧頂的是當前運行的用戶能夠交互的Activity,當一個activity啓動另一個的時候,新的activity就被壓入棧,併成爲當前運行的activity。而前一個activity仍保持在棧之中。當用戶按下BACK鍵的時候,當前activity出棧,而前一個恢復爲當前運行的activity。棧中保存的實際上是對象,棧中的Activity永遠不會重排,只會壓入或彈出。
(b)任務中的全部activity是做爲一個總體進行移動的。整個的任務(即activity棧)能夠移到前臺,或退至後臺。
(c)Android系統是一個多任務(Multi-Task)的操做系統,能夠在用手機聽音樂的同時,也執行其餘多個程序。每多執行一個應用程序,就會多耗費一些系統內存,當同時執行的程序過多,或是關閉的程序沒有正確釋放掉內存,系統就會以爲愈來愈慢,甚至不穩定。爲了解決這個問題,Android引入了一個新的機制,即生命週期(Life Cycle)。
web

 (2)Activity是一個組件,一個活動就是一個屏幕,它負責建立窗口容納視圖組件。每一個活動都繼承活動基類被實現爲一個獨立的類。活動類能夠顯示由多個視圖空間組成的用戶接口,並對事件作出響應。一個activity中一般包含多個widget,一個intent,一個佈局(xml或Java代碼實現),一個bundle。sql

 (3)Activity的生命週期:
數組

            wKioL1XzjyvQza1UAAFMtOlpi0o179.jpg

wKiom1Xzjf6w8v3IAAIlBF0qbxU918.jpg

    (4)Activity的啓動與中止:瀏覽器

           wKiom1Z-k86yFPW-AAAsM7cKKq0250.png

2)服務service
    服務在後臺運行,沒有界面,至關於activity啓動的守護進程。能夠被activity產生或激活,處理與當前activity生存期無關的事務。服務用於在後臺完戶指定的操做。網絡

 (1)從啓動和中止方式的角度,service分爲如下2種架構

(a)starte型:當應用程序組件(如activity)調用startService()方法啓動服務時,服務處於started狀態。該service的生命週期由本身決定。started service(啓動服務)是由其餘組件調用startService()方法啓動的,這致使服務的onStartCommand()方法被調用。當服務是started狀態時,其生命週期與啓動它的組件無關,而且能夠在後臺無限期運行,即便啓動服務的組件已經被銷燬。所以,服務須要在完成任務後調用stopSelf()方法中止,或者由其餘組件調用stopService()方法終止服務。app

(b)bind型:當應用程序組件調用bindService()方法綁定到服務時,服務處於bound狀態。使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦調用退出該activity,服務也就終止。該service的生命週期與當前組件的生命週期相同。調用者也可使用unbindservice()解除綁定終止service。

  (2)從做用範圍的角度,service類型分爲如下2種
    (1)本地服務:用於應用內部,實現應用程序本身的一些耗時任務。
    (2)遠程服務:用於應用程序之間,容許調用其餘應用程序的服務。
    service類派生了多種類型的服務:AbstractInputService AccessibilityService IntentService RecognitionService WallpaperService
  (3)Service的2個應用
    *做爲應用程序的一種設施,以一種與當前activity無關的方式啓動一段Java代碼。經過context.startService方法啓動Service,或經過context.stopService終止。
    *在應用程序之間提供交互功能:經過調用context.bindService方法啓動一個長期的Service。調用context.unbindService終止

    (4)服務的生命週期

              wKioL1XzmpuRa7fWAAF9SbMrBuY376.jpg     

  (4)Service的實現過程
    *建立Service:首先須要繼承Service類,而且覆蓋其中的onCreate,onStart, onDestroy方法
    *onCreate 中實現須要在後臺執行的代碼
    *onStart  intent數據一般都是傳遞給onstart
    *onDestroy 實現清除數據

    (5)Service的啓動與終止

       wKiom1Z-lFTxglRxAAAn_kJi4N8723.png

  3)BroadcastReceiver的實現方法

    (1)對廣播的理解

    BroadcastReceiver能夠對外部事件進行過濾,只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並作出響應。它們能夠啓動一個activity或serice來響應它們收到的信息,或者用NotificationManager來通知用戶。通知能夠用不少種方式來吸引用戶的注意力,例如閃動背燈、震動、播放聲音等。通常來講是在狀態欄上放一個持久的圖標,用戶能夠打開它並獲取消息;廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊;動態註冊廣播接收器特色是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔心廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器也是打開着的。也就是說哪怕app自己未啓動,該app訂閱的廣播在觸發時也會對它起做用。

    Broadcastreceive組件:繼承broadcastreceive類,實現onReceive()方法,提供了一種更加自由的使用intent和notification的方式,是intent的消費者並根據intent激發其它組件。Broadcastreceive生命週期只有十秒左右,若是在onReceive()內作超過十秒內的事情,就會報ANR(Application No Response) 程序無響應的錯誤信息,若是須要完成一項比較耗時的工做 , 應該經過發送 Intent 給 Service, 由Service 來完成。

    (2)廣播接收器分爲2種:與activity綁定的廣播接收器和做爲獨立組件的廣播接收器。

    (3)廣播的啓動和中止

         wKiom1Z-lLuw_5XvAAAgOcjMY6A247.png

  4)內容提供器ContentProvider
    ContentProvider提供了一種多應用間數據共享的機制以及數據存取的標準接口。Content Provider使一個應用程序的指定數據集提供給其餘應用程序。其餘應用能夠經過ContentResolver類從該內容提供者中獲取或存入數據;當在多個應用程序間共享數據時才須要內容提供者。例如,通信錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處是統一數據訪問方式;ContentProvider實現數據共享。ContentProvider用於保存和獲取數據,並使其對全部應用程序可見。這是不一樣應用程序間共享數據的惟一方式,由於android沒有提供全部應用共同訪問的公共存儲區;開發人員不會直接使用ContentProvider類的對象,大多數是經過ContentResolver對象實現對ContentProvider的操做;ContentProvider使用URI來惟一標識其數據集,這裏的URI以content://做爲前綴,表示該數據由ContentProvider來管理。

  5)意圖intent
    intent是一種運行時綁定機制, 是一種利用消息進行交互的機制。與intent有關的2個類是IntentFilter和IntentReceiver。Intent提供應用程序、activity和service三種之間的相互觸發和數據交互(運行時綁定)。intent描述了一次操做的動做、動做涉及的數據和附加數據,intent用於通知系統內核調用intent指定的應用。intent分紅2類:(1)顯式intent:顯式intent直接指定須要啓動的組件的名字來啓動activity、service或BroadcastReceiver。(2)隱式intent:隱式intent無需指定目標應用的名字,只需選擇性的指定Intent的Action、Data以或Category,則具備過濾這些Intent的4大組件就能被這些Intent激活。4大組件中Activity、BroadCastreceiver、service這3個都是經過intent被激活的。

    Android的核心Intent:鏈接4大組件的紐帶Intent是一種利用消息進行交互的機制。Intent對象描述了應用中一次操做的動做、涉及的數據和附加數據,FrameWork經過Intent的描述調用對應的用戶的應用、底層應用、service、activity或BroadcastReceiver。Intent提供了組件之間的延遲綁定機制。經過Intent調用底層應用必須設置底層應用許可。

    意圖用於激活各個組件及各個組件之間通訊,能夠攜帶數據。

wKiom1Xzl4vis9YdAAGa5yxPxEI527.jpg

                     wKiom1XzluzBJtaoAAFW1G8IMC4362.jpg  


3.資源管理器Res/Assets
    *在activity類中 Resource resmanage=this.getBaseContext().getResources(); Drawable pic1=resmanage.getDrawable(R.id.pic1); 能夠獲取到該圖片資源的引用

     經過Android應用程序資源的編譯和打包過程,最終獲得的應用程序資源就與應用程序代碼一塊兒打包在一個APK文件中。Android應用程序在運行的過程當中,是經過一個稱爲AssetManager的資源管理器來讀取打包在APK文件裏面的資源文件的。
     訪問app內部的資源:應用程序的每個Activity組件都關聯有一個ContextImpl對象,這個ContextImpl對象就是用來描述Activity組件的運行上下文環境的。Activity組件是從Context類繼承下來的,而ContextImpl一樣是從Context類繼承下來的。在Activity組件調用的大部分紅員函數都是轉發給與它所關聯的一個ContextImpl對象的對應的成員函數來處理的,其中就包括用來訪問應用程序資源的兩個成員函數getResources和getAssets。ContextImpl類的成員函數getResources返回的是一個Resources對象,有了這個Resources對象,就能夠經過資源ID來訪問那些被編譯過的應用程序資源。ContextImpl類的成員函數getAssets返回的是一個AssetManager對象,有了這個AssetManager對象,就能夠經過文件名來訪問那些被編譯過或者沒有被編譯過的應用程序資源文件。
    Resources類的實現:事實上,Resources類也是經過AssetManager類來訪問那些被編譯過的應用程序資源文件的,不過在訪問以前,它會先根據資源ID查找獲得對應的資源文件名。在Android系統中,一個進程是能夠同時加載多個應用程序的,也就是能夠同時加載多個APK文件。每個APK文件在進程中都對應有一個全局的Resourses對象以及一個全局的AssetManager對象。其中,這個全局的Resourses對象保存在一個對應的ContextImpl對象的成員變量mResources中,而這個全局的AssetManager對象保存在這個全局的Resourses對象的成員變量mAssets中。Resources類有一個成員函數getAssets,經過它就能夠得到保存在Resources類的成員變量mAssets中的AssetManager,例如,ContextImpl類的成員函數getAssets就是經過調用其成員變量mResources所指向的一個Resources對象的成員函數getAssets來得到一個能夠用來訪問應用程序的非編譯資源文件的AssetManager。

    訪問系統資源:Android應用程序除了要訪問本身的資源以外,還須要訪問系統的資源。系統的資源打包在/system/framework/framework-res.apk文件中,它在應用程序進程中是經過一個單獨的Resources對象和一個單獨的AssetManager對象來管理的。這個單獨的Resources對象就保存在Resources類的靜態成員變量mSystem中,咱們能夠經過Resources類的靜態成員函數getSystem就能夠得到這個Resources對象,而這個單獨的AssetManager對象就保存在AssetManager類的靜態成員變量sSystem中,能夠經過AssetManager類的靜態成員函數getSystem一樣能夠得到這個AssetManager對象。訪問該assets文件中的資源可使用「file:///android_asset/...」

4.Bundle類
    Bundle類型,至關於map,用於activity之間的數據傳遞。傳遞的數據能夠是boolean、byte、int、long、float、double、string等基本類型或它們對應的數組,也能夠是對象或對象數組。當Bundle傳遞的是對象或對象數組時,必須實現Serializable 或Parcelable接口。

5. View視圖類和Widget類及其事件監聽器類

     wKiom1XzjtSBVy5uAAIW5OZgCl4800.jpg    *View類是全部Widget類以及全部監聽器類的基類
    *Widget主要包括如下視圖:TextView文本框視圖 EditText編輯框視圖 Button CheckBox複選框視圖 RadioGroup Spinner下拉列表 AutoCompleteTextView自動完成文本框視圖 DatePicker日期選擇器視圖 TimePicker時間選擇器視圖 DigitalClock數字時鐘 AnalogClock表狀時鐘 ProcessBar進度條 RatingBar評分條 SeekBar拖動條 GridView網格視圖 ListView列表視圖 ScrollView滾動視圖 ImageView圖片視圖 Tab圖標切換視圖
    *TextView和ImageView的區別就是-TextView用於顯示文本而ImageView用於顯示圖片 ContextMenu菜單 OptionsMenu
    *每一種視圖都有本身的事件監聽器,當事件到來時將觸發回調函數。
    *菜單結構的設計有2種:Java代碼和XML。首先進行UI設計,經過@+id/xxx爲組件對應一個對象關鍵字。UI設計完以後,就產生了每一個組件對應的對象,可是在代碼裏還沒法引用該對象,由於沒有這些widget對象的引用,使用findViewById(R.id.xxx)能夠返回這些已佈局對象的引用。

    *鍵盤事件屬於activity的事件,能夠經過覆蓋onKeyUp()或onKeyDown()方法捕獲按鍵值

wKioL1XzlzmwV19_AAGpDJg9zUc317.jpg

wKiom1XzlQ-xuizaAAMpKz28TIc572.jpg


6.Android的通知:Notification和Toast

Notification:被用來通知用戶某個事件發生了,好比短信短信,顯示在當前activity的狀態欄中。該通知方式能夠綁定一個intent,當該通知被點擊時,將發送該intent。Notification容許設置標題,這樣能夠在「通知窗口」中瀏覽通知列表,當用戶點擊某個通知時,Notification設置的Intent就會觸發。
因此的Notification被NotificationManager系統服務管理,經過getSystemService(context.NOTIFICATION_SERVICE)得到NotificationManager對象,而後調用notify方法將Notification對象傳遞給用戶。
NotificationManager nm=(NotificationManager)this.getsystemservice(NOTIFICATION_SERVICE);
PendingIntent myintent=PendingIntent.getActivity(this,0,new Intent(this,Ex_81.class),0);/*生成通知的PendingIntent對象*/
Notification notifi=new Notification(drawable/*圖片*/,tickertext/*標題*/,system.currenttimemillis()/*發送時間*/);
notifi.setLatestEventInfo(this,title,content,myIntent);
nm.notify(R.layout.activy_notification,notifi);
/*刪除一個狀態欄中的通知*/
nm.cannel(R.layout.activy_notification);

Toast:懸浮於屏幕上,但不會得到焦點。不可以綁定事件。
調用方法簡單:直接使用靜態函數Toast.maketext(this,"...",Toast.LENGTH_LONG)
7.Android提供了4種持久數據存儲的方法
    *Preferences存儲數據:Preferences採用"鍵-值"對組織和管理數據,其數據存儲在XML文件中,適用於簡單數據存儲。能夠像bundle存取數據
    *文件存儲數據:從存儲量來看,文件存儲是一種"重量級"的存儲機制,它比Preferences方式更適合存儲較大的數據。
    *SQLite存儲數據:「重量級「存儲機制
    *ContentProvider存儲數據(非持久):應用程序之間惟一共享數據的途徑,主要用於存儲、檢索數據以及向其餘應用程序提供數據訪問的接口。能夠提供像sqlite同樣的數據訪問方式,能夠存儲非結構化數據。

8. android提供了3種網絡通訊方式
    *Webkit(android.webkit):瀏覽器引擎
    *HttpComponents
    *Socket(java.net.*)

九、雜項

(1) 全部的Android 應用進程都是由Zygote fork出來的。
(2) 組件管理:zygote進程->systemservice進程->AMS系統服務進程(activity manage service)--binder->四大組件

(3) App本質上是組件和資源的容器

(4) Context實現組件進程間的環境切換,activity和service以及application都是context的子類,容許他們直接從當前進程切換到下一個進程。

相關文章
相關標籤/搜索