Android開發入門要點記錄:四大組件


     cocos2dx跨平台開發中需要了解android開發,昨天快速的瀏覽了一本Android開發入門教程,因為之前也似懂非懂的寫過Activity,Intent,XML文件,還有里面許多控件甚至編程思想都能在IOS中找到影子,所以看起來並不吃力,只求以后看見Android程序能看懂,現在記錄下一些要點心得。

提到Android開發,當然要先搞明白它的四大組件分別代表什么,起什么作用:

(1)活動(Activity)
活動是最基本的
Android 應用程序組件,在應用程序中,一個活動通常就是一個單獨的用戶界面。每一個

活動都被實現為一個獨立的類,並且從活動(Activity)基類中繼承而來,活動類將會顯示由視圖(View)控 件組成的用戶接口,並對事件(Event)做出響應。大多數的應用程序都會有多個用戶界面,因此便會有多個相 應的活動。

Android 的一個活動一般對應界面中的一個屏幕顯示,可以理解成一個界面,每一個活動在界面上可以包 含按鈕、文本框等多種可視的 UI 元素。

 

 

                                           1 活動(Activity)的生命周期    

(2)廣播接收器(BroadcastReceiver)

  廣播接收器用於讓應用程序對一個外部事件做出響應。例如:電話呼入事件、數據網絡可用通知或者到了
晚上時進行通知。

廣播接收器的生命周期

廣播接收器有一個單一的回調方法 onReceive(),當廣播消息到達接收器時,Android 將調用這個方法,並 傳遞給包含在這個消息中的 Intent 對象。

廣播接收器只有在這個方法的執行過程中才處於活動狀態,當 onReceive()返回后,廣播接收器將不再處於 活動狀態。廣播接收器的功能類似於一個回調函數,只是單次運行時處於活動狀態。 

 
         

(3)服務(Service)

  一個服務是一個具有一段較長生命周期但沒有用戶界面的程序。例如:一個正在從播放列表中播放歌曲的
媒體播放器在后台運行。

2 服務(Service)的生命周期    

使用 StartService 運行服務的情景:使用這種方法啟動服務,服務的 onCreate()和 onStart()這兩個方法將被 調用,服務會在后台運行直到退出,退出時將調用 onDestroy()方法。

使用 bindService 運行服務的情景:使用這種方法啟動服務,調用者(也就是服務的客戶端)將獲得和服務 交互的類,通過其調用時服務的相關內容會處於活動狀態。

 

(4)內容提供者(Content Provider)

應用程序能夠將它們的數據保存到文件或 SQLite 數據庫中,甚至是任何有效的設備中。當需要將數據與其 他的應用共享時,內容提供者將會很有用。一個內容提供者類實現了一組標准的方法,從而能夠讓其他應用程序 保存或讀取此內容提供者處理的各種數據類型。 

(5)Intent

在一般情況下,Android 的每一個屏幕基本上就是一個活動(Activity),屏幕之間的切換實際上就是在活動間互 相調用的過程,Android 使用 Intent 完成這個動作。page62image46144Android 屏幕跳轉的關系和方式如下圖所示:

page62image6800
page62image7080
page62image7912
page62image8192
page62image8472
page62image8752
page62image9032
page62image9312
page62image9592
page62image9872
page62image10152
page62image10432
page62image10712
page62image10992
page62image11272
page62image11552
page62image11832
page62image12112
page62image12392
page62image12672
page62image12952
page62image13232
page62image13512
page62image14064
page62image14344
page62image14624
page62image14904
page62image15184
page62image15464
page62image15744
page62image16024
page62image16304
page62image16584
page62image16864
page62image17144
page62image17424
page62image17704
page62image17984
page62image18264
page62image18544
page62image18824
page62image19104
page62image19384
page62image19664
                                                    圖 屏幕跳轉的方式    

事實上,在 Android 中,屏幕使用一個活動來實現,屏幕之間是相互獨立的,屏幕之間的跳轉關系通過 Intent 來實現。 

實例:本示例是一個簡單的屏幕之間的跳轉,從一個屏幕跳轉到另一個屏幕,在啟動第二個屏幕后,前一個屏幕消失。   

布局資源代碼:forward_target.xml 和 forwarding.xml    

本示例包含了兩個活動,在 UI 上它們就是兩個屏幕,分別為跳轉的源和目的,因此在 AndroidManifest.xml 中 分別定義。 

page62image21936
page62image22216
page62image22496
page62image22776
page62image23056
page62image23336
page62image23616
page62image23896
page62image24176
page62image24456
page62image24736
page62image25016
page62image25296
page62image25576
page62image25856
page62image26136
page62image26416
page62image26696
page62image26976
page62image27256
注:上面兩個圖 是一個文件,由於截圖原因         
page62image27808
page62image28088
page62image28368
page62image28648
page62image28928
page62image29208
page62image29488
page62image29768
page62image30048
page62image30328
page62image30608
page62image30888
page62image31168
page62image31448
page62image31728
page62image32008
page62image32288
page62image32568
page62image32848
page62image33128
page62image33408
page62image33688

兩個活動的名稱分別為 Forwarding ForwardTarget,由於第二個活動沒有 intent-filter,因此在程序中只能由第 一個活動來啟動。 

Forward 程序的運行結果如圖所示:    

 

page62image34240
page62image34520
page62image34800
page62image35080
page62image35360
page62image35640
page62image35920
page62image36200
page62image36480
page62image36760
page62image37040
page62image37320
page62image37600
page62image37880
page62image38160
page62image38440
page62image38720
page62image39000
page62image39280
page62image39560
page62image39840
page62image40120
page62image40672
page62image40952
page62image41232
page62image41512
page62image41792
page62image42072
page62image42352
page62image42632
page62image42912
page62image43192
page62image43472
page62image43752
page62image44032
page62image44312
page62image44592
page62image44872
page62image45152
page62image45432

點擊“Go”按鈕從 Forward 跳轉到 ForwardTarget,這個內容在 Java 源文件 Forward.java 的以下片段中處理:    
 

啟動第二個活動需要使用 Intent,在其 setClass()函數中設置源和返回的內容,Intent android.content 包中的類, 用於啟動活動、服務或者消息接收器。

這里使用的 Intent setClass()的方法的原型如下所示: 

第一個參數是當前的上下文類型 Context,因此把當前的活動設置過去即可(Activity 本身繼承了 Context),第 二個是 Intent 所包含的 JAVA 類,直接設置 ForwardTarget.class 類即可。 

     本例中使用了 finish()函數表示當前的活動結束,這樣在第二個活動(ForwardTarget)啟動時,第一個活動 (Forward)已經不存在了。如果沒有調用 finish()函數,第二個活動啟動時,第一個活動就處於 OnPause 狀態,當第二個活動退出后,第一個活動重新出現,也就是會調用活動的 onResume()函數。 

 

 

應用程序包含的各個文件   

1.Android.mk:統一工程文件,在SDK開發中可以不需要;

2.AndroidManifest.xml:工程描述文件,在其中定義了各種組件;

AndroidManifest.xml 文件是這個 Android 應用程序的工程描述文件,包含了宏觀上的內容,如下所示:    

注解:

1.xmlns:xmlns是XML Namespaces的縮寫,中文名稱是XML命名空間。

XML 命名空間屬性被放置於元素的開始標簽之中,並使用以下的語法:
xmlns:namespace-prefix="namespaceURI"。
當命名空間被定義在元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
注釋:用於標示命名空間的地址不會被解析器用於查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為 指針來使用命名空間指向實際存在的網頁,這個網頁包含關於命名空間的信息
2.intent-filter
當Intent在組件間傳遞時,組件如果想告知Android系統自己能夠響應和處理哪些Intent,那么就需要用到IntentFilter對象。
顧名思義,IntentFilter對象負責過濾掉組件無法響應和處理的Intent,只將自己關心的Intent接收進來進行處理。
 

3.android:layout_gravity(布局-重力)屬性,其實就是當前view相對於父視圖的位置

android:layout_gravity 可以在各個 View 中使用:top、bottom、left、right、 center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical、clip_horizontal,這些選項 用於處理豎直和水平方向的對齊方式。 

application(表示應用程序)標簽中包含了一個 activity(表示活動)。活動是應用程序中的一個組件,一個應用 程序中也可以包含若干個組件。包名定義為 com.example. android.helloactivity,表示將從 src 目錄的 com/example/android/helloactivity 中尋找程序中的 Java 源代碼。活動名稱將被定義為 HelloActivity,表示活動的 代碼是上述源代碼目錄中的HelloActivity.java文件。intent-filter中的內容指定了程序的啟動方式,這里category 中的 android.intent.category.LAUNCHER 表示活動將在 Android 的桌面(Android 默認的桌面程序名稱也是 LAUNCHER)上出現。

這里指定 application android:label 為"Hello,Activity!",這和桌面圖標下面的文字以及活動啟動后上面的 標題文字是一致的。本例沒有指定圖標,所以桌面上的圖標使用的是默認圖標。

page42image11200
page42image11480
page42image11760
page42image12040
page42image12320
page42image12600
page42image12880
page42image13160
page42image13440
page42image13720
page42image14000
page42image14280
page42image14560
page42image14840
page42image15120
page42image15400
page42image15680
page42image15960
page42image16240
page42image16520
page42image16800
page42image17080
page42image17360
page42image17640
page42image17920
page42image18200
page42image18480
page42image18760
page42image19040
page42image19320
page42image19600
page42image19880
page42image20160
page42image20440
page42image20720
page42image21000
page42image21280
page42image21560
page42image21840
page42image22120
page42image22400
page42image22680
page42image22960
page42image23240
page42image23520
page42image23800
page42image24080
page42image24360
page42image24640
page42image24920
page42image25200
page42image25480
page42image25760
page42image26040
page42image26320
page42image26600
page42image26880
page42image27160
page42image27440
page42image27720
page42image28000
page42image28280
page42image28560
page42image28840
page42image29120
page42image29400
page42image29680
page42image29960
page42image30240
page42image30520
page42image30800
page42image31080
page42image31360
page42image31640
page42image31920
page42image32200
page42image32480
page42image32760
page42image33040
page42image33320
page42image33600
page42image33880
page42image34160
page42image34440
page42image34720
page42image35000
page42image35280
page42image35560
page42image35840
page42image36120
page42image36400
page42image36680
page42image36960
page42image37240
page42image37520
page42image37800
page42image38080
page42image38360
page42image38640
page42image38920
page42image39200
page42image39480
page42image39760
page42image40040
page42image40320
page42image40600
page42image40880
page42image41160
page42image41440
page42image41720
page42image42000
page42image42280
page42image42560
page42image42840
page42image43120
page42image43400
page42image43680
page42image43960
page42image44240
page42image44520
page42image44800
page42image45080
page42image45360
page42image45640
page42image45920
page42image46200
page42image46480
page42image46760
page42image47040
page42image47320
page42image47600
page42image47880
page42image48160
page42image48440
page42image48720
page42image49000
page42image49280
page42image49560
page42image49840
page42image50120
page42image50400
page42image50680
page42image50960
page42image51240
page42image51520
page42image51800
page42image52080
page42image52360
page42image52640
page42image52920
page42image53200
page42image53480
page42image53760
page42image54040
page42image54320
page42image54600
page42image54880
page42image55160
page42image55440
page42image55720
page42image56000
page42image56280
page42image56560
page42image56840
page42image57120
page42image57400
page42image57680
page42image57960
page42image58240
page42image58520
page42image58800
page42image59080
page42image59360
page42image59640
page42image59920
page42image60200
page42image60480
page42image60760
page42image61040
page42image61320
page42image61600
page42image61880
page42image62160
page42image62440
page42image62720
page42image63000
page42image63280
page42image63560
page42image63840
page42image64120
page42image64400
page42image64680
page42image64960
page42image65240
page42image65520
page42image65800
page42image66080
page42image66360
page42image66640
page42image66920
page42image67200
page42image67480
page42image67760
page42image68040
page42image68320
page42image68600
page42image68880
page42image69160
page42image69440
page42image69720
page42image70000
page42image70280
page42image70560
page42image70840
page42image71120
page42image71400
page42image71680
page42image72800
page42image73080
page42image73360

AndroidManifest.xml 文件中為一個活動指定 label(標簽)和 icon(圖標)的方法 方法如下:

android:label 指定為字符串、android:icon 指定為圖標后,將使用 res/drawable 中對應名稱的圖片文件作為圖 標(本例中將使用 icon_name.png)。

activity application 都具有 android:label android:icon 等屬性,由於活動是程序的單元,且應用可以包 含多個活動,因此程序首先將使用 activity 中的這些標簽,如果沒有則使用上一級的 application 中標簽的定義 


3.Java源代碼:按照Java包的方式來組織目錄結構,包括各個Java類的源代碼;

這里的類 HelloActivity 繼承實現了 Android 系統 API 提供的活動類(Activity),使用 setContentView(R.layout.hello_activity)指定了當前活動的布局,這里表示將從 res/layout 目錄中找到 hello_activity.xml 文件作為本例的布局文件使用。 


4.資源文件:包含XML文件、圖片、原始數據文件等,其中表示界面情況的布局(Layout)文件比較重要。 

hello_activity.xml 是本程序中的布局文件,在 Java 源文件中使用了此文件。本文件在 res/layout 目錄中,其

內容如下所示: 

在這個布局文件中,只定義了一個 UI 元素——EditText,就是在界面上出現的占據全屏的可編輯文本框。 在這里定義了這個可編輯文本框的初始化字符串為"@string/hello_activity_text_text",這個值在另外的資源文件 中被定義,本例就是 string.xml。 

string.xml 是本例中的一個資源文件,其內容如下所示:    

這里定義了名稱為“hello_activity_text_text”的字符串的內容為 Hello,World!,這就是出現在屏幕上的字 符串。 

HelloActivity 的運行情況    

 

下面再來個實例,加深理解

Android 中,在處理 UI 中的各種元素的時候,兩個程序中的要點為: 得到布局文件(XML)中的控件句柄
設置控件的行為

本小節介紹在 Android 中幾種基本的程序控制方法,要獲得的效果是通過 2 個按鈕來控制一個文本框的背 景顏色,其運行結果如圖所示: 

本例構建一個應用程序,其在 AndroidManifest.xml 描述文件中的內容如下所示:    
本例定義了一個 Android 中基本的活動。    
 
布局文件(layout)的代碼片段如下所示:   

根據以上的布局文件中定義的兩個按鈕和一個文本框,這個布局文件被活動設置為 View 后,顯示的內容就如上 圖所示,只是行為還沒有實現。 

行為將在源代碼文件 TestEvent1.java 中實現,這部分的代碼如下所示:    

在創建的過程中,通過 findViewById 獲得各個屏幕上面的控件(控件)的背景,這里使用的 R.id.button1 等和 布局文件中各個元素的 id 是對應的。實際上,在布局文件中,各個控件即使不寫 android:id 這一項也可以正常顯示, 但是如果需要在代碼中進行控制,則必須設置這一項。 

根據 Button 控件的 setOnClickListener()設置了其中的點擊行為,這個方法的參數實際上是一個 View.OnClickListener 類型的接口,這個接口需要被實現才能夠使用,因此在本例的設置中,實現了其中的 onClick() 函數。這樣既可實現點擊的時候實現相應的功能,在點擊的函數中,將通過 Text 的句柄對其進行控制。 

Android 的控件使用方面,這兩個編程方面要點是:

使用findViewById()獲取布局文件(XML)中控件的句柄;
使用setOnXXXListener()設置事件處理函數。 在獲取句柄時需要轉換成相應的控件類型,findViewById()函數的參數是一個整數,返回值是一個

android.view.View 類型。通過 R.id.XXX 找到布局文件中定義的 ID,然后通過將基礎類轉換成其實際的類獲得真正的 句柄。注意:所轉換類必須和布局文件中描述的控件一致。 

SetOnXXXListener()等函數是 android.view.View 類的函數,各種控件(包括 Button、EditText)都擴展這個類, 同族的函數包括: 

這些函數用於事件處理,它們由程序實現,通過設置這些內容也就設置了控件的行為。這些函數的參數都是所 對應的 android.view.View 類中的方法。 

Android UI 基本控制內容:使用 findViewById()聯系布局文件中控件和句柄,並通過 OnClickListener()等定制 句柄的行為。 

 

最后還要提一下視圖組(ViewGroup)和布局(Layout)的使用 

在屏幕中控件的組織上,可以將各個視圖(控件)組成一個視圖組(ViewGroup),視圖組是一個包含了 其他視圖的視圖。 

android.view.ViewGroup 擴展了 android.view.View,它本身也具有 View 的特性,區別僅在於它可以包含其 他的控件。 

ViewGroup 視圖組具有一系列的擴展者:AdapterView、AbsoluteLayout、FrameLayout、LinearLayout、 RelativeLayout、AdapterView<T extends android.widget.Adapter>。

Android GUI 程序的屏幕體系結構的組織遵循以下原則: 一個屏幕可以包含一個視圖;
視圖組本身也是一個視圖;
視圖組可以包含若干個視圖。

Android 視圖和視圖組的關系如圖所示: 

如圖所示,外部最大的框表示整個屏幕,其中包含一個視圖組 ViewGroup0,ViewGroup0 包含 3 個子視圖, 即 View1、ViewGroup1、ViewGroup2。ViewGroup1 本身也是視圖組,以水平布局的方式包含了 View2 View3; ViewGroup2 本身也是視圖組,以垂直的方式包含了 View4、ViewGroup3 ViewGroup4;ViewGroup4 本身也 是視圖組,以水平布局的方式包含了 View5 View6。 

 

布局(Layout)

布局(Layout)是各個控件在屏幕上的位置關系,視圖組的幾個擴展類與布局相關。在 Android 中布局通常有以 下幾種不同的情況:

FrameLayout(框架布局):系統默認的在屏幕上就有空白區顯示它;
LinearLayout(線性布局):讓所有的子視圖都成為單一的方向,即垂直的或者水平的; AbsoluteLayout(絕對布局):讓子視圖使用x/y坐標確定在屏幕上的位置;
RelativeLayout(相對布局):讓子視圖的位置和其他的視圖相關;
TableLayout(表單布局):位置是它的子視圖的行或列。

FrameLayout、LinearLayout、RelativeLayout、AbsoluteLayout、TableLayout 都是擴展了 ViewGroup 的類,因此 這些視圖可以用於包含其他的控件,並可以控制其他的控件的位置關系。

布局的內容一般通過在布局文件中控制即可,在控制布局時 android:layout_width android:layout_height 等表示 尺寸屬性,除了使用實際的尺寸值外,還有兩個常用的選項:

"fill_parent":表示能填滿父視圖的最大尺寸;

"wrap_content":表示僅包裹子內容的最小尺寸。 這兩個值既可以在視圖組中使用,也可以在普通視圖中使用,如果在視圖中使用"wrap_content",表示包裹其中

的內容,例如按鈕需要包裹上面的文字。 

由於Layout是視圖組的子類,所以實際應用中通常都是使用Layout控制一組視圖

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM