27
3-1 | 認識變數與識別字 電腦程式在執行時常常需要記住一些資料,所以程式語言會提供一個地方, 用來記得執行時的一些資料,這個地方是「變數」(Variables )。Java 語言的變 數名稱就是「識別字」(Identifier )。 3-1-1 變數是什麼 我們去商店買東西時,為了比較價格,我們會記下商品價格,同樣的,程式 是使用變數儲存這些執行時需記住的資料,也就是將這些值儲存至變數,當變數 擁有儲存值後,就可以在需要的地方取出變數值,例如:執行數學運算和比較等。 對比真實世界,當我們想將零錢存起來時,可以準備一個盒子來存放這些 錢,並且隨時看看已經存了多少錢,這個盒子如同一個變數,我們可以將目前的 金額存入變數,或取得變數值來看看已經存了多少錢,如下圖所示: 變數、資料型態 與運算子 Chapter 3

Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-1 | 認識變數與識別字

電腦程式在執行時常常需要記住一些資料,所以程式語言會提供一個地方,

用來記得執行時的一些資料,這個地方是「變數」(Variables)。Java語言的變數名稱就是「識別字」(Identifier)。

3-1-1 變數是什麼

我們去商店買東西時,為了比較價格,我們會記下商品價格,同樣的,程式

是使用變數儲存這些執行時需記住的資料,也就是將這些值儲存至變數,當變數

擁有儲存值後,就可以在需要的地方取出變數值,例如:執行數學運算和比較等。

對比真實世界,當我們想將零錢存起來時,可以準備一個盒子來存放這些

錢,並且隨時看看已經存了多少錢,這個盒子如同一個變數,我們可以將目前的

金額存入變數,或取得變數值來看看已經存了多少錢,如下圖所示:

變數、資料型態

與運算子

Chapter 3

Page 2: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-2

PART 1 Java 結構化程式設計

請注意!真實世界的盒子和變數仍然有一些不同,我們可以輕鬆將錢幣丟入

盒子,或從盒子取出錢幣,但是,變數只有兩種操作,如下所示:

在變數存入新值:指定變數成為一個全新值,我們並不能如同盒子一般,

只取出部分金額。因為變數只能指定成一個新值,如果需要減掉一個值,

其操作是先讀取變數值,在減掉後,再將變數指定成最後運算結果的

新值。

讀取變數值:取得目前變數值,而且讀取變數值,並不會更改變數目前

儲存的值。

3-1-2 變數與資料型態

在程式語言的變數(Variables)可以視為是一個擁有名稱的盒子,能夠在程式執行時暫時儲存所需的資料,如下圖所示:

上述圖例是方形和圓柱形的兩個盒子,盒子名稱分別是變數名稱 grade 和height,在盒子中儲存的資料 85和 175.5稱為「字面值」(Literals)或稱為「常數值」(Constants),也就是數值、字元或字串等常數值,如下所示:

100 15.3 "Java程式"

上述字面值的前 2 個是數值,最後一個是使用「"」括起的字串字面值。現在回到盒子本身,盒子形狀和尺寸決定儲存資料,對比程式語言來說,形狀和尺

寸就是變數的「資料型態」(Data Types)。

程式語言的資料型態可以決定變數能夠儲存什麼值?它可以是數值、字元或

字串等資料,當變數指定資料型態後,就表示只能儲存指定型態的資料,如同圓

形盒子放不進相同直徑的方形物品,我們只能放進方形盒子中。

Page 3: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-3

3變數、資料型態與運算子

以此例,方形盒子就是 Java語言的 int整數資料型態,圓柱形盒子是 double浮點數資料型態,詳細 Java資料型態說明請參閱<第 3-3節:Java的資料型態>。

3-1-3 Java語言的識別字

在 Java程式碼中的「關鍵字」(Keywords),或稱「保留字」(Reserved Word)是一些對於編譯器而言,擁有特殊意義的名稱,其他非關鍵子的名稱都是程式設

計者自訂的元素名稱,稱為「識別字」(Identifier),例如:變數、程序、函數和物件名稱等。

程式設計者在替元素命名時,需要遵循程式語言的語法。而且元素命名十分

重要,因為一個好名稱如同程式註解,可以讓程式更容易了解。Java語言的基本命名規則,如下所示:

