編輯:關於android開發
作為一個有半年余Android Developing折騰經驗的Android Developer(為什麼不說“開發經驗”呢?因為我仔細想了想,我還沒有獨立地做出一個完善美觀且有使用價值的應用。),要系統地學習安卓平台的基本開發技能,那麼第一步,了解並熟識Android的基本世界觀,應該就是十分必要的了。以前這方面的知識體系不成系統,比較破碎零散,故借此文稍作整理。
我認為在進入任何一個比較復雜的知識技能體系之前,都需要先用基本世界觀來熱熱身。對於高中物理而言,初中數學物理知識就形成了基本世界觀;對於近體詩寫作而言,平水韻和對仗的修辭手法就是基本世界觀;而對於Android,基本世界觀則包括了Android系統的簡介、四大組件的含義、以及其他一些基本的開發邏輯。
Android(Android System),是一個基於Linux內核的開源移動操作系統,由Google旗下的Open Handset Alliance(OHA,開放手持設備聯盟)持續領導與開發,主要設計用於觸屏移動設備,如智能手機和平板電腦等。Android 1.0 beta於2007年11月5日問世,至於世界上第一部真正意義上使用Android操作系統的設備,則是2008年10月22日發布的HTC Dream。Android系統采用Linux宏內核,系統核心語言是C和C++,主要的編程開發語言是Java。截止2016年初,Android的最新版本是Android 6.0“Marshmallow”(棉花糖)。
Android系統執行於Linux kernel之上,但並不是GNU/Linux。實際上,Android大都並不支持GNU/Linux的一些功能。除了基於Linux的核心之外,則是中介層、數據庫元和用C/C++編寫的API以及應用程序框架。Android的系統架構如下圖所示——
可見,系統架構大致分為四層:Linux內核層,核心庫層(以及運行環境),應用框架層和應用層。
Linux內核層比較底層,通常也是對Developer隱藏的。
Android Runtime與Libraries層:
Android的應用程序通常以Java為基礎編寫,運行程序時,應用程序的代碼會被即時轉變為Dalvik dex-code(Dalvik Executable),然後Android操作系統通過使用即時編譯的Dalvik虛擬機來將其運行。也就是說,Android應用程序是運行在Dalvik虛擬機裡面的,並且每一個應用程序對應有一個單獨的Dalvik虛擬機實例(這也保證了如果一個Android應用程序進程意外中止,將不會影響到其它應用程序進程的正常運行。)。Dalvik Virtual Machine在某種角度上很像是JVM(至少我感覺如此),但實際上它們還是有不小的差異的。JVM是堆棧機器(基於Stack),但Dalvik VM是寄存器架構的機器。JVM執行class格式文件,而Dalvik VM執行dex格式文件。 Dalvik VM會通過執行dex碼文件來完成堆棧管理、線程管理、安全異常管理、垃圾回收等重要功能,這些也和JVM很像。
Android系統還會通過一些C/C++庫來支持我們使用的各個組件(包括OpenGL,SQLite,WebKit等一大堆神奇的引擎和庫),這些功能通過應用程序框架提供給開發者,這就是Libraries層。
Application Framework(應用框架)層: 應用框架層的意義在於,Android提供給開發者一個框架開發平台,開發者在遵循框架原則和邏輯的基礎上,對框架進行擴展從而開發出各式各樣的app應用。開發時也是通過這一層與底層進行交互,並構建更上一級的應用層。這一層包括了各式各樣的系統API,同時也可以應用JNI等技術。應用框架包括了Activity Manager,Window Manager,Content Provider,View System等重要組成部分,可以理解為開發者的一個工具箱。
應用層:這一層就是最為形象,和用戶直接接觸的層次了,包括電話,短信,郵件和各式各樣的實用APP、游戲等。
活動一般就是一個單獨的用戶界面的屏幕。例如,一個電子郵件應用中可能具有一個顯示新郵件列表的 Activity、一個用於撰寫新郵件的 Activity 以及一個用於閱讀郵件具體內容的 Activity。應用中的多個活動通過協作和聚合的方式形成一種有機的整體,完善用戶體驗,但每個活動都是獨立於其他活動而存在的。在這個邏輯上而言,其他某個應用將可以啟動電子郵件應用中的某一個活動,比如在相機應用在拍照後啟動撰寫新郵件的活動。
一個應用通常由多個彼此松散聯系的 Activity 組成。 一般會指定應用中的某個 Activity 為“主” Activity,即首次啟動應用時呈現給用戶的那個 Activity。Activity之間通過Intent組件進行通信。在開發時,每一個Activity都必須要在AndroidManifest.xml配置文件(即清單文件)中聲明,否則將無法識別也不執行該Activity。
關於Activity的生命周期:Activity 基本上以三種狀態存在,已繼續(運行中)、已暫停和已停止。關於活動的七種方法和生命周期詳解,可見下圖:
Activity的基本方法:
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
這些方法共同定義 Activity 的整個生命周期——可以通過實現這些方法監控 Activity 生命周期中的三個嵌套循環:
Activity 的整個生命周期發生在 onCreate() 調用與 onDestroy() 調用之間。 Activity 的可見生命周期發生在 onStart() 調用與 onStop() 調用之間。 Activity 的前台生命周期發生在 onResume() 調用與 onPause() 調用之間。服務是一種在後台運行的組件,用於執行長時間運行的操作或為遠程進程執行作業。服務不提供用戶界面。服務不影響其他活動與用戶的交互,如用戶在浏覽器中閱讀網頁時,另外一個程序的服務可以在後台播放歌曲。活動等其他組件可以啟動服務,讓其運行或與其綁定以便與其進行交互。
服務有兩種,啟動和綁定:
started:當應用組件(如 Activity)通過調用 startService() 啟動服務時,服務即處於“啟動”狀態。一旦啟動,服務即可在後台無限期運行,即使啟動服務的組件已被銷毀也不受影響。可見,當服務是started狀態時,其生命周期與啟動它的組件無關。 bound:當應用組件通過調用 bindService() 綁定到服務時,服務即處於“綁定”狀態。綁定服務提供了一個客戶端-服務器接口, 僅當與另一個應用組件綁定時,綁定服務才會運行。 調用者(如一個Activity)與服務綁定在了一起,調用者一旦退出,服務也就終止。多個組件可以同時綁定到該服務,但全部取消綁定後,該服務即會被銷毀。需要注意的是,服務也可以以兩種方式同時存在——問題的關鍵在於回調方法的具體實現。另外,和Activity一樣,在程序清單中需要聲明所有服務。
服務的生命周期較為簡單:
內容提供者管理一組可以共享的應用數據,也叫內容提供程序。其他應用可以通過內容提供程序查詢,甚至修改數據(如果內容提供程序允許)。 例如,Android 系統可提供管理用戶聯系人信息的內容提供程序。另外,內容提供程序也適用於讀取和寫入不共享的私有數據。它的好處是統一了數據訪問方式。Content Provider的主要用法是借助ContentResolver對象用作客戶端來與提供程序通信。
內容 URI 是用於在提供程序中標識數據的 URI。內容 URI 包括整個提供程序的符號名稱(其權限)和一個指向表的名稱(路徑)。這裡的URI以content://作為前綴,表示該數據由ContentProvider來管理。
廣播接收器是一種用於響應系統范圍廣播通知的組件。 許多廣播都是由系統發起的—例如電池電量不足。應用也可以發起廣播,如通知其他應用某些數據已下載至設備且可供給使用。應用可以使用它對外部事件進行過濾,只對感興趣的外部事件通知(如當電話呼入時,或者WIFI網絡可用時)進行接收並做出響應。
廣播接收器不會顯示用戶界面,但它們可以創建狀態欄通知,在發生廣播事件時提醒用戶。Broadcast receiver的注冊有兩種方法,分別是程序動態注冊和在AndroidManifest清單文件中進行靜態注冊。這個組件可以看做是一種程序間通信的“橋梁”。
按照官方文檔自誇的說法,Android系統設計的獨特之處在於,任何應用都可以啟動其他應用的組件。例如,如果想讓用戶使用設備的相機拍攝照片,很可能有另一個應用已經可以執行該操作,那麼這個應用就可以利用另外一個應用,而不是開發一個 Activity來自行拍攝照片。
當系統啟動某個組件時,會啟動該應用的進程(如果尚未運行),並實例化該組件所需的類。四種組件類型中的三種—Activity、服務和廣播接收器—通過名為Intent的異步消息進行啟動。Intent會在運行時將各個組件相互綁定(可以將 Intent視為請求操作的信使)。
在 Android 系統啟動應用組件之前,系統必須通過讀取應用的AndroidManifest.xml文件(“清單”文件)確認組件存在。應用必須在此文件中聲明其所有組件,該文件必須位於應用項目目錄的根目錄中。AndroidManifest文件中未進行聲明的活動、服務以及內容提供者將不為系統所見,從而也就不可用。
當然,清單文件還有別的重要作用,如:
確定應用需要的任何用戶權限,如互聯網訪問權限或對用戶聯系人的讀取權限。 根據應用使用的 API,聲明應用所需的最低API 級別(如6.0系統的API Level就是23,4.3版本則是18)。 聲明應用使用或需要的硬件和軟件功能,如相機、藍牙服務或多點觸摸屏幕。Android應用顯然並非只有代碼—它還需要與源代碼分離的資源,如圖像、音頻文件以及任何與應用的具體呈現有關的內容。對於每一項資源,SDK 構建工具都會定義一個唯一的整型 ID,利用它可以引用應用代碼或 XML 中定義的其他資源中的資源。各種資源理應放入項目 res/ 目錄的特定子目錄之下,常見的目錄有drawable, layout, mipmap, values等。
要入門Android開發,我個人認為需要做好的准備如下:
掌握Java語言,至少需要做到寫代碼不會有語法錯誤。 初步了解Android的世界觀,正如上文所述。 搭建開發環境,配置好JVM環境(以及JDK等Java環境),Android Studio(谷歌官方推薦的開發平台,已取代Eclipse), Android SDK(用於ADB,應用調試和API管理等)與Genymotion(目前流行的Android Virtual Device插件工具,勝於Android Studio自帶的AVD)。 學會有效地利用谷歌搜索和安卓官方網站。以上就是成為一個Android Developer所需的簡單准備條件,Android Developing本身是個復雜的體系,學習起來有不小的難度,需要耗費很多時間與精力,但是開發本身無論如何都是一件快樂而充滿成就感的事情。
如何避免TCP的TIME_WAIT狀態如何避免TCP的TIME_WAIT狀態——lvyilong316關於TCP連接的TIME-WAIT狀態,它是為何而生,存在的意義是什
Redhat下puppet集中配置管理一 puppet簡介puppet 是一個配置管理工具, 典型的, puppet 是一個 C/S 結構, 當然,這裡的 C 可以有很多
TabLayout和ViewPager簡單實現頁卡的滑動,tablayoutviewpager首先需要在當前的module中的build Gradle的 dependen
Android開發藝術探索學習筆記(三),android藝術探索第三章 View的事件體系 3.1 View基礎知識 3.1.1 什麼是view