編輯:關於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對象,這就是整棵樹的控制核心,所以的交互管理事件都由它來統一調度和分配,從而可以對整個視圖進行整體控制。
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。
第四章 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
進行軟件開發時,通常我們都喜歡使用較新版本的工具,但這裡我為什麼使用低版本的SDK來開發Android游戲呢?這裡介紹下原因: &nbs
1.Java JDK需要先說明下,OS X系統是自帶有Java JDK1.6的。不過這裡我安裝的是JDK7,下載地址:http://www.oracle.co
前言:最近准備研究一下圖片緩存框架,基於這個想法覺得還是先了解有關圖片緩存的基礎知識,今天重點學習一下Bitmap、BitmapFactory這兩個類。 Bit
一.概述先給大家看一下效果圖:點擊中間的顯示彈框按鈕,從底部彈出來一個對話框,用戶可以點擊拍照或者從相冊選擇進行相應的操作,下面看看怎麼實現。二.代碼實現主頁面布局文件,