名稱是合法的「識別字」(Identifier),識別字是使用英文字母、底線「_」或錢號「$」開頭,不限長度的 Unicode 統一字碼字元的字串,包含字母、數字、錢號「$」和底線「_」。例如:一些合法的名稱範例,如下所示:

T, n, size, z100, long_name, helloWord, Test, apple, $total, _order Input_string, x, TITLE, APPLE, subtotal, _getTotal, $_32_cpu

名稱最長為 255個字元,而且名稱區分英文字母的大小寫,例如:java、Java和 JAVA是不同的名稱。

名稱不能使用 Java語法的「關鍵字」(Keyword),如下表所示:

abstract boolean break byte case

catch char class const continue

default do double else extends

false final finally float for

goto if implements import instanceof

int interface long native new

null package private protected public

Page 4: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-4

PART 1 Java 結構化程式設計

return short static super switch

synchronized this throw throws transient

true try void volatile while

名稱在「範圍」(Scope)中必需是唯一的,例如:在程式中可以使用相同的變數名稱,不過各變數名稱需要在不同的範圍,詳細的範圍說明請

參閱<第 5章:類別方法>。

3-2 | 變數、常數與指定敘述

電腦程式是由「資料」(Data)和「指令」(Instructions)組成。資料部分是本章的「變數」(Variables)和「資料型態」(Data Types);指令部分是本章的運算子、第 4章的「流程控制」(Control Structures)和第 5章的「程序」(Subroutines,即 Java的類別方法)。

3-2-1 宣告變數且指定初值

Java程式宣告變數就是建立指定資料型態的變數,我們可以在宣告同時指定變數值,也就是建立一個馬上在之後可以取得變數值的變數。

在本節 Java程式宣告 3個變數,包含 1個整數和 2個浮點數變數,因為這 3個變數有初值,所以,可以馬上輸出顯示這 3個變數值。

步驟一:觀察流程圖

請啟動 fChart 執行「檔案>載入流程圖專案」指令,開啟「C:\JavaSE8\ Ch03\Ch3_2_1.fpp」專案的流程圖,如下圖所示:

Page 5: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-5

3變數、資料型態與運算子

按上方工具列的【執行】鈕,可以看到流程圖的執行結果依序顯示 3個變數值,從指定值可以看出,第 1個 grade是整數;後 2個 height和 weight是浮點數,我們可以寫出其執行步驟,如下所示:

定義整數變數 grade(動作符號)

定義浮點變數 height(動作符號)

定義浮點變數 weight(動作符號)

輸出文字內容和變數 grade(輸出符號)

輸出文字內容和變數 height(輸出符號)

輸出文字內容和變數 weight(輸出符號)

步驟二:實作程式碼

使用 fChart 程式碼編輯器輸入對應流程圖符號的 Java 程式碼,其步驟如下所示:

啟動 fChart程式碼編輯器,如果已經啟動,請執行「檔案>新增」指令建立新程式後,將第 1列的類別名稱從 Demo改為【Ch3_2_1】,然後在 main()方法中點一下作為插入點。

1

5

4

3

6

2

1

Page 6: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-6

PART 1 Java 結構化程式設計

執行「動作符號>定義變數>定義整數變數」指令,插入第 1個宣告整數變數和初值的程式碼。

請再執行 2次「動作符號>定義變數>定義浮點數變數」指令,插入 2個宣告浮點數變數和初值的程式碼。

輸出 3個變數,請執行 3次「輸出/輸入符號>輸出符號>訊息文字+變數+換行」指令,插入 3個 println()方法輸出 3個變數和換行,如下圖所示:

因為變數是識別字,我們除了需要修改宣告變數的變數名稱,也需要修改

println()方法輸出變數的變數名稱,如下表所示:

列號 原來變數名稱 更改變數名稱

4、7 var1 grade

5、8 var1 height

6、9 var1 weight

接著更改變數值,請將第 4列的值 10改為 76;第 5列的值 12.3改為 175.5;第 6列的值 12.3改為 75.5。

更改輸出的文字內容,請將第 7~9列的文字內容「變數值」依序改為「成績」、「身高」和「體重」,最後的 Java程式碼,如下所示:

int grade = 76; double height = 175.5; double weight = 75.5; System.out.println("成績 = " + grade); System.out.println("身高 = " + height); System.out.println("體重 = " + weight);

