Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 《Android 群英傳》 閱讀筆記 第一章~第三章

《Android 群英傳》 閱讀筆記 第一章~第三章

編輯:關於Android編程

第一章Android 體系與架構

底層通過最快的C語言保證效率,上層使用Java簡單、快速進行開發。

Android大致分為四層,Linux內核層,庫和運行時、Framwork層和應用層。Android的體系架構鼓勵系統組件重用,共享組件間的數據,並且定義組件間的訪問權限控制。

Linux層。包含了Android系統的核心服務,包括硬件驅動,進程管理、安全系統,等等。

Dalvik與ART。Dalvik包含了一整套的Android運行環境虛擬機。特點是運行時再編譯。Android 5.版本開始,ART模式已經取代了Dalvik,ART采用的是安裝時進行編譯,以後運行時就不用編譯了。

Framwork

Standard libraries 這裡包含的是Android中的一些標准庫,標准庫,就是在開發者在開源環境中可以使用的開發庫。

Application

1.3.1 Android四大組件如何協同工作

Activity作為人機交互的第一界面,負責向用戶展示信息和處理結果,而這些信息的來源,可以是通過資源獲取,也可以通過Content Provider來獲取其他應用的信息,或是Service從後台計算,下載、處理的結果,當然也可以是通過BroadCastReceiver獲取到的廣播信息。同時,Android系統還提供了一個信使——Intent,作為信息傳遞的載體。組件與組件之間通過Intent來通信、傳遞信息、交換數據、正是通過這樣一種方式,四大組件形成了各自獨立而又緊密聯系的關系,讓整個Android系統活了起來。

1.3.2 應用運行上下文對象

Android系統的上下文對象,即在Context中,為我們封裝了這樣一個語境。Activity,Service,Application都是繼承自Context。

1、創建Application

2、創建Activity

3、創建Service

不難發現,創建Context的時機就是在創建Context的實體類的時候。

1、當應用程序第一次啟動時,Android系統都會創建一個Application對象,同時創建Application Context,所有的組件都共同擁有這樣一個Context對象,這個應用上下文對象貫穿整個應用進程的生命周期,為應用全局提供了功能和環境支持。

2、創建Activity和Service組件時,系統也會給它們提供運行的上下文環境,即創建Activity實例,Service實例的Context對象。

對Makfile的解釋:一個像Android這樣的大型工程,它的源文件不計其數,不同的功能、模塊,按類型分別防止在不同的目錄中,這些模塊通常會有一個叫Makefile的文件來進行管理,它定義了一系列的規則來指定模塊,哪些文件需要編譯,以及這些文件該按照怎樣的順序去編譯。甚至,它還可以配置跟復雜的功能操作,比如定義編譯規則,打包規則等,因為makeFile就像一個shell腳本,不僅可以使用自己的語法,也能調用操作系統的命令。

Makefile最大的好處就是自動化編譯,同時還可以做到可控制的編譯。Android通過makefile來描述Android各個組件間的聯系並指導它們進行自動化編譯。

1.4.2 Android系統目錄

1、/system/app/

這裡面放的一些系統的App

2、/system/bin/

這裡面主要放的是Linux自帶的組件

3、/system/build.prop

這裡記錄的是系統的屬性信息

4、/system/fonts/

系統字體存放目錄root後可下載TTF格式字體替換原字體

5、/system/framework/

系統的核心文件、框架層

6、/system/lib/

存放幾乎所有的共享庫(。so)文件

7、/system/media/

該目錄是用來保存系統提示音,系統鈴聲。其中system/media/audio/目錄,這裡面保存著Android系統默認的鈴聲,alarms目錄是鬧鈴提醒,notification目錄是短信和提示音,ringtones目錄是來電鈴聲,而ui目錄則是一些界面音效。

8、/system/usr/

該目錄用來保存用戶的配置文件,如鍵盤布局、共享、時區文件等。

9、/data/app/

data目錄包含了用戶的大部分數據信息,其中,/data/app/這個目錄包含了用戶安裝的App或升級的App。

10、/data/data/

這個目錄應該是開發者訪問的最多的目錄了,這裡包含了App的數據信息,文件信息,數據庫信息等,以包名的方式來區分各個應用。

11、/data/system

這個目錄包含了手機的各項系統信息

12、/data/misc/

這個目錄保存了大部分的WIFI,VPN信息。

Android studio中的Project就相當於Eclipse裡面的Workspace,而Androidstudio中的Module就相當於Ecliose裡面的project就可以了。

