量變產(chǎn)生質(zhì)變,如果你從第一篇一直看到了這篇,可以說(shuō)這就是你的質(zhì)變點(diǎn)之一。
回顧及展望
經(jīng)過(guò)數(shù)篇對(duì)Android應(yīng)用程序的原理的講述,現(xiàn)在我們大概回顧一下。
- 首先我們利用Hello World程序介紹了一個(gè) Android應(yīng)用程序的目錄結(jié)構(gòu) ,包括src文件夾、gen文件夾、Android x文件夾、assets文件夾、AndroidMainifest.xml、default.properties;
- 接下來(lái)我們又站在架構(gòu)的高度分析了一下 Android系統(tǒng)的主要組成部分 ,包括Linux Kernel、Android Runtime、Libraries、Application Framework、Application;
- 接下來(lái)我們又介紹了 Android應(yīng)用程序的運(yùn)行及應(yīng)用程序組件 ,包括活動(dòng)(Activities)、服務(wù)(Services)、廣播接收者(Broadcast receivers)、內(nèi)容提供者(Content providers)等內(nèi)容;
- 接著我們又介紹了 如何激活及關(guān)閉組件 ,還有簡(jiǎn)單的介紹了AndroidMainifest.xml、Intent及其過(guò)濾器(這兩者我們以后還要通過(guò)例子或者單獨(dú)開(kāi)篇深入分析);
- 接著我們站在Android應(yīng)用程序的角度分析 Android中活動(dòng)與任務(wù) ,包括活動(dòng)與任務(wù)概述、親和度和新任務(wù)(Affinities and new tasks)、啟動(dòng)模式(Launch modes)、清除棧(Clearing the stack)、啟動(dòng)任務(wù)(Starting tasks);
- 接著我們?cè)贏ndroid應(yīng)用程序運(yùn)行的角度,簡(jiǎn)單分析了 Android應(yīng)用程序的進(jìn)程與線程 ;
- 最后我們用分析了Android應(yīng)用程序組件的生命周期,包括 活動(dòng)的生命周期及他們可能的狀態(tài) 、 服務(wù)生命周期、廣播接收者生命周期 、 Android應(yīng)用程序進(jìn)程的分類及重要性等級(jí) 。
至此,我們終于算是完全算是雙腳步入Android開(kāi)發(fā)的大門了,但我們現(xiàn)在還只能算是金字塔底端的那群人,還需要不斷地實(shí)踐、實(shí)踐、再實(shí)踐。而且上面所講的是作為一個(gè)真正Android開(kāi)發(fā)人員必須要深刻理解的東西,如果您還沒(méi)有達(dá)到深刻的程度那請(qǐng)你 回去再瀏覽一遍 ,然后跟著我的這個(gè)系列繼續(xù)深入學(xué)習(xí),在接下來(lái)的文章我將更多的是利用實(shí)例來(lái)解析這些東西。下面我再次用Hello World程序來(lái)分析一下Android應(yīng)用程序,主要內(nèi)容如下:
- “Hello World!”顯示淺析
- “Hello World!”的手術(shù)(一)
- “Hello World!”的手術(shù)(二)
- “Hello World!”的手術(shù)(三)
1、“Hello World!”淺析
首先我們?cè)俅魏?jiǎn)單地新建一個(gè)Hello World項(xiàng)目,它的布局文件res\layout\main.xml的代碼如下:
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
???
android
:
orientation
=
"vertical"
???
android
:
layout_width
=
"fill_parent"
???
android
:
layout_height
=
"fill_parent"
???
>
<
TextView
?
???
android
:
layout_width
=
"fill_parent"
???
android
:
layout_height
=
"wrap_content"
???
android
:
text
=
"@string/hello"
???
/>
</
LinearLayout
>
元素<TextView>的android:text就是我們?cè)谄聊簧巷@示的“Hello World, HelloWorld!”,android:text的值是
“@string/hello
”,它是如何在屏幕上顯示“Hello World, HelloWorld!” 的呢?。
在main.xml文件中以這種格式:
@[package:]string/some_name (where some_name? is the name of a specific string)
引用res/values/strings.xml文件中的字符串,其中some_name是要引用的字符串的名字。strings.xml文件代碼如下:
<?
xml version="1.0" encoding="utf-8"
?>
<
resources
>
???
<
string
name
=
"hello"
>
Hello World, HelloWorld!
</
string
>
???
<
string
name
=
"app_name"
>
HelloWorld
</
string
>
</
resources
>
由此可見(jiàn),上面那個(gè)<TextView>的android:text引用的字符串是“Hello World, HelloWorld!”。接著想象一下,“Hello World, HelloWorld!”何時(shí)加載顯示的呢?
Note:這種<TextView>的text的值是存儲(chǔ)在strings.xml中的,而不是硬編碼的。這樣的好處是,當(dāng)我們?cè)趕trings.xml中修改hello的具體值時(shí),不需要在main.xml中修改。
我們來(lái)看下src目錄下skynet.com.cnblogs.www包(就是新建Hello World項(xiàng)目時(shí)定義的包名)中的HelloWorld.java文件,代碼如下:
package
skynet.com.cnblogs.www;
import
android.app.Activity;
import
android.os.Bundle;
public
class
HelloWorld
extends
Activity {
???
/** Called when the activity is first created. */
??? @Override
???
public
void
onCreate(Bundle savedInstanceState) {
???????
super
.onCreate(savedInstanceState);
??????? setContentView(R.layout.main);
??? }
}
可以看出在創(chuàng)建活動(dòng)時(shí),即
void onCreate(Bundle
saveInstanceState
)
中,在HelloWorld中重寫了它,在該方法中首先調(diào)用了父類的onCreate方法且接著調(diào)用了
setContentView(R.layout.main)
方法。是的,就是在這個(gè)方法中,根據(jù)main.xml文件將其顯示出來(lái),因?yàn)镽.layout.main是表示布局資源文件main.xml編譯后的對(duì)象,Eclipse插件會(huì)自動(dòng)在R.java文件中創(chuàng)建這個(gè)引用。main.xml中定義了<TextView>,然后根據(jù)它的android:text屬性引用到strings.xml文件中的
<
string
name
=
"hello"
>
Hello World, HelloWorld!
</
string
>
元素,然后將它顯示到屏幕上。
從 活動(dòng)的生命周期 可以知道,任何一個(gè)活動(dòng)啟動(dòng)的一個(gè)方法是onCreate()方法,在這里做一些初始化的工作,諸如創(chuàng)建視圖、綁定數(shù)據(jù)列表等。在HelloWorld項(xiàng)目中,就是調(diào)用 setContentView 進(jìn)行初始化工作,將Hello World, HelloWorld!顯示到屏幕上。
至此,我們對(duì)Hello World的認(rèn)識(shí)更加深入了一點(diǎn)!下面我們讓拿起手術(shù)刀對(duì)它進(jìn)行一個(gè)手術(shù)。
2、Hello World的手術(shù)(一)
我們將main.xml文件中的<TextView>元素刪掉,取而代之用一個(gè)Button來(lái)顯示“Hello World!”。代碼如下:
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
???
android
:
orientation
=
"vertical"
???
android
:
layout_width
=
"fill_parent"
???
android
:
layout_height
=
"fill_parent"
???
>
<
Button
android
:
layout_width
=
"fill_parent"
???
android
:
layout_height
=
"fill_parent"
???
android
:
text
=
"@string/hello"
???
/>
</
LinearLayout
>
其它的地方不用修改,直接運(yùn)行即可!
?
圖1、修改之前的?
從這個(gè)例子我們可以看出我們上節(jié)的分析是對(duì)的,接下來(lái)我們繼續(xù)對(duì)它做一個(gè)手術(shù)。
3、Hello World的手術(shù)(二)
我們這次不用Button來(lái)顯示“Hello World!”,我們這次用一個(gè)圖片來(lái)顯示。首先我們準(zhǔn)備一張png的圖片,如下:
圖3、hello.png
接下來(lái)我們將它復(fù)制到, res/drawable-dhpi中。然后我們查看R.java文件我們會(huì)發(fā)現(xiàn),R中自動(dòng)加了一行:(關(guān)于R文件,你可以參考
Android 開(kāi)發(fā)之旅:HelloWorld項(xiàng)目的目錄結(jié)構(gòu)
中的
1.2、gen文件夾
)
/* AUTO-GENERATED FILE.? DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found.? It
* should not be modified by hand.
*/
package
skynet.com.cnblogs.www;
public
final
class
R {
???
public
static
final
class
attr {
??? }
???
public
static
final
class
drawable {
???????
public
static
final
int
hello=0x7f020000;//這行是Android自動(dòng)新加的
???????
public
static
final
int
icon=0x7f020001;
??? }
???
public
static
final
class
layout {
???????
public
static
final
int
main=0x7f030000;
??? }
???
public
static
final
class
string {
???????
public
static
final
int
app_name=0x7f040001;
???????
public
static
final
int
hello=0x7f040000;
??? }
}
?
drawable- hdpi、drawable- mdpi、drawable-ldpi的區(qū)別:
(1)drawable-hdpi里面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的圖片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的圖片,如QVGA (240x320)
系統(tǒng)會(huì)根據(jù)機(jī)器的分辨率來(lái)分別到這幾個(gè)文件夾里面去找對(duì)應(yīng)的圖片。
?
刪除剛才我們添加的<Button>元素,添加一個(gè)<ImageView>元素。
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
???
android
:
orientation
=
"vertical"
???
android
:
layout_width
=
"fill_parent"
???
android
:
layout_height
=
"fill_parent"
???
>
<
ImageView
android
:
id
=
"@+id/imageview"
android
:
layout_width
=
"wrap_content"
???
android
:
layout_height
=
"wrap_content"
???
android
:
src
=
"@drawable/hello"
/>
</
LinearLayout
>
運(yùn)行之后,結(jié)果如下所示:
我們看到上面的ImageView有一個(gè)id屬性。其實(shí),每個(gè)View對(duì)象都有一個(gè)關(guān)聯(lián)的ID,來(lái)唯一標(biāo)識(shí)它。當(dāng)應(yīng)用程序被編譯時(shí),這個(gè)ID作為一個(gè)整數(shù)引用。但是ID通常是在布局XML文件中作為字符串分配的,在元素的id屬性。這個(gè)XML屬性對(duì)所有的View對(duì)象可用且會(huì)經(jīng)常用到。XML中的ID語(yǔ)法如下: android:id="@+id/my_button" 。
字符串前的@符號(hào)表示XML解析器應(yīng)該解析和擴(kuò)展剩下的ID字符串,并把它作為ID資源。+符號(hào)表示這是一個(gè)新的資源名字,它必須被創(chuàng)建且加入到我們的資源(R.java文件,R是Resource)。Android框架提供一些其他的ID資源。當(dāng)引用一個(gè)Android資源ID時(shí),你不需要+符號(hào),但是你必須添加android包名字空間,如下: android:id="@android:id/empty" 。
4、Hello World的手術(shù)(三)
上面兩個(gè)手術(shù)都是基于main.xml的,在布局資源文件中聲明相應(yīng)的控件并設(shè)置相關(guān)屬性,如TextView、Button、ImageView等,然后在onCreate()方法中調(diào)用 setContentView(R.layout.main) 方法來(lái)輸出。其實(shí)上面的幾個(gè)實(shí)驗(yàn)我們都可以編程地進(jìn)行,下面就以編程地用ImageView顯示“Hello World!”,別的也是類似來(lái)完成。
首先,我們將main.xml文件中的<ImageView>刪掉,且將res/values/strings.xml中的 < string name = "hello" > Hello World, HelloWorld! </ string > 刪掉(其實(shí)第3節(jié),用圖片顯示就沒(méi)有用到它);然后,在HelloWorld.java文件中 import android.widget.ImageView;且刪掉onCreate()方法中調(diào)用 setContentView(R.layout.main) 方法,因?yàn)槲覀儾恍枰鶕?jù)main.xml布局資源文件來(lái)顯示而是編程地Hello World。
接下來(lái)我們?cè)趏nCreate()方法中聲明一個(gè)ImageView對(duì)象,并設(shè)置它的圖像資源,最后將這個(gè)ImageView對(duì)象傳給
setContentView()
方法,代碼如下:
package
skynet.com.cnblogs.www;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.ImageView;
public
class
HelloWorld
extends
Activity {
???
/** Called when the activity is first created. */
??? @Override
???
public
void
onCreate(Bundle savedInstanceState) {
???????
super
.onCreate(savedInstanceState);
??????? ImageView imageHello=
new
ImageView(
this
);
???????
imageHello.setImageResource(R.drawable.hello);
??????? setContentView(imageHello);
??? }
}
運(yùn)行之后,同樣會(huì)得到Hello World的手術(shù)(二)的結(jié)果,只是圖片的顯示位置不太一樣。
在這里注意上面那行粗體代碼,如果是TextView或者Button的話,應(yīng)該調(diào)用setText()方法來(lái)設(shè)置”Hello World!”。
Note:構(gòu)建ImageView對(duì)象時(shí)傳遞了一個(gè) this 參數(shù),表示與當(dāng)前上下文(context)關(guān)聯(lián)。這個(gè)Context由系統(tǒng)處理,它提供諸如資源解析、獲取訪問(wèn)數(shù)據(jù)庫(kù)和偏好等服務(wù)。因?yàn)锳ctivity類繼承自Context,且因?yàn)槟愕腍elloWorld類是Activity的子類,它也是一個(gè)Context。因此,你可以傳遞 this 作為你的Context給ImageView引用。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