7

6

5

4

3

2

Page 7: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-7

3變數、資料型態與運算子

請執行「檔案>儲存」指令,儲存成檔名 Ch3_2_1.java的 Java程式檔案。

請按【編譯程式碼】鈕編譯 Java程式後,按【執行程式】鈕執行 Java程式,可以開啟「命令提示字元」視窗顯示 3個變數值。

步驟三:了解程式碼

變數可以儲存程式執行時的暫存資料,Java語言的變數在宣告時就可以指定初值,如下所示:

資料型態 變數名稱 = 初值;

上述語法使用資料型態開頭,在變數名稱後使用「=」等號指定變數初值,例如:175.5和 76等字面值。Java語言變數初值的範例,如下所示:

int grade = 76; double height = 175.5; double weight = 75.5;

上述程式碼宣告 3個變數,使用 int和 double開頭,和分別指定初值為 76、175.5 和 75.5,然後馬上可以使用 3 個 println()方法顯示這 3 個變數值,如下 所示:

System.out.println("成績 = " + grade); System.out.println("身高 = " + height); System.out.println("體重 = " + weight);

Java語言除了一列宣告一個變數外,我們也可以在同一列宣告多個變數,並且分別指定初值,其語法如下所示:

資料型態 變數名稱 1=初值 1[, 變數名稱 2=初值 2];

8

9

Page 8: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-15

3 變數、資料型態與運算子

3-3 | 資料型態

Java 語言是一種「強調型態」(Strongly Typed)程式語言,在變數儲存的值需要指定資料型態。簡單的說,資料型態的目的是告訴編譯器宣告的變數準備

儲存什麼樣的資料,而且不論如何存取變數值,都不能更改變數的資料型態。

Java語言的資料型態分為「基本」(Primitive)和「參考」(Reference)兩種資料型態,如下所示:

基本資料型態:Java 提供 byte、short、int、long、float、double、char和 boolean共 8種資料型態,在本節說明的是基本資料型態。

參考資料型態:宣告此型態的變數值是記憶體位址,即物件儲存的位址,

關於參考資料型態的詳細說明請參閱第 6~7章。

3-3-1 整數資料型態

「整數資料型態」(Integral Types)是指變數的資料為整數且沒有小數點。

整數資料型態的種類

整數資料型態依照整數資料長度的不同(即變數佔用的記憶體位元數),可

以分為 4種不同範圍的整數資料型態,如下表所示:

整數資料型態 位元數 範圍

byte 8 -27 ~ 27-1,即-128 ~ 127

short 16 -215 ~ 215-1,即-32768 ~ 32767

int 32 -231 ~ 231-1,即-2147483648 ~ 2147483647

long 64 -263 ~ 263-1,即-9223372036854775808 ~ 9223372036854775807

程式設計者可以依照整數值的範圍決定宣告的變數型態。

Page 9: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-16

PART 1 Java 結構化程式設計

整數字面值

在 Java 程式碼可以直接使用包含 0、正整數和負整數的「整數字面值」(Integral Literal),並且使用十進位、八進位和十六進位來表示,如下所示:

八進位:「0」開頭的整數值,每個位數值為 0~7的整數。

十六進位:「0x」開頭的數值,位數值為 0~9和 A~F(或 a~f)。

一些整數字面值的範例,如下表所示:

整數字面值 十進位值 說明

44 44 十進位整數

0256 174 八進位整數

0xef 239 十六進位整數

0x3e6 998 十六進位整數

整數字面值的字尾型態字元

整數字面值的資料型態視數值的範圍而定,Java語言可以使用數值字尾型態的字元將字面值指定成 long長整數,如下表所示:

資料型態 字元 範例

long L/l 245l或 245L

3-3-2 浮點數資料型態

「浮點數資料型態」(Floating Point Types)是指整數加上小數,例如:3.1415926、123.567等。

浮點數資料型態的種類

浮點數資料型態依照長度的不同(即變數佔用的記憶體位元數),可以分為

2種浮點數的資料型態,如下表所示:

Page 10: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-17

3 變數、資料型態與運算子

浮點數資料型態 位元數 範圍

float 32 1.40239846e-45 ~ 3.40282347e38

double 64 4.94065645841246544e-324 ~ 1.79769313486231570e308