Android studio 選擇editor標簽,在other中選擇勾選show quick doc on mouse move 選項。

在Editor標簽中選擇Code Completion選項,在Code Sensitive completion裡面選擇None,即提示不區分大小寫。

Android Build Tools是Android SDK的Build 工具,經常會有更新,建議保持最新,它對應著Gradle中Module下的Build.gradle文件中的buildToolVersion屬性。

/system/core/toolbox和\framework\base\cmds 就是我們所有ADB命令和Shell命令的來源了。

Android 控件結構

ViewGroup控件作為父控件可以包含多個View控件,並管理其包含的View控件。

通過ViewGroup,整個界面上的控件形成了一個樹形結構,上層控件負責下層子控件的測量與繪制,並傳遞交互事件。

通常在Activity中使用findViewbyId()方法,就是在控件樹中以樹的深度優先遍歷來查找對應元素。在每棵控件樹的頂部,都有一個ViewParent對象,這就是整棵樹的控制核心,所以的交互管理事件都由它來統一調度和分配,從而可以對整個視圖進行整體控制。

 

graphic

 

 

\

 

1、每個Activity都包含一個Window對象,在Android中Window對象通常由PhoneWindow來實現。

2、PhoneWindow將一個DecorView設置為整個應用窗口的根View

3、DecorView作為窗口界面的頂層視圖,封裝了一些窗口操作的通用方法。換句話說,DecorView將要顯示的具體內容呈現了PhoneWindow上。

4、這裡所有的View的監聽事件,都通過windowManagerService來進行接收,並通過Activity對象來回調響應的onClickListener。顯示上,它將屏幕分成兩部分,一個是TitileView,一個是ContentView。

第二層裝載一個LinearLayout,作為ViewGroup,這一層的布局結構會根據對應的參數設置不同的布局。

在代碼中,當程序在onCreate()方法中調用setContentView()方法後,ActivityManagerService會回調onResume()方法,此時系統才會把整個decorView添加到PhoneWindow中。並讓其顯示出來,從而最終完成界面的繪制。

3.2 View的測量

Android系統給我們提供了一個設計短小精悍卻功能強大的類——MeasureSpec類。MeasureSpec是一個32位的Int值,其中高2位為測量的模式,低30位為測量的大小。

測量模式分為三種:

1、EXACTLY。精確值模式

2、AT_MOST。即最大值模式。當控件屬性指定為wrap_content時,控件大小一般隨著控件的子控件或內容的變化而變化,此時控件的尺寸只要不超過父控件允許的最大尺寸即可。

3、UNSPEIFIED。不指定大小。通常在繪制自定義View時才會使用。

View類默認的onMeasure()方法只支持EXACTLY模式。控件可以響應你指定的具體寬高值或者match_parent屬性。

而如果讓自定義View支持wrap_content屬性,那麼就必須重寫onMeasure()方法來指定wrap_content時的大小。

3.3 View的繪制

當測量好一個View之後,我們就可以簡單地重寫onDraw()方法,並在canvas對象上來繪制所需要的圖形。

當創建一個Canvas對象時,為什麼要傳進去一個bitmap對象呢?傳進去的bitmap與通過這個bitmap創建的Canvas畫布是緊緊聯系在一起的,這個過程我們稱之為裝載畫布。這個bitmap用來存儲所有繪制在Canvas上的像素信息。

我們可以使用Canvas的繪制API,然後讓View重繪,從而顯示改變之後的bitmap。

3.4 ViewGroup測量

ViewGroup在測量時通過遍歷所有子View,從而調用子View的Measure方法獲得每一個子View的測量結果。

3.5ViewGroup的繪制

ViewGroup使用dispatchDraw()方法來繪制其子View,其過程同樣是通過遍歷所有子View,並調用子View的繪制方法來完成繪制工作。

3.6自定義View

在View中通常有以下一些比較重要的回調方法

1、onFinishInflate(),從xml加載組件後回調

2、onSizeChanged(),組件大小改變時回調

3、onMeasure();回調該方法進行測量

4、onLayout():回調該方法進行測量。

5、onTouchEvent():監聽到觸摸事件時回調。

通常有以下三種情況來實現自定義的控件

1、對現有控件進行拓展。

2、通過組合來實現新的控件

3、重寫View來實現全新的控件

3.6.1 對現有控件進行拓展

程序調用super.onDraw(canvas)方法來實現原生控件的功能,但是在調用super.onDraw()方法之前和之後,我們都可以實現自己的邏輯,分別在系統繪制文字前後,完成自己的操作。