浮點數字面值

在 Java程式碼如果直接使用浮點數字面值(Floating Point Literal),預設是 double;而不是 float資料型態。我們也可以使用科學符號的「e」或「E」符號來代表 10為底的指數。一些浮點數字面值的範例,如下表所示:

浮點數字面值 十進位值 說明

0.0123 0.0123 浮點數

.00567 .00567 浮點數

1.25e4 12500.0 使用 e指數科學符號的浮點數

浮點數字面值的字尾型態字元

如果浮點變數宣告的是 float,在指定浮點數字面值時,因為預設是 double,所以需要在浮點數字面值的字尾加上字元「F」或「f」,將數值轉換成浮點數 float,如下所示:

float i = 25.0F;

上述 float資料型態的字面值使用字尾「F」。Java語言可以使用浮點數字面值的字尾型態字元,如下表所示:

資料型態 字元 範例

float F/f 6.7F或 6.7f

double D/d 3.1415D或 3.1415d

Page 11: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-33

3 變數、資料型態與運算子

運算子 範例 相當的運算式 說明

|= x |= y x = x | y 位元 OR運算

^= x ^= y x = x ^ y 位元 XOR運算

3-5 | 資料型態的轉換

Java的「指定敘述型態轉換」(Assignment Conversion)可以分為兩種:「寬基本型態轉換」(Widening Primitive Conversions)和「窄基本型態轉換」(Narrowing Primitive Conversions)。

3-5-1 寬基本型態轉換

在指定敘述型態轉換的寬基本型態轉換不需要特別語法,運算式如果擁有不

同型態的運算元,就會將儲存的資料自動轉換成相同的資料型態。因為這是轉換

成範圍比較大的資料型態,所以不會損失精確度,如下所示:

double > float > long > int > char > short > byte

上述型態的範圍是指如果 2個運算元屬於不同型態,就會自動轉換成範圍比較大的型態。一些範例如下表所示:

運算元 1 運算元 2 轉換成

double float double

float int float

long int long

在指定敘述型態轉換右邊運算式結果的型態會轉換成與左邊變數相同的型

態,所以左邊變數的型態需要範圍比較大的資料型態,否則在編譯時,就會顯示

損失精確度的編譯錯誤。

Page 12: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-34

PART 1 Java 結構化程式設計

Java程式:Ch3_5_1.java

在 Java程式宣告整數和浮點數變數且設定初值,然後測試指定敘述的寬基本型態轉換,其執行結果如下所示:

a(i)=123 b(f)=15.5 c(l)=345678 r(i)=a(i)+134(i)=257 r1(l)=a(i)+c(l)=345801 r2(f)=a(i)*b(f)=1906.5 r3(d)=c(l)*b(f)=5358009.0

上述執行結果在括號內顯示的是型態,f是 float,i是 int,l是 long,我們可以看到型態轉換的結果,轉換成指定敘述左邊的型態。

程式內容 01: public class Ch3_5_1 { 02: // 主程式

03: public static void main(String[] args) { 04: // 變數宣告

05: int a = 123;

06: float b = 15.5F;

07: long c = 345678L;

08: int r; long r1;

09: float r2; double r3; 10: // 寬基本型態轉換

11: System.out.print("a(i)=" + a + " b(f)=" + b);

12: System.out.println(" c(l)=" + c);

13: r = a + 134;

14: System.out.println("r(i)=a(i)+134(i)=" + r);

15: r1 = a + c; 16: System.out.println("r1(l)=a(i)+c(l)=" + r1);

17: r2 = a * b;

18: System.out.println("r2(f)=a(i)*b(f)=" + r2);

19: r3 = c * b;

20: System.out.println("r3(d)=c(l)*b(f)=" + r3);

21: }

22: }

Page 13: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-35

3 變數、資料型態與運算子

程式說明

第 5~9列:宣告整數、長整數和浮點數變數。

第 11~20列:測試寬基本型態轉換。

3-5-2 窄基本型態轉換與型態轉換運算子

窄基本型態轉換就是從精確度比較高的資料型態轉換成較低的資料型態,例

如:double轉換成 float;long轉換成 int,所以變數儲存的資料將會損失一些精確度。

指定敘述型態轉換的窄基本型態轉換通常並不會自動處理,而是需要使用

Java的「型態轉換運算子」(Cast Operator)在運算式中強迫轉換資料型態,如下所示:

r1 = (float) a; r2 = (float) (a + b);

上述程式碼可以將運算式或變數強迫轉換成前面括號的型態,以此例是轉換

成 float 浮點數資料型態。一般來說,我們使用型態轉換運算子,通常都是因為轉換結果並非預期結果。

例如:整數和整數的除法 27/5,其結果是整數 5。如果需要精確到小數點,就不能使用指定敘述型態轉換,而需要先將它強迫轉換成浮點數,例如:a=27、b=5,如下所示:

r = (float)a / (float)b;

上述程式碼將整數變數 a和 b都強迫轉換成浮點數 float,此時 27/5的結果是 5.4。

Page 14: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

3-36

PART 1 Java 結構化程式設計

Java程式:Ch3_5_2.java

在 Java程式宣告 2個整數變數後,分別計算不強迫轉換和強迫型態轉換成浮點數後的相除結果,其執行結果如下所示:

a = 27 b = 5 r = a / b = 5.0 r = (float)a/(float)b = 5.4

上述執行結果可以看到當沒有強迫型態轉換時,雖然有寬基本型態轉換成浮

點數,結果為 5.0;如果有強迫型態轉換,此時的結果是 5.4,可以精確到小數點。

程式內容 01: public class Ch3_5_2 { 02: // 主程式

03: public static void main(String[] args) { 04: // 變數宣告

05: int a = 27; int b = 5; 06: float r; 07: // 寬基本型態轉換

08: System.out.println("a = " + a + " b = " + b);

09: r = a / b;

10: System.out.println("r = a / b = " + r); 11: // 強迫型態轉換

12: r = (float)a / (float)b;

13: System.out.println("r = (float)a/(float)b = "+r);

14: }

15: }

程式說明

第 5~6列:宣告 3個變數和指定初值。

第 9列:整數除法。

第 12列:浮點數除法。

Page 15: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-1 | 意圖的基礎

意圖(Intents)是一個啟動其他 Android活動、服務和廣播接收器的系統訊息,一種抽象方式來描述希望執行的操作,可以告訴 Android作業系統我想作什麼?執行什麼動作?例如:啟動其他活動、告訴指定服務可以啟動或停止與送出廣播。

意圖與意圖篩選

Android 應用程式送出意圖的訊息需要經過 Android 作業系統來判斷接收者是誰,它是使用意圖篩選(Intent Filters)找出有能力處理的活動或內建應用程式,然後才將訊息送給接收者,如下圖所示:

意圖與意圖篩選 Chapter 14

Page 16: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-2

PART 3 Android App 行動應用程式開發

上述圖例在【活動 1】建立和送出 2個意圖(虛線),一個意圖指明是【活動 2】,作業系統可以依據指明類別找到此活動來轉送訊息,並且啟動此活動。另一個意圖是描述特定動作,即瀏覽網頁,作業系統依據此動作的意圖篩選找出

可用的應用程式瀏覽器,然後啟動它。

Android 作業系統的意圖與意圖篩選機制,可以讓我們撰寫 Android 應用程式取代系統內建的應用程式。例如:當撰寫一個新的瀏覽器後,作業系統透過意

圖篩選可以找出 2 個處理網頁瀏覽的程式(一個是內建;一個是我們自建的工具),此時作業系統會顯示選單讓使用者選擇使用哪一個工具,並且讓我們將新

建工具指定為預設工具,也就是取代內建瀏覽器。

意圖的種類

在 Android作業系統的意圖可以分為兩種,如下所示:

明確意圖(Explicit Intent):指明目標活動接收者名稱,即明確指明是送給誰,通常是使用在連接同一應用程式內部的多個活動,前述啟動活

動 2和第 14-2~14-4節是明確意圖。

隱含意圖(Implicit Intent):意圖只有指出執行的動作、型態和目錄,並沒有目標接收者的確實名稱,Android作業系統任何可以完成此工作的應用程式都可以是接收者,即前述瀏覽網頁,在第 14-5節是隱含意圖。

使用意圖啟動的活動類型

Android 應用程式的活動是一個佔滿行動裝置螢幕的視窗,在同一應用程式可以擁有多個活動,在活動中是一至多個介面元件建立的使用介面。Android 應用程式的活動可以分成兩大類型,如下所示:

獨立活動:一種沒有資料交換的活動,單純只是從一個螢幕轉換至下一

個螢幕,在第 14-2節使用意圖啟動的就是這種活動。

相依活動:一種類似 Web網頁之間資料傳遞的活動,在活動之間有資料交換,我們需要將資料傳遞至下一個活動,和取得回傳資料,在第 14-3和 14-4節啟動的就是這種活動。

Page 17: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-3

14 意圖與意圖篩選

啟動與關閉活動的相關方法

Activity 活動類別處理啟動(其參數是 Intent 意圖物件)與關閉活動的相關方法,其說明如下表所示:

方法 說明

startActivity(Intent) 使用參數的意圖來啟動新活動

startActivityForResult(Intent , int) 使用參數的意圖和請求碼來啟動新活動,可以取得啟動

新活動的回傳值

finish() 關閉活動

14-2 | 使用意圖啟動其他活動

在 Android啟動同一應用程式的其他活動通常是使用明確意圖,當 Android應用程式擁有多個活動時,我們需要使用意圖來啟動其他活動,其主要工作有三

項,如下所示:

定義繼承活動類別的新類別,就是建立一個新活動。

在 AndroidManifest.xml註冊新活動。

建立意圖來啟動新活動,如果需要可以在活動之間傳遞資料。

Android Studio專案:Ch14_2

在 Android應用程式擁有兩個活動,按下主活動的按鈕,可以開啟第二個活動,關閉第

二個活動可以回到主活動,其執行結果如右圖

所示:

Page 18: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-4

PART 3 Android App 行動應用程式開發

按【啟動第二個活動】鈕,可以啟動

SecondActivity開啟第二個活動,如右圖所示:

按第二個活動的【關閉第二個活動】鈕,

可以關閉目前活動,返回主活動。

步驟一:建立主活動版面配置的使用介面

請啟動 Android Studio 新增名為【Ch14_2】的專案後,修改使用介面的activity_main.xml,其步驟如下所示:

切換至 activity_main.xml後,修改 TextView元件的 text屬性,將它改為【主活動】。

在 TextView下方新增 Button元件 button,【text】屬性值是【啟動第二個活動】,和指定【onClick】屬性值為 button_Click。

2

1

Page 19: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-5

14 意圖與意圖篩選

步驟二:建立第二個活動類別和版面配置

接著建立第二個活動類別和版面配置檔,請繼續上面步驟,如下所示:

請在「Project」視窗的【app\java】上,執行右鍵快顯功能表的「New> Activity>Empty Activity」指令,使用空活動範本來新增活動。

在【Activity Name】欄位輸入活動名稱【SecondActivity】,可以看到版面配置檔名為 activity_second,按【Finish】鈕新增第二個活動。

2

1

Page 20: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-6

PART 3 Android App 行動應用程式開發

請切換至 activity_second.xml,拖拉新增 TextView元件後,將【text】屬性值改為【第二個活動】;【ID】屬性輸入【output】。

在 TextView下方新增 Button元件 button2,【text】屬性值是【關閉第二個活動】,和指定【onClick】屬性值為 button2_Click。

開啟 SecondActivity.java,建立 button2_Click()事件處理來關閉活動,即呼叫 finish()方法,如下所示:

public void button2_Click(View view) { finish(); }

5

4

3

Page 21: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-7

14 意圖與意圖篩選

步驟三:在 AndroidManifest.xml註冊第二個活動

因為是使用活動範本建立活動,所以在 AndroidManifest.xml 檔可以看到已經註冊第二個活動,在 activity元素後新增另一個 activity元素,如下所示:

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity"></activity> </application>

上述第一個<activity>標籤的 android:name 屬性值是【.MainActivity】,加上套件就是主活動類別的完整名稱,所以名稱使用「.」符號開頭,第二個<activity>標籤是【.SecondActivity】的第二個活動。

步驟四:在主活動建立意圖啟動第二個活動

在 MainActivity.java建立 button_Click()事件處理程序,可以建立 Intent意圖物件來啟動第二個活動,請繼續上面步驟,如下所示:

請開啟【MainActivity.java】類別檔,建立 button_Click()事件處理程序,其內容如下所示:

public void button_Click(View view) { Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); }

上述程式碼建立 Intent 物件,建構子參數依序為來源 Context(匿名內層類別請使用 MainActivity.this),和目標類別名稱,即 SecondActivity.class,然後呼叫 startActivity()方法啟動第二個活動,參數是 Intent物件。

1

Page 22: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-8

PART 3 Android App 行動應用程式開發

14-3 | 傳遞資料給其他活動

Intent 物件可以攜帶額外資料,將這些資料一併傳遞給目標活動,例如:在主活動輸入攝氏溫度,然後將輸入值作為傳遞資料傳至目標活動來計算轉換結果

的華氏溫度。

建立 Intent物件攜帶 Bundle物件的傳遞資料

在 Intent物件攜帶傳遞資料是使用 Bundle物件,一種目錄物件(Dictionary Object,儲存鍵與值的對應資料)來儲存字串型態鍵值對應的各種資料型態資料。首先建立 Intent物件,如下所示:

Intent intent = new Intent(this, FActivity.class);

上述程式碼建立 Intent 物件後,建立 Bundle 物件的大包包,我們可以直接將資料丟進去,如下所示:

Bundle bundle = new Bundle(); bundle.putString("TEMPC", txtC.getText().toString());

上述程式碼使用 putString()方法新增字串資料,第 1 個參數是字串的鍵值 (之後需要使用此鍵值取出內容),第 2 個參數是值。常用的方法有 putInt()放入整數、putDouble()放入浮點數和 putByte()放入位元組資料等,如果資料不只一項,請重複呼叫 put???()方法將資料一一放入 Bundle物件。

接著使用 Intent 物件的 putExtras()方法來附加 Bundle 物件,和啟動活動,如下所示:

intent.putExtras(bundle); startActivity(intent);

取出 Intent物件攜帶傳遞的 Bundle物件資料

在目標活動可以呼叫活動物件的 getIntent()方法取得 Intent物件,然後呼叫

Intent物件的 getExtras()方法取得攜帶的 Bundle物件,如下所示:

Page 23: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-9

14 意圖與意圖篩選

Bundle bundle = this.getIntent().getExtras(); if (bundle != null) { c = Integer.parseInt(bundle.getString("TEMPC")); ...... }

上述 if條件判斷是否有資料,如果有,就使用 getString()方法取出資料,參數是之前指定的字串鍵值,分別對應之前的 put????()方法,我們可以使用 getInt()取出整數、getDouble()取出浮點數和 getByte()取出位元組資料等。

Android Studio專案:Ch14_3

這個 Android應用程式是修改第 13-4-1節的溫度轉換程式,將它分割成兩個活動,在第

一個活動輸入攝氏溫度後,將資料傳遞給第二

個活動計算轉換結果的華氏溫度,其執行結果

如右圖所示:

輸入攝氏溫度,按【轉換】鈕可以顯示轉

換成的華氏溫度,這是第二個活動,如右圖 所示:

XML文件:\res\layout\activity_main.xml

MainActivity活動的版面配置和第 13-4-1節相似,我們刪除了第一列的後 2個 TextView,和第二列最後的 EditText元件,如下圖所示:

Page 24: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-10

PART 3 Android App 行動應用程式開發

Java程式:MainActivity.java 01: public class MainActivity extends AppCompatActivity {

02: @Override

03: public void onCreate(Bundle savedInstanceState) {

04: super.onCreate(savedInstanceState);

05: setContentView(R.layout.activity_main);

06: } 07: // Button元件的事件處理

08: public void button_Click(View view) { 09: // 取得 EditText元件

10: EditText txtC=(EditText) findViewById(R.id.txtC); 11: // 建立 Intent物件

12: Intent intent=new Intent(this, FActivity.class); 13: // 建立傳遞資料的 Bundle物件

14: Bundle bundle = new Bundle();

15: bundle.putString("TEMPC",txtC.getText().toString()); 16: intent.putExtras(bundle); // 加上資料

17: startActivity(intent); // 啟動活動

18: }

19: }

程式說明

第 8~18列:Button元件的事件處理方法,在第 12列建立 Intent物件,在第 14~16列的 Intent物件加上傳遞的資料,使用的是 Bundle物件,第

17列啟動參數 Intent物件的活動。

XML文件:\res\layout\activity_f.xml

請在 FActivity活動的版面配置新增 TextView元件,用來顯示轉換結果的華氏溫度,其 ID屬性值是【lblOutput】,如下圖所示:

Page 25: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-11

14 意圖與意圖篩選

Java程式:FActivity.java 01: public class FActivity extends AppCompatActivity {

02: @Override

03: protected void onCreate(Bundle savedInstanceState) {

04: super.onCreate(savedInstanceState);

05: setContentView(R.layout.activity_f);

06: convertTempture();

07: } 08: // 轉換溫度

09: private void convertTempture() {

10: int c;

11: double f = 0.0; 12: // 取得傳遞的資料

13: Bundle bundle = this.getIntent().getExtras();

14: if (bundle != null) {

15: c=Integer.parseInt(bundle.getString("TEMPC")); 16: // 攝氏轉華氏的公式

17: f = (9.0 * c) / 5.0 + 32.0; 18: // 顯示華氏溫度

19: TextView o = (TextView)

findViewById(R.id.lblOutput); 20: o.setText("華氏溫度: " + Double.toString(f));

21: }

22: }

23: }

程式說明

第 6列:呼叫 convertTempture()方法計算與顯示華氏溫度。

第 9~22列:convertTempture()方法在第 13列取得傳遞資料的 Bundle物件,第 14~21列的 if條件判斷是否有資料,如果有,在第 15列取得傳遞的攝氏溫度,因為資料是字串,所以轉換成整數,在第 17列計算轉換的華氏溫度,第 19~20列顯示華氏溫度。

XML文件:\manifests\AndroidManifest.xml

在 application 元素下的 activity 子元素後新增有另一個 activtiy 元素,android:name屬性值為【.FActivity】,如下所示:

<activity android:name=".FActivity"></activity>

Page 26: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-23

14 意圖與意圖篩選

在本節 Android 應用程式如果啟動 Google 地圖,Android 模擬器系統映像檔(System

Image)需要選擇 Google APIs。關於電子郵件寄送,因為 Android模擬器並沒有內建郵件

工具,請使用實機測試寄送電子郵件。

XML文件:\res\layout\activity_main.xml

MainActivity活動的版面配置是使用 LinearLayout,垂直排列 4個 Button元件,其 ID屬性值分別是【btn1~4】,onClick屬性值為【btn1~4_Click】,如下圖所示:

Java程式:MainActivity.java 01: public class MainActivity extends AppCompatActivity {

02: @Override

03: public void onCreate(Bundle savedInstanceState) {

04: super.onCreate(savedInstanceState);

05: setContentView(R.layout.activity_main);

06: } 07: // 事件處理程序

08: public void btn1_Click(View view) {

09: Intent i = new Intent(Intent.ACTION_VIEW,

10: Uri.parse("http://www.google.com.tw"));

11: startActivity(i);

12: }

Memo

Page 27: Chapter 3 變數、資料型態 與運算子epaper.gotop.com.tw/PDFSample/AEL018900.pdf使用fChart 程式碼編輯器輸入對應流程圖符號的Java 程式碼,其步驟如下

14-24

PART 3 Android App 行動應用程式開發

13: public void btn2_Click(View view) {

14: Intent i = new Intent(Intent.ACTION_VIEW,

15: Uri.parse(

"geo:25.04692437135412,121.5161783959678"));

16: startActivity(i);

17: }

18: public void btn3_Click(View view) {

19: Intent i = new Intent(Intent.ACTION_DIAL,

20: Uri.parse("tel:+1234567"));

21: startActivity(i);

22: }

23: public void btn4_Click(View view) {

24: Intent i = new Intent(Intent.ACTION_SENDTO,

25: Uri.parse("mailto:[email protected]"));

26: startActivity(i);

27: }

28: }

程式說明

第 8~12 列: btn1_Click()方法的事件處理是在第 9~10 列使用

Intent.ACTION_VIEW動作,URI是網址來啟動瀏覽器。

第 13~17 列: btn2_Click()方法的事件處理是在第 14~15 列使用Intent.ACTION_VIEW動作,URI是 GPS座標值。

第 18~22列:btn3_Click()方法的事件處理是使用 Intent.ACTION_DIAL動作,URI是電話號碼。

第 23~27 列: btn4_Click()方法的事件處理是使用 Intent.ACTION_ SENDTO動作,URI是電子郵件地址。