//在回調父類方法前,實現自己的邏輯,對TextView來說即是在繪制文本內容前

super.onDraw(canvas)

//在回調父類方法後,實現自己的邏輯,對TextView來說即是在繪制文本內容後

3.6.2 創建復合控件

3.6.2.1 定義屬性

我們在代碼中通過標簽聲明了使用自定義屬性,並通過name屬性來確定引用的名稱。最後,通過標簽來聲明具體的自定義屬性,比如在這裡定義標題文字的字體,大小,顏色,並通過format屬性來指定屬性的類型。

在確定好屬性後,就可以創建一個自定義控件——TopBar,並讓它繼承自ViewGroup,從而組合一些需要的控件。

3.6.2.2組合控件

1、xmlns:android="http://schemas.android.com/apk/res/android"

這行代碼就是在指定引用的名字控件xmlns,即xml namespace。這裡指定了名字空間為”android“,因此在接下來使用系統屬性的時候,才可以用”android:“來引用Android的系統屬性。

2、xmlns:custom="http://schemas.android.com/apk/res-auto"

如果要使用自定義的屬性,那麼就需要創建自己的名字控件,在Android studio中,第三方控件都使用如下代碼來引入名字空間。

使用自定義的View與原生的View最大的區別就是在申明控件時,需要指定完整的報名,而在應用自定義的屬性時,需要使用自定義的xmlns名字。

3.6.3重寫View來實現全新的控件

3.7 自定義ViewGroup

ViewGroup存在的目的就是為了對其子View進行管理,為其子View添加顯示、響應的規則。自定義ViewGroup通常需要重寫onMeasure()方法來對子View進行測量,重寫onLayout()方法來確定子View的位置,重寫onTouchEvent()方法來增加響應事件。

3.8 事件攔截分析

觸摸事件就是捕獲觸摸屏幕後產生的事件。

當點擊一個按鈕,通常會產生兩個或三個事件。

1、按鈕按下,這是事件一

2、如果不小心滑動一點,這就是事件二

3、當手抬起,這是事件三。

我們的觸摸事件就是一個,到底該分給誰呢?同一個事件,子View和父ViewGroup都有可能想要進行處理,因此,這產生了事件攔截。

事件的傳遞順序是(InterceptTouchEvent):

總經理(MyViewGroupA)->部長(MyViewGroupB)->你(View)。事件傳遞的時候,先執行dispathchTouchEvent()方法,再執行onInterceptTouchEvent()方法。

事件的處理順序是:

你(View)->部長(MyViewGroupB)->總經理(MyViewGroupA)。事件處理都是執行onTouchEvent()方法。

事件傳遞的返回值非常容易理解:true,攔截,不繼續;False,不攔截,繼續流程。

事件處理的返回也類似:true,處理了,不用審核了;False,給上級處理。

初始情況下,返回值都是false。

 

graphic

 

 

graphic

 

第四章 ListView使用技巧

4.1 ListView常用優化技巧

4.1.1 使用ViewHolder模式提高效率

4.1.2 設置項目間分隔線

android:divider="android:color/darker_gray"

android :dividerHeight="10dp"

4.1.3 取消ListView的Item點擊效果

android :listSelector =#00000000

4.1.5 設置listView需要顯示在第幾項

listView.setSelection(N)

實現平移滑動

listview.smoothScrollBy(distance,duration)

listview.smoothScrollByOffset(offset)

listview.smoothScrollToPosition(index)

4.1.6 動態修改ListView

mData.add("new");

mAdapter.notifyDataSetChanged();

4.1.7 遍歷ListView中的所有item

for(int i=0;i

}

4.1.8 處理空ListView

當listView列表中無數據時,ListView不會顯示任何數據或提示,按照完善用戶體驗的需求,這裡應該給以無數據的提示。listView提高了一個方法:setEmptyView()。

當用戶沒有做手指拋動的狀態時,這個方法只會回調2次,否則會回調3次,差別就是手指拋動這個狀態。

通常情況下,我們會在這個方法中通過不同的狀態來設置一些標志Flag,來區分不同的滑動狀態,供其他方法處理。

4.2.1 具有彈性的ListView

listview中有一個控制滑動到邊緣的處理方法。overScrollBy方法。裡面有一個參數maxOverScrollBy,注釋中寫道,Number of piexls to overscroll by in either direction along the Y axis 。只要修改這個參數的值,就可以讓ListView具有彈性了。

4.2.2 自動顯示、隱藏布局的ListView

4.2.3 聊天ListView

4.2.4 動態改變ListView


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved