用 Visual Basic 開發 Android App 專題研習 壹 活動主旨 一 Basic4android(B4A) 是一套整合開發環境 IDE, 可以讓 Visual Basic 語言的開發者直接使用 BASIC 語言來開發 Android App,B4A 能夠自動將開發者撰寫的 BASI

Similar documents
CHAPTER VC#

Microsoft PowerPoint - ASP_NET_03

Excel VBA Excel Visual Basic for Application

投影片 1

(Microsoft Word - wes _\246p\246\363\250\317\245\316LED\277O\305\343\245\334\252\254\272A.doc)

HTML網頁基礎語言

untitled

X6-04_How_do_I_write_a_com_port_communicate_program_of_XPAC_tc

Microsoft PowerPoint - C_Structure.ppt

Microsoft PowerPoint - VB14.ppt

Microsoft Word - 2.doc

The golden pins of the PCI card can be oxidized after months or years

iziggi

VB程序设计教程

四川省普通高等学校

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

IsPostBack 2

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Microsoft PowerPoint - vb.net2.ppt

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

1-1

<4D F736F F D2028B0D3BADEB873B971A46CB3F DB8F3B E646F7773A8EC416E64726F6964AABAB57BA6A1B35DAD702D423441A4B6B2D0>

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t


Microsoft Word - ACG chapter00c-3ed.docx

<4D F736F F D DA5BFA6A1C476C1C92DBEC7ACECB8D5A8F728B57BB35D292E646F63>

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

untitled

建立Android新專案

麻 省 理 工 學 院 是 在 西 元 2013 年 12 月 3 日 推 出 MIT App Inventor 2 網 站, 提 供 免 費 的 雲 端 服 務, 使 用 者 可 以 透 過 瀏 覽 器 來 開 發 Android 裝 置 應 用 程 式, 該 網 站 的 網 址 為 : http

Chapter 16 集合

Microsoft Word - 小心翼翼的二十一點N.doc

封面-12

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操

第三篇 第 10 章 - 管理者登入第 11 章 - 更改網路商店 Logo 第 12 章 - 系統設定第 13 章 - 商品上架第 14 章 - 付款方式設定第 15 章 - 出貨方式設定第 16 章 - 特價商品 oscommerce 103

untitled

<img>

投稿類別:資訊類

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

CHAPTER 1

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

2 第 章 绪 论 Internet 2.0 使 得 消 费 型 电 子 产 品 用 户 可 以 通 过 多 种 不 同 的 数 据 网 络 访 问 互 联 网 内 容 用 户 可 以 使 用 便 携 式 消 费 型 电 子 设 备, 如 智 能 手 机 触 屏 平 板 电 脑 电 子 书, 甚 至

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

SyncMail AJAX Manual

<4D F736F F D B0D3B77EC3FEA7DEC3C0C476C1C9A5BFA6A1B8D5C3442DB57BA6A1B35DAD702DBEC7ACEC2E646F6378>

多層次傳銷與獎金系統

untitled

中南大学第二届软件创新大赛

Microsoft PowerPoint - 02_運算.pptx

投影片 1

Microsoft PowerPoint - VB5

Microsoft Word zw

新・解きながら学ぶJava

上海市教育考试院关于印发新修订的

AndroidUsersGuide.book

使用手冊

CC213

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

運算子多載 Operator Overloading

epub83-1

1 1 Excel VBA 說明 ( ) (_) STEP4 Excel 2 STEP5 A1 1 B2 2 C3 3 STEP6 A1 STEP7 > > 1-11

Microsoft Word - 第1章 Android基本概念.docx

CC213

Visual Basic D 3D

目 錄 版 次 變 更 記 錄... 2 原 始 程 式 碼 類 型 之 使 用 手 冊... 3 一 安 裝 軟 體 套 件 事 前 準 備... 3 二 編 譯 流 程 說 明

01 用 ActionScript 3.0 開始認識 Flash CS3 Flash 是應用在網路上非常流行且高互動性的多媒體技術, 由於擁有向量圖像體積小的優點, 而且 Flash Player 也很小巧精緻, 很快的有趣的 Flash 動畫透過設計師的創意紅遍了整個網際網路 雖然很多人都對 Fl

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

概述

Microsoft PowerPoint - OPVB1基本VB.ppt

1. 2. Flex Adobe 3.

國立北斗家商 107 學年度第 2 學期第二次期中考科目 : 計算機應用 計算機概論 IV 班級 : 商二 1 2 貿二 資二 綜二 1 作答方式 : 答案卡 選擇題共 33 題, 除第 1 題 4 分, 其餘每題 3 分, 注意作答時間 1. ( ) 使用 Visual Basic 程式語言 (

Microsoft Word - 第3章.doc

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8

3.1 num = 3 ch = 'C' 2

關於本書 l 3 PhoneGap Appcelerator Titanium Sencha Touch (wrapper framework) Native App PhoneGap Build Native App Hybrid App Java Objective-C Android SDK

Microsoft PowerPoint - VB3

untitled

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

RUN_PC連載_12_.doc

( )... 5 ( ) ( )

(Microsoft Word - wes _\246p\246\363\250\317\245\316watchdog\250\276\244\356\265{\246\241\267\355\276\367.doc)

The Embedded computing platform

VB.Net

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

Microsoft Word - 投影片ch06

untitled

Microsoft Word - 01.DOC

Maasa停車場管理系統

2016 勒索軟體白皮書

Microsoft PowerPoint - Android_Ch01.ppt [相容模式]

序 言 本 专 业 人 才 培 养 方 案 以 适 应 市 场 需 求 为 目 标, 根 据 学 校 校 企 双 主 体 人 才 培 养 的 要 求 和 移 动 应 用 开 发 专 业 的 特 点 设 置 课 程 体 系, 体 现 了 课 程 为 市 场 服 务 的 特 点 本 专 业 要 求 学

ACI pdf

附 錄

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

Microsoft Word - AEL117-CH09.doc

Transcription:

國立中壢高商 103 學年度 精進優質計畫 桃園縣資訊教師研習講義 用 Visual Basic 開發 Android App 專題研習 資深電腦圖書作家陳會安老師 103/11/25

用 Visual Basic 開發 Android App 專題研習 壹 活動主旨 一 Basic4android(B4A) 是一套整合開發環境 IDE, 可以讓 Visual Basic 語言的開發者直接使用 BASIC 語言來開發 Android App,B4A 能夠自動將開發者撰寫的 BASIC 程式碼編譯轉換成 Java 程式碼來建立原生的 Android 應用程式 二 透過以 Basic4android 開發 Android App 的分享, 協助參與教師以現有的 Visual Basic 程式設計經驗, 轉而開發 Android App 貳 研習課程 時間 議程 8:40~9:00 報到 9:00~10:30 Android 與 B4A 基礎和開發環境安裝設定 - 建立第一個 Android App 和 AVD 的使用 10:30~10:40 茶水時間 10:40~12:10 B4A 的 Visual Basic 語法 12:10~13:00 午餐 & 午休 13:00~13:50 使用 B4A 的 GUI 設計工具 13:50~14:00 茶水時間 14:00~14:50 GUI 元件與活動 14:50~15:00 茶水時間 15:00~15:50 繪圖 檔案處理與正式版 B4A 函數庫 ( 正式版與試用版是最大的差異 ) 15:50~16:00 茶水時間 16:00~17:00 意圖 服務與狀態列通知 參 主講人 : 陳會安老師 學歷 : 美國猶他州州立大學電腦碩士資深專業電腦圖書作家經歷 : 美商 PH 出版經理 專業電腦書作者著作 : 用 Visual Basic 您也能開發 Android App-- 使用 Basic4android) 用實例學 Visual Basic 2013 / 2012 程式設計 JavaScript 與 jquery 網頁設計範例教本 Java SE 7 與 Android 4.x 程式設計範例教本 PHP+ MySQL 與 jquery Mobile 跨行動裝置網站開發 SQL Server 2012 資料庫設計與開發實務 等超過 30 本著作

Android 的基礎 Android 是一套使用 Linux 作業系統為基礎開發的 Open Source 作業系統, 主要是針對手機等行動裝置使用的作業系統, 現在 Android 已經逐漸擴充到平板電腦 筆電和其他領域, 例如 : 電子書閱讀器 MP4 播放器和 Internet 電視等 目前擁有 Android 作業系統的是非營利組織的開放式手持裝置聯盟,Google 公司則在幕後全力支援 Android 作業系統的開發計劃, 並且在 Android 作業系統整合 Google 的 Gmail Youtube Google 地圖和 Google Play 等服務, 作為主要的獲利來源 Android 的版本 Android 版本 釋出日期 代號 1.5 2009/4/30 Cupcake( 紙杯蛋糕 ) 1.6 2009/9/15 Donut( 甜甜圈 ) 2.0/2.1 2009/10/26 Eclair( 閃電泡芙, 法式奶油夾心甜點 ) 2.2 2010/5/20 Froyo( 冷凍乳酪 ) 2.3 2010/12/6 Gingerbread( 薑餅 ) 3.0/3.1/3.2 2011/2/22 Honeycomb( 蜂窩 ) 4.x 2011/10/19 Ice Cream Sandwich( 冰淇淋三明治 ) 4.1/4.2/4.3 2012/6/28,10/29, Jelly Bean( 雷根糖 ) 2013/7/24 4.4 2013/9/3 KitKat( 奇巧巧克力 ) 中壢高商 1

Android 的系統架構 Android App Android 作業系統的系統架構像是在蛋糕店購買的一個多層蛋糕, 在行動裝置的硬體和使用者之間是 Android 軟體堆疊 (Android Software Stack), 如右圖所示 : Android App 的組成元件 Android App 的組成有四種元件 : 活動 內容提供者 廣播接收器 服務 如同網頁中的超鏈結 中壢高商 2

活動 (Activities) 活動是 Android App 與使用者互動的元件, 用來定義使用者經驗, 它也是唯一可以讓使用者看到的元件, 即使用介面的螢幕畫面, 一個活動就是使用者在行動裝置上看到的單一螢幕畫面 Android App 可以建立一至多個活動來處理 App 所需的不同互動, 如同 Web 網站擁有多頁網頁 內容提供者 (Content Providers) 內容提供者是在不同 Android App 之間分享資料的介面, 它是一組封裝的資料, 提供客製化 API 來進行讀寫 例如 : 聯絡人應用程式並沒有儲存任何聯絡人資料, 它是透過內容提供者取得聯絡人資訊 : 姓名 地址和電話等, 換句話說, 其他需要使用聯絡人資料的 Android App, 也都可以透過同一個內容提供者來存取聯絡人資料 中壢高商 3

廣播接收器 (Broadcast Receivers) 廣播接收器顧名思義是用來接收廣播且做出回應, 這是 Android 實作系統層級的廣播與回應機制, 事實上,Android 系統本身就會常常發出廣播, 例如 : 接到來電 收到簡訊 啟動相機裝置 時區改變 系統開機 電池剩餘電量過低或使用者選擇偏好語言時,Android 系統都會發出廣播 服務 (Services) 服務是在背景執行的行程, 可以執行和活動一樣的工作, 只是沒有使用介面 例如 : 在播放背景音樂時, 之所以不會打斷我們發送簡訊或收發電子郵件, 因為它是在背景執行的服務, 才能讓音樂播放不中斷 Android 作業系統本身就內建許多系統服務, 我們可以直接使用 API 來使用這些服務, 例如 : 定位服務 服務的生命周期 中壢高商 4

意圖 (Intents) 意圖是一個啟動其他 Android 活動 服務和廣播接收器的非同步訊息 意圖可以告訴 Android 作業系統我想作什麼? 執行什麼動作? 作業系統是使用意圖篩選 (Intent Filters) 來找出可以處理的元件, 例如 : 啟動其他活動 告訴指定服務可以啟動或停止與送出廣播 活動 A 送出看照片的意圖 啟動活動 B 顯示照片 Android App 的主要開發方式 方法一 :Eclipse IDE+Android SDK( 原生 ) 方法二 :HTML5 方案 (Hybrid)- 瀏覽器 jquery Mobile+PhoneGap http://fju.app.appery.io/weather.html http://fju1.app.appery.io/ 中壢高商 5

Android App 開發使用的程式語言 目前教學上,Android App 開發使用的程式語言主要有 : Java 語言 ( 物件導向程式語言 ) App Inventor( 拼圖 ) HTML5+JavaScript( 網頁程式語言 ) Basic4android+BASIC C++ 語言 (RAD Studio XE 6) C# 語言 (Xamarin) Basic4android 簡介 Basic4android(B4A) 是以色列 Anywhere Software 公司開發的整合開發環境, 這是針對 Android 平台開發的一套簡單且功能強大的快速應用程式開發工具 (Rapid Application Development,RAD) Basic4android 是一套 Android App 的整合開發環境 IDE, 可以讓 Visual Basic 語言的使用者直接使用 BASIC 語言來開發 Android App,B4A 能夠將開發者撰寫的 BASIC 程式碼編譯轉換成 Java 程式碼來建立原生 Android App, 換句話說, 其執行效能並不會打折扣 中壢高商 6

Basic4android 的基本架構 B4A 函數庫 B4A IDE 為什麼 Basic4android 比較簡單 將 Java 物件導向程式設計降為 VB 語言的物件基礎程式設計 (B4A 本身也提供有物件導向語法 ) 使用函數庫簡化 Android 權限設定, 和擴充新功能, 新版 Android 功能是使用 B4A 函數庫來擴充 每一個函數庫就是一至多個物件, 可以存取屬性和呼叫方法來使用所需的功能 ( 原生是使用物件導向的繼承和覆寫等語法 ), 例如 :GPS 資料庫 網路存取 (JSON) 等 最新 B4J 免費開發工具, 使用和 B4A 的相同觀念, 可以讓使用者以 VB 語言開發跨 Windows Mac 和 Linux 的視窗應用程式 ( 使用 JavaFx) 中壢高商 7

Basic4android VS App Inventor App Inventor 的開發目的主要是針對沒有程式設計經驗的使用者, 使用簡單的拼圖來建立程式, VB 開發者仍然需要學習全新語言, 再加上目前業界幾乎不可能使用此工具開發 App, 所以純萃只有教學用途, 而且很難和 Android SDK 接軌 Basic4android 是使用 BASIC 語言, 可以延續已有 VB 程式設計經驗, 再加上其架構是對應 Android SDK, 且最終會編譯成 Java 程式碼, 不只可以獨立開發 App, 更可以進一步作為橋樑來學習原生 Java 的 Android App 開發 所以, 本書架構事實上和 Android SDK 圖書十分相似 Basic4android 的版本 Basic4android 企業版 : 提供 2 年免費升級服務, 和 Basic4android 社群的完整存取權限 Basic4android 標準版 : 提供 2 個月免費升級服務, 和 Basic4android 社群的完整存取權限 Basic4android 測試版 :Basic4android 免費試用版本, 提供 30 天免費試用, 一個限制功能版本的 Basic4android, 只能使用核心函數庫來建立基本 Android App, 而且沒有 Basic4android 社群的完整存取權限, 只能下載部分 B4A 範例專案 中壢高商 8

Basic4android 的官網 http://www.basic4ppc.com/ ppc 是 Pocket PC 下載與安裝 B4A 開發環境 步驟一 : 下載與安裝 JDK JDK 7 以上版本 步驟二 : 下載與安裝 ADT Bundle 最新 4.4, 本書使用 4.22 版, 目標版本是 4.0 步驟三 : 下載與安裝 Basic4android B4A 2.71 測試版 步驟四 : 啟動與設定 Basic4android 步驟五 : 建立 Android 模擬器 AVD 下載與安裝 B4A 開發環境.ppt 中壢高商 9

建立第一個 AndroidApp 步驟一 : 新增與儲存 B4A 的 Android App 專案 步驟二 : 啟動 Android 模擬器 步驟三 : 編譯與執行 Android App 建立第一個 AndroidApp.ppt 專案 :Lesson1\HelloWorld\HelloWorld.b4a 使用 B4A 開發 Android App 的基本步驟 Step 1. 新增 B4A 專案 : 建立 B4A 專案和替每一個 B4A 專案新增專屬的資料夾 Step 2. 建立圖形使用介面 : 開啟 GUI 設計工具建立圖形使用介面, 依照規劃的版面配置新增所需的介面元件來編排使用介面 Step 3. 設定介面元件屬性 : 設定元件屬性值來調整尺寸 字型 色彩和外觀等 Step 4. 建立和撰寫事件處理程序的程式碼 : 依照活動 服務或介面元件觸發的事件, 例如 :Button 的 Click 事件, 建立所需的事件處理程序和撰寫處理的程式碼 Step 5. 編譯與執行 Android App: 在 Windows 開發電腦編譯 Android App, 和連接實機或啟動 Android 模擬器來測試執行 其建立步驟和 VB 視窗應用程式沒有什麼不同 中壢高商 10

B4A 活動模組的程式結構 Sub Process_Globals End Sub Sub Globals End Sub Sub Activity_Create(FirstTime As Boolean) End Sub Sub Activity_Resume End Sub Sub Activity_Pause (UserClosed As Boolean) End Sub B4A 活動模組的程式結構 - 說明 Process_Globals 程序 : 定義整個 App 各活動模組都能存取的全域變數 ;Globals 是目前活動模組可以存取的全域變數 Activity_Create(FirstTime As Boolean) 程序 : 當活動建立時呼叫的程序, 程序參數 FirstTime 判斷是否是第 1 次建立活動 Activity_Resume 程序 : 在建立活動呼叫 Activity_Create 後馬上呼叫的程序來進入執行狀態, 或從背景暫停狀態返回前景執行狀態時呼叫 Activity_Pause(UserClosed As Boolean) 程序 : 當活動從前景執行狀態進入背景暫停狀態時呼叫此程序, 程序參數 UserClosed 是布林值, 可以判斷是否是使用者操作才進入背景 中壢高商 11

B4A 的命名規則 名稱不能使用 B4A 語言的關鍵字和 B4A 內建物件的名稱 ( 不區分英文大小寫, 例如 : 因為內建 File 物件, 所以命名不可以是 File 或 file) 名稱必須是英文字母開頭, 不能包含句點. 運算子 括號或空白, 只能是英文字母 A-Z a-z 數字 0-9 和底線 _ 名稱不區分英文字母大小寫,abc Abc abc abc ABc 和 ABC 等都是同一個名稱 在宣告的有效範圍內須唯一 B4A 的關鍵字 B4A 語言的關鍵字和其他程式語言有些不同, 它是指核心函數庫 (Core Library) 的 Keywords 型態成員, 除了語法關鍵字外, 還包含一些存取內建物件屬性 數學 檔案處理 對話方塊等方法的成員, 例如 : Msgbox( 訊息視窗 ) 和 Sender( 事件來源物件 ) 等 中壢高商 12

B4A 的註解 B4A 的註解文字是使用 ' 符號開始的列, 或在程式列上此符號之後的文字內容 ( 不支援 Visual Basic 語言的 REM 關鍵字 ), 如下所示 : ' 大家好 Dim size1,size2 As Int ' 變數宣告 程式敘述的結束 B4A 可以使用 : 符號標示程式敘述的結束, 我們可以在同一列程式碼包含 2 個程式敘述, 第 1 個敘述是宣告 size 變數, 第 2 個指定 size 變數值, 如下所示 : Dim size As Int : size = 10 不同於 Visual Basic 語言的 : 符號是標示程式敘述的結束,B4A 隱含是一個換行字元 ( Carriage Return), 加上 : 表示是換行成二列程式碼, 而非程式敘述結束 中壢高商 13

太長的程式列 B4A 的單行程式碼如果太長, 基於程式編排的需要, 我們可以將它分成兩列來排列, 此時, 請在第 1 列程式碼的最後加上 _ 符號, 如下所示 : Dim size1,size2,size3,size4,size5, _ size6,size7,size8,size9 As Int 不支援 VS 2010 之後版本的隱含字串連接 基本資料型態 ( 源於 Java 語言 ) B4A 語言支援 8 種基本資料型態, 如下表所示 : 資料型態 說明 範圍最小值 範圍最大值 Boolean 布林 False True Byte 位元組 8Bits -128 127 Short 短整數 16Bits -32768 32767 Int 整數 16Bits -2147483648 2147483647 Long 長整數 64Bits -9223372036854775808 9223372036854775807 Float 單精度浮點數 1.4E-45 3.4028235 E38 32Bits Double 雙精度浮點數 64Bits 2.2250738585072014 E - 308 1.7976931348623157 E 308 Char 字元 N/A N/A 中壢高商 14

基本資料型態 ( 對比 VB 語言 ) B4A 語言支援 8 種基本資料型態, 如下表所示 : B4A 資料型態 Boolean Byte Short Int Long Float Double Char VB 資料型態 Boolean Byte Short Integer Long Single Double Char 非基本資料型態 除了基本資料型態的其他資料型態, 例如 : 使用 Type 關鍵字宣告的自訂型態 函數庫的物件 陣列或字串等都屬於非基本資料型態 其中陣列與字串型態的簡單說明, 如下表所示 : 資料型態 String Array 說明 字串, 一種字元陣列 陣列, 相同資料型態的變數集合, 使用索引值來存取 中壢高商 15

變數宣告 在 B4A 是使用 Dim 關鍵字宣告變數,As 關鍵字指定資料型態,B4A 不支援 Visual Basic 語言的常數 如下所示 : Dim Sum As Float Dim size1,size2 As Int Dim Capital, Interest, Rate As Double 程式碼宣告 1 個 Float 型態 2 個整數 Int 型態和 3 個 Double 型態的變數 B4A 在同一列宣告的多個變數可以分別指定不同的資料型態, 如下所示 : Dim name As String,score As Int 變數的初值 我們可以在宣告變數同時指定變數的初值, 如下所示 : Dim size3 As Int = 100 Dim Grade1 = 56.7, Grade2 As Float = 78.5 Dim i = 0, j = 2, k = 15 As Int Dim name = "Joe" As String, rate = 1.1 As Double, flag = True As Boolean 程式碼在宣告多個變數的同時就指定初值, = 等號可以在型態之後, 也可以在 As 關鍵字之前 中壢高商 16

自動 ( 隱含 ) 資料型態轉換 B4A 會自動依需求執行型態轉換, 例如 : 自動將數字轉換成字串 ; 字串轉換成數字 明確資料型態轉換 B4A 明確執行型態轉換的作法是直接將它指定給欲轉換型態的變數, 如下所示 : Dim intgrade1, intgrade2 As Int Dim dblgrade1 = 56.7, dblgrade2 = 78.5 As Double 將 Double 變數型態明確轉換成 Int 變數時, 只需使用指定敘述指定變數值即可, 如下所示 : intgrade1 = dblgrade1 intgrade2 = dblgrade2 程式碼將 Double 型態的值轉換成整數型態的值, 即變數 intgrade1 和 intgrade2 的值 中壢高商 17

算術運算式 算術運算式就是使用算術運算子建立的運算式, 其說明 (VB 語言的指數運算子是 ^) 如下表所示 : 運算子 說明 運算式範例 Power 指數 Power(7, 2) = 49, 即 7 2 - 負號 -7 * 乘法 2 * 7 = 14 / 除法 7 / 2 = 3.5 Mod 餘數 7 Mod 2 = 1 + 加法 7 + 2 = 9 - 減法 7 2 = 5 關係運算式 關係運算子沒有優先順序的分別, 通常是使用在迴圈和條件敘述作為判斷條件, 如下表所示 : 運算子 說明 運算式範例 結果 = 等於 6 = 4 False <> 不等於 6 <> 4 True < 小於 6 < 4 False > 大於 6 > 4 True <= 小於等於 6 <= 4 False >= 大於等於 6 >= 4 True 不支援 VB 語言的 Is, IsNot 和 Like 運算子 中壢高商 18

布林運算式 當迴圈和條件敘述的判斷條件不只一個時, 我們可以使用布林運算子連接多個關係運算式來建立更複雜的判斷條件, 其說明如下表所示 : 運算子 運算式範例 結果 Not (A) Not (5 > 3) False Not (B) Not (4 <= 2) True A AND B 5 > 3 AND 4 <= 2 False A OR B 5 > 3 OR 4 <= 2 True B4A 不支援 VB 語言的 Xor, AndAlso 和 OrElse 運算子 VB Not A;B4A 是 Not (A) 字串連接運算子 B4A 的字串連接運算子是 &, 可以連接多個字串變數或字串值, 其說明如下所示 : 運算子 說明 運算式範例 & 字串連接 "ab" & "cd" = "abcd" B4A 語言的換行符號是 CRLF 關鍵字 " 符號是 Quote 中壢高商 19

If/Then/Else If 條件敘述 If/Then/Else If 條件敘述新增 Else If 關鍵字 (VB 語言在 Else If 之間沒有空格 ) 建立多選一條件敘述, 如下 : If dayvalue = 1 Then out = out & " 星期日 " & CRLF Else If dayvalue = 2 Then out = out & " 星期一 " & CRLF Else If dayvalue = 3 Then out = out & " 星期二 " & CRLF Else If dayvalue = 7 Then out = out &" 星期六 " & CRLF Else out = out & " 無法分辨是星期幾 " & CRLF End If Select/Case 條件敘述 Select/Case 多選一條件敘述可以依照符合條件執行不同區塊的程式碼 (VB 是 Select Case), 如下所示 : Select dayvalue Case 1: out = out & " 周日假期 " & CRLF Case 2, 3, 4, 5, 6 out = out & " 工作天 " & CRLF Case 7: out = out & " 周末假日 " & CRLF Case Else out = out & " 無法分辨是星期幾 " & CRLF End Select 中壢高商 20

For/Next 迴圈 For/Next 迴圈可以執行固定次數的迴圈, 使用 Step 值來增加或減少計數器, 如果 Step 為 1 可以省略 Step 關鍵字 (Next 之後不支援加上變數 i, Next i) 例如 : 使用 For/Step/Next 迴圈, 每次增加 1, 執行 1 加到 10 的迴圈, 如下所示 : For i = 1 To 10 sum = sum + i out = out & i & " " Next out = out & CRLF & "1 加到 10: " & sum & CRLF Exit 關鍵字 在迴圈尚未到達結束條件時, 我們可以使用 Exit 關鍵字強迫跳出迴圈來結束迴圈執行,B4A 只需使用 Exit 關鍵字 ;Visual Basic 是 Exit Do 或 Exit For, 如下所示 : For counter = 1 To 100 If counter > 10 Then Exit sum = sum + counter out = out & counter & " " Next 中壢高商 21

B4A 不支援後測式迴圈 B4A 不支援後測式迴圏, 我們可以使用 Do/Loop 迴圈, 然後在無窮迴圈使用 If 條件配合 Exit 關鍵字來中斷迴圈執行來建立後測式迴圈, 如下所示 : counter = 1 : sum = 0 Do While counter >= 1 sum = sum + counter out = out & counter & " " counter = counter + 1 If counter > 10 Then Exit Loop out = out & CRLF & "1 加到 10: " & sum & CRLF Continue 關鍵字 B4A 的 Continue 關鍵字可以在迴圈尚未執行完前, 馬上執行下一次迴圈, 如下所示 : For counter = 0 to 100 If counter Mod 2 = 0 Then Continue Next B4A 只需 Continue 關鍵字 ;Visual Basic 語言是 Continue Do 或 Continue For 中壢高商 22

例外處理敘述 B4A 支援和 Visual Basic 語言相同的 Try/Catch/End Try, 不過,B4A 不支援 Finally 程式區塊, 如下所示 : Try Dim In As InputStream In = File.OpenInput(File.DirInternal, "MissingFile.txt") Catch lbloutput.text = LastException.Message End Try 在 Catch 使用 LastException 預建物件取得進一步的例外資訊, 即 Message 屬性 宣告一維陣列 B4A 陣列同樣也是使用 Dim 關鍵字宣告, 我們可以在宣告時指定陣列尺寸 例如 : 一維整數陣列的宣告, 如下所示 : Dim Names(3) As String 程式碼宣告 3 個元素的 Names 陣列, 括號是元素數 (Visual Basic 陣列是最大索引值 ), 其索引值是從 0 開始, 範圍是 0~2 共 3 個元素 我們可以使用變數指定陣列尺寸, 如下所示 : Dim arrsize As Int : arrsize = 3 Dim Names(arrSize) As String 中壢高商 23

一維陣列初始設定 B4A 陣列的初值需要使用 Array 關鍵字來宣告, 如下所示 : Dim Grades() As Int Grades = Array As Int(53, 76, 85) 程式碼宣告一維整數陣列 Grades 但沒有指定尺寸, 其尺寸是 Array As 後方型態 Int 括號中的初值個數, 陣列索引的最大值就是初值個數減一, 即 2 For/Next 迴圈走訪一維陣列 我們可以使用 For/Next 迴圈走訪陣列的每一個元素, 如下所示 : For i = 0 To Names.Length - 1 out = out & Names(i) & "-" & Grades(i) & CRLF Next 程式碼使用陣列物件的 Length 屬性取得陣列尺寸, 減一就是最大索引值, 可以從 0 至最大索引值來一一取出每一個元素 中壢高商 24

建立沒有參數和傳回值的程序 如果 Sub 宣告的程序沒有參數, 在宣告時不加上空括號, 呼叫時一定不能使用空括號 ( 如果有空括號,B4A 編譯器會誤認為是陣列 ), 例如 : 更改 App 標題文字的 ChangeTitle 程序, 如下所示 : Sub ChangeTitle Activity.Title = " 建立 B4A 程序 " End Sub 程序在 Sub 關鍵字之後是程序名稱, 因為沒有參數, 可以加上空括號, 即 ChangeTitle(), 也可以不加 在 Sub/End Sub 之間是程序的程式區塊 呼叫沒有參數和傳回值的程序 呼叫程序只需使用 ChangeTitle(B4A 不支援 Visual Basic 語言的 Call 關鍵字 ), 不可以使用 ChangeTitle(), 如下所示 : ChangeTitle 中壢高商 25

建立擁有參數沒有傳回值的程序 在程序名稱後的括號可以加上傳入參數, 如果不只一個, 請使用, 號分隔, 例如 : 顯示輸出結果的 PrintResult 程序, 如下所示 : Sub PrintResult(str As String) lbloutput.text = str End Sub 程序擁有一個參數 str, 其資料型態是 String 呼叫擁有參數沒有傳回值的程序 因為程序擁有參數, 所以在呼叫時, 除了程序名稱, 還需要使用括號來指定傳入值, 如下所示 : PrintResult(out) 程序呼叫傳入的參數值就是變數 out 的值 中壢高商 26

建立擁有參數和傳回值的程序 B4A 的程序也是函數一樣可以傳回值, 所以可以指定傳回值型態, 例如 : 計算利息的 CalInterest 程序, 如下所示 : Sub CalInterest(capital As Double, rate As Double) As Double Dim amount As Double amount = capital * rate / 100 Return amount End Sub 程序擁有 2 個參數, 在 As 關鍵字之後是傳回值型態,B4A 程序可以使用 Return 關鍵字來傳回值 呼叫擁有參數和傳回值的程序 因為程序有傳回值, 在呼叫程序時通常是位在運算式指定敘述的右邊, 如下所示 : interest = CalInterest(capital, rate) 不支援 VB 語言的 Function/End Function 中壢高商 27

傳值呼叫 B4A 是依資料型態區分傳值或傳址呼叫 傳值呼叫是指將變數的值傳入程序, 所以不會更改傳入的變數值,B4A 基本資料型態的變數和 String 型態都是使用傳值呼叫, 如下所示 : Sub CallByVal(value As Int, str As String) value = 45 str = " 江小魚 " End Sub 傳址呼叫 傳址呼叫是將變數實際儲存位址傳入程序,B4A 的非基本資料型態 (String 除外 ) 參數都是使用傳址呼叫, 它是將複製的參考傳入程序, 可以更改參數成員 ( 例如 : 陣列元素值 ), 但不能更變數本身的參考 ( 即陣列變數本身 ), 如下所示 : Sub CallByRef(Tests() As Int) Dim MyArr(1) As Int MyArr(0) = 30 Tests(0) = 50 Tests = MyArr End Sub 中壢高商 28

區域範圍 在 B4A 程序內宣告的變數, 只能在此程序的程式區塊中使用, 其他程序並不能存取, 稱為區域變數 ( 變數 a 和 c), 如下所示 : Sub SubA() Dim a, c As Int a = 3 c = 10 End Sub 全域變數範圍 -Process_Globals 程序 Process_Globals 程序 : 在此程序宣告的變數稱為行程變數, 可以在行程中 B4A 專案的所有模組存取, 不過, 不是所有型態都可以宣告成行程變數, 例如 : 介面元件的物件就不可以, 如下所示 : Sub Process_Globals Dim g As Int : g = 5 End Sub 中壢高商 29

全域變數範圍 -Globals 程序 Globals 程序 : 在此程序宣告的變數稱為活動變數, 可以在目前活動模組的所有程序來存取, 如下所示 : Sub Globals Dim lbloutput As Label Dim a As Int : a = 1 Dim b As Int : b = 2 End Sub 變數範圍的注意事項 在 Process_Globals 和 Globals 程序宣告全域變數後, 其他程序就算宣告同名變數, 存取的仍然是全域變數, 因為除了第 1 次宣告變數外, 在 B4A 重複宣告同名變數, 當轉換成 Java 程式碼後, 程式碼只是初始變數成為預設值, 並不會建立全新變數 中壢高商 30

B4A 的集合物件 B4A 支援兩種集合物件, 如下所示 : List 物件 Map 物件 B4A 有很多物件的方法都是使用 List 和 Map 物件作為參數或傳回值, 例如 : 檔案處理和建立選擇對話方塊 專案 :Lesson3\ 兒童數學訓練 \ 兒童數學訓練.b4a GUI 工具 - 建立兒童數學訓練 步驟一 : 啟動 B4A 新增專案 步驟二 : 啟動 Android 模擬器 步驟三 : 開啟 GUI 設計工具連接 Android 模擬器 步驟四 : 在 GUI 設計工具新增介面元件 步驟五 : 在 GUI 設計工具設定介面元件的屬性 步驟六 : 自動產生程式碼與儲存版面配置檔 步驟七 : 編輯事件處理程序的程式碼 步驟八 : 編譯與執行 Android App 中壢高商 31

B4A 的 GUI 介面元件 VS VB 控制項 B4A 介面元件 Visual Basic 控制項 Activity Form Button Button CheckBox CheckBox EditText TextBox ImageView PictureBox Label Label ListView ListView Panel Panel RadioButton RadioButton ScrollView N/A SeekBar TrackBar( 類似 ) Spinner N/A TabHost TabControl ToggleButton N/A WebView WebBrowser 屬性 Name Type Event Name Parent Left Top Width Height Enabled Visible Tag GUI 介面元件的共同屬性 說明 元件名稱, 建議使用有意義的名稱, 而且在開頭使用 3 個字元來標示元件種類, 例如 :lbl btn edt 等 元件型態的唯讀屬性 處理事件的事件處理程序名稱, 預設與 Name 屬性值相同 事件處理程序名稱的格式是此屬性值加上 _ 符號, 再加上事件名稱, 例如 :Event Name 屬性值 Button1 的 Click 事件處理程序名稱為 Button1_Click 父元件名稱 ( 有些介面元件是容器元件, 可以包含子元件 ), 最上層是 Activity 活動 與父元件左方邊界的 X 軸座標, 單位是 dip 與父元件上方邊界的 Y 軸座標, 單位是 dip 元件寬度, 單位是 dip 元件高度, 單位是 dip 此元件是否可以使用,True 是可以 ; 否為不可以 此元件是否可見,True 是可見 ; 否為隱藏 此屬性是用來儲存額外資訊, 以簡化程式設計 中壢高商 32

介面元件 Activity AutoCompleteEditText Button CheckBox EditText HorizontalScrollView ImageView Label ListView Panel RadioButton ScrollView SeekBar Spinner TabHost ToggleButton WebView 事件種類 支援的事件種類 Click LongClick Touch KeyPress KeyUp WindowFocusChanged ItemClick TextChanged EnterPressed FocusChanged Click LongClick Down Up CheckedChange EnterPressed FocusChanged TextChanged ScrollChanged Click LongClick Click LongClick ItemClick ItemLongClick Click LongClick Touch CheckedChange ScrollChanged ValueChanged ItemClick Click LongClick TabChanged CheckedChange PageFinished OverrideUrl UserAndPasswordRequired 建立事件處理程序 我們可以在 B4A 專案新增事件處理程序的程式碼, 實務上, 主要是從 GUI 設計工具自動產生元件宣告和事件處理程序, 當然, 在程式碼編輯器一樣可以自行輸入程式碼來建立事件處理程序 在 GUI 設計工具產生事件處理程序 在程式碼編輯器自行輸入事件處理程序 中壢高商 33

介面元件的事件處理程序 B4A 和 Visual Basic 語言都是使用事件驅動程式設計來建立應用程式, 整個程式結構就是在處理各種事件的事件處理程序, 當我們使用 GUI 設計工具新增介面元件 ( 如同 Visual Basic 控制項 ) 後, 例如 : 新增名為 mybutton 按鈕元件, 就可以在 Main 活動模組建立處理 Click 事件的事件處理程序, 如下所示 : Event Name 屬性值, 不是 Name 屬性 Sub mybutton_click Msgbox(" 按下按鈕!", "") End Sub 專案 :Lesson4\Spinner 清單元件 \ 匯率轉換程式.b4a Spinner 清單元件 Android 提供兩種清單元件 : Spinner 和 ListView 元件, 可以顯示一長串清單項目來供使用者選擇 Spinner 元件類似 Windows 作業系統的下拉式清單方塊, 它是一個單選的清單元件 Spinner 中壢高商 34

建立 Spinner 清單元件 在 B4A 的 GUI 設計工具可以執行 Add View>Spinner 指令新增 Spinner 元件, 不過, 沒有提供介面來新增選項, 我們需要使用程式碼呼叫 Add() 方法來新增選項, 如下所示 : Dim spntype As Spinner spntype.add(" 美金 ") spntype.add(" 日元 ") Add() 方法新增選項 spntype.add(" 人民幣 ") Spinner 清單元件的 ItemClick 事件 Spinner 元件是一個下拉式清單方塊, 當使用者選擇選項後, 就觸發 ItemClick 事件, 在事件處理程序處理選擇, 如下所示 : Sub spntype_itemclick(position As Int, Value As Object) Select Position Case 0 : rate = 29.9 ' 美金 Case 1 : rate = 0.2949 ' 日元 Case 2 : rate = 4.861 ' 人民幣 End Select End Sub 中壢高商 35

專案 :Lesson4\ListView 清單介面 I\ 匯率轉換程式 II.b4a ListView 清單介面 ListView 元件是各種行動裝置作業系統相當常見的使用介面, 實務上, 如果整個活動只擁有一個 ListView 元件, 此時的 ListView 元件是一個選單用途的元件, 而且, 通常就是 Android App 的主選單 ListView 建立單行項目的 ListView 元件 在 B4A 的 GUI 設計工具可以執行 Add View>ListView 指令新增 ListView 元件, 不過, B4A 沒有提供介面來新增選項, 我們需要自行使用程式碼來新增選項, 依需求可以建立單行和兩行內容的項目 ListView 元件呼叫 AddSingleLine() 方法新增 ListView 元件的單行選項, 參數是選項名稱的字 串, 如下所示 : AddSingleLine() 方法 Dim ListView1 As ListView 新增選項 ListView1.AddSingleLine(" 陳會安 ") 中壢高商 36

ListView 元件單行項目的傳回值 ListView 元件的項目還可以指定所需的傳回值, 如下所示 : Dim lsvtype As ListView lsvtype.addsingleline2(" 美金 ", 29.9) lsvtype.addsingleline2(" 日元 ", 0.2949) lsvtype.addsingleline2(" 人民幣 ", 4.861) AddSingleLine2() 方法新增選項 AddSingleLine2() 方法新增 ListView 元件的單行選項, 第 2 個參數指定傳回值, 可以呼叫 GetItem() 方法或在 ItemClick 事件處理程序取得此傳回值, 以此例的傳回值是匯率 單行項目 ListView 元件的 ItemClick 事件 ListView 元件當使用者選擇選項後, 就會觸發 ItemClick 事件, 如下所示 : Sub ListView1_ItemClick(Position As Int, Value As Object) Dim amount As Double = edtamount.text lbloutput.text = " 兌換成新台幣的金額 : " & (amount * Value) End Sub 第 1 個參數是選項索引位置 ( 從 0 開始 ), 第 2 個參數是選項值,AddSingleLine() 方法新增選項, 其值是參數的選項名稱 ;AddSingleLine2() 方法新增選項, 其值是第 2 個參數 Value 的傳回值 中壢高商 37

專案 :Lesson4\ 訊息視窗 \ 猜數字遊戲.b4a B4A 支援源於 Visual Basic 的 Msgbox 訊息視窗和 Android 原生的 Toast 彈跳訊息框 訊息視窗 Msgbox Toast Msgbox 訊息視窗 訊息視窗可以在對話方塊顯示一段訊息和一個 OK 按鈕, 例如 : 在 Android App 建立一個名為 猜數字遊戲 的訊息視窗, 顯示開始遊戲的訊息文字, 如下所示 : Msgbox(" 請輸入數字開始遊戲 ", " 猜數字遊戲 ") 第 1 參數是訊息文字, 第 2 個參數是標題文字 確認訊息視窗是使用 Msgbox2() 方法, 如下所示 : Dim result As Int result = Msgbox2(" 共猜 : " & time & _ " 次, 按 [ 確定 ] 鈕再玩一次.", " 猜數字遊戲 ", _ " 確定 ", "", " 結束 ", Null) 中壢高商 38

Msgbox 訊息視窗 - 取得使用者操作 Msgbox2() 方法的傳回值是使用者按下了哪一個按鈕, 我們可以使用 If 條件來判斷使用者的操作, 如下所示 : If result = DialogResponse.POSITIVE Then End If 條件判斷是否按下 POSITIVE 鈕, DialogResponse.CANCEL 是 CANCEL 鈕 ; DialogResponse.NEGATIVE 是 NAGATIVE 鈕 Toast 彈跳訊息框 Toast 訊息是在行動裝置顯示一個彈跳訊息框, 可以在此訊息框顯示一段訊息文字, 且只保留一段時間 例如 : 使用 Toast 彈跳訊息框顯示目前猜測的數字太大, 如下所示 : ToastMessageShow(num & " 數字太大...", False) ToastMessageShow() 方法是關鍵字, 第 1 個參數是顯示的訊息字串, 在第 2 個參數決定顯示時間, 值 False 較短 (2 秒 );True 顯示時間較長 ( 3 秒 ) 中壢高商 39

專案 :Lesson4\ 選項選單 \ 溫度轉換程式.b4a 選項選單 Android 的選項選單 ( Options Menu) 是當使用者按下行動裝置的 MENU 鍵後, 在下方顯示的選單 Options Menu 新增選項選單 B4A 的 Activity 物件是活動本身, 此物件提供 3 個方法來新增選項選單, 第 1 個方法是建立單純文字項目的選項, 如下所示 : Activity.AddMenuItem(" 轉成攝氏 ", "ConvertC") AddMenuItem() 方法可以新增選單的選項, 第 1 個參數是選項名稱, 第 2 個參數是事件名稱 中壢高商 40

選項的事件處理 當使用者選擇選項, 就會產生 Click 事件, 呼叫名為 ConvertC_Click 的事件處理程序 (ConvertC 是第 2 個參數的事件名稱 Event Name), 如下所示 : Sub ConvertC_Click End Sub B4A 模組種類 活動模組 (Activity Modules): 每一個活動都擁有專屬活動模組, 負責處理活動的生命周期, 對比 VB 的 Form 表單, 多活動對比多表單 程式碼模組 (Code Modules): 程式碼模組的內容是程式碼, 它是一個工具箱用來支援 Android App 開發, 在程式碼模組之中不允許擁有任何活動, 對比 VB 的 Module 模組 服務模組 (Service Modules): 每一個 Android 服務都擁有對應的服務模組, 這是一些在背景執行的工作 類別模組 (Class Modules): 類別模組是 Basic4android 2.0 版新增的模組, 這是一種建立物件導向程式設計類別的模組 中壢高商 41

VB 專案 B4A 專案 ( 步驟 ) Step 1: 參考 VB 表單介面的控制項, 在 B4A 使用 GUI 工具建立對應的使用介面, 建議使用相同的 Name 屬性值 Step 2 : 使用 B4A 的 GUI 工具建立介面元件所需的事件處理程序 Step 3: 複製事件處理程式碼, 從 Form1.vb 程式檔案至 B4A 的事件處理程序 Step 4: 將 VB 程式碼修改成 B4A 的 VB 程式碼 VB 專案 B4A 專案 ( 使用介面 ) 專案 :VS2012\ 井字遊戲.sln 專案 :Lesson4\ 井字遊戲 \ 井字遊戲.b4a 中壢高商 42

VB 專案 B4A 專案 ( 全域變數 ) 專案 :VS2012\ 井字遊戲.sln 專案 :Lesson4\ 井字遊戲 \ 井字遊戲.b4a VB 專案 B4A 專案 ( 函數 ) 專案 :VS2012\ 井字遊戲.sln 專案 :Lesson4\ 井字遊戲 \ 井字遊戲.b4a 中壢高商 43

VB 專案 B4A 專案 ( 事件處理程序 ) 專案 :VS2012\ 井字遊戲.sln 專案 :Lesson4\ 井字遊戲 \ 井字遊戲.b4a 第二個 VB->B4A 轉換範例 專案 :VS2012\ 拉霸遊戲.sln 專案 :Lesson4\ 拉霸遊戲 \ 拉霸遊戲.b4a 中壢高商 44

B4A 活動的生命周期 Android 程式設計的主要工作是撰寫程式碼來回應 Android App 產生的狀態改變 B4A 活動簡化了 Android 活動的生命周期 ( 沒有停止 ), 同樣的, 我們重視的是不同狀態之間的轉換, 如下圖所示 : 活動生命周期的狀態說明 -1 啟動狀態 : 當 Android App 不在記憶體中時, 執行程式就是進入啟動狀態,B4A 會依序呼叫 Activity_Create 和 Activity_Resume 兩個程序來轉換至執行狀態 執行狀態 : 活動位在執行狀態 ( 移至前景 ) 表示目前在螢幕上顯示且與使用者進行互動,Android 作業系統在任何時間點都只會有一個處於執行狀態的活動, 執行狀態的活動擁有最高權限使用記憶體與資源來提昇程式執行效率, 以便更快回應使用者的操作 中壢高商 45

活動生命周期的狀態說明 -2 暫停狀態 : 暫停狀態的活動是從前景移至背景, 此時的 App 仍然保留在記憶體, 只是使用者看不到,B4A 會呼叫 Activity_Pause 程序, 從執行狀態轉換至暫停狀態 移除狀態 : 移除狀態的活動是已經刪除的活動 ( 可呼叫 Activity.Finish() 方法刪除 ), 表示已經釋放活動佔用的資源且不存在記憶體 活動管理員會自動依據記憶體的使用情況, 決定活動是否需要刪除, 以便空出更多記憶體讓執行狀態的活動能夠正常的運作 活動生命周期的事件 在 B4A 活動的整個生命周期中, 共有 3 個程序會在活動的狀態轉換時呼叫, 這些程序可以讓開發者回應狀態改變, 撰寫所需的 B4A 程式碼 (B4A 簡化了 Android 活動的生命周期 ), 如下圖所示 : 中壢高商 46

Activity_Create(FirstTime As Boolean) 程序 當使用者啟動 Android App, 或更改裝置設定 ( 活動會刪除後再建立 ), 例如 : 旋轉螢幕, 就會建立活動和呼叫 Activity_Create 程序, 此程序的主要目的是載入版面配置檔, 或使用程式碼建立版面配置的使用介面 在此程序擁有 1 個 FirstTime 布林參數, 可以判斷對於目前的行程來說, 活動是否是第 1 次建立 ( 值 True 為第 1 次 ), 通常, 我們會使用此參數來初始 Process_Globals 程序宣告的行程變數 Activity_Pause(UserClosed As Boolean) 程序 每一次當活動從前景執行狀態進入背景暫停狀態時, 就會呼叫 Activity_Pause 程序, 或當活動在前景, 但使用者更改裝置設定導致活動暫停和移除時, 也會呼叫 Activity_Pause 程序 程序的參數 UserClosed 是一個布林值, 可以判斷是否是使用者操作才進入背景 中壢高商 47

Activity_Resume 程序 Activity_Resume 程序是在建立活動呼叫 Activity_Create 後馬上呼叫, 然後進入執行狀態, 或從背景暫停狀態返回前景執行狀態時呼叫 當我們啟動 Android App 建立活動, 或在目前活動呼叫 StartActivity() 方法來啟動其他活動, 建立活動的過程一定會依序呼叫 Activity_Create 和 Activity_Resume 程序後, 才進入前景的執行狀態 專案 :Lesson4\ 活動生命周期 \ 活動生命周期.b4a 測試活動生命周期的事件 在 B4A IDE 右方 Logs 標籤可以看到呼叫程序的訊息, 如下圖所示 : 訊息顯示呼叫 Activity_Create 且是第 1 次, 然後呼叫 Activity_Resume, 現在活動已經進入執行狀態, 可以在模擬器看到執行結果, 中壢高商 48

專案 :Lesson4\ 活動生命周期 \ 活動生命周期.b4a 測試活動生命周期的事件 測試一 : 請在模擬器按 F3 鍵執行打電話程式, 然後按 返回 鍵離開打電話程式, 可以再度看到 B4A 程式, 此時在 Logs 標籤可以看到此活動暫停 ( 參數值為 false), 和再度啟動, 如下圖所示 : 專案 :Lesson4\ 活動生命周期 \ 活動生命周期.b4a 測試活動生命周期的事件 測試二 : 現在 B4A 專案是執行狀態, 請按 返回 鍵離開活動, 可以在 Logs 標籤看到再次呼叫 Activity_Pause 程序, 此次的參數值為 true, 因為是使用者結束活動, 如下圖所示 : 中壢高商 49

Canvas 物件的基礎 Canvas 物件可以在其他介面元件或 Bitmap 物件上繪圖, 當我們初始 Canvas 物件指定參數的介面元件後, 就會建立一個 Bitmap 物件, 並且將介面元件的背景複製到此 Bitmap 物件來建立 Canvas 物件, 我們所繪出的圖形是繪在此 Bitmap 物件上 Canvas 物件可以在 Activity 活動 ImageView 元件 Panel 元件和 Bitmap 物件上繪圖, 使用 Canvas 物件繪出的圖形並不會馬上更新使用介面來顯示, 我們需要呼叫目標元件的 Invalidate() 方法來更新元件, 才能顯示繪出的圖形 建立 Canvas 畫布 宣告 Canvas 物件和 Panel 元件 Canvas 物件是一個繪圖物件, 提供繪圖方法和將其他介面元件或 Bitmap 物件建立成畫布, 筆者稱為 Canvas 畫布 首先, 我們需要在 Globals 程序宣告 Canvas 物件和欲繪圖的 Panel 元件, 如下所示 : Sub Globals Dim pnlgraph As Panel Dim cvsgraph As Canvas End Sub 中壢高商 50

建立 Canvas 畫布 - Panel 元件的畫布 我們準備建立一張 Panel 元件的畫布, 如下所示 : cvsgraph.initialize(pnlgraph) cvsgraph.drawcolor(colors.white) 上述程式碼呼叫 Initialize() 方法初始 Canvas 物件, 參數是 Panel 元件, 然後呼叫 DrawColor() 方法繪出畫布的背景色彩, 以此例是白色 現在, 我們可以在活動模組的 Activity_Resume 程序呼叫 Canvas 物件的方法來繪圖 Canvas 畫布是一個長方形區域, 即介面元件或 Bitmap 物件的尺寸, 在左上角為原點, 其座標是 (0, 0),X 軸從左到右 ;Y 軸由上到下, 如右圖所示 : Canvas 畫布的座標系統 中壢高商 51

B4A 專案 :Lesson5\ 基本繪圖功能 \ 基本繪圖功能.b4a Canvas 物件提供基本繪圖方法, 可以讓我們繪出直線 長方形 圓形 橢圓形和文字內容 繪出直線 Canvas 物件是呼叫 DrawLine() 方法繪出直線, 如下所示 : cvsmain.drawline(20dip, 20dip, 160dip, 20dip, Colors.Red, 3dip) 方法的前 2 個參數是第 1 個點 (x1, y1) 座標, 第 3 和 4 個參數是第 2 個點 (x2, y2) 座標, 第 5 個參數是色彩, 最後 1 個參數是線寬度 DrawLine() 方法可以使用第 5 個參數的色彩和第 6 個參數的線條寬度, 從第 1 個點座標繪出一條直線至第 2 個點座標 中壢高商 52

繪出長方形 Canvas 物件繪出長方形方法是 DrawRect() 方法, 不過, 它需要建立 Rect 物件定義長方形尺寸, 如下所示 : Dim rect1 As Rect rect1.initialize(20dip, 40dip, 150dip, 100dip) Initialize() 方法的前 2 個參數是長方形左上角座標 (x1, y1), 即 Rect 物件的 Left 和 Top 屬性, 後 2 個座標是右下角座標 (x2, y2), 即 Right 和 Bottom 屬性 繪出長方形如下所示 : cvsmain.drawrect(rect1, Colors.Red, False, 3dip) 方法的第 1 個參數是長方形尺寸的 Rect 物件, 第 2 個參數是色彩, 第 3 個參數決定是否填滿, 值 True 是填滿 ;False 只繪出邊框, 最後 1 個參數是線條寬度 繪出圓形 Canvas 物件是使用 DrawCircle() 方法繪出圓形, 如下所示 : cvsmain.drawcircle(220dip, 70dip, 30dip, Colors.Red, False, 3dip) 方法的前 2 個參數是圓心 (x, y) 座標, 第 3 個參數是半徑, 第 4 個參數是色彩, 第 5 個參數決定是否填滿, 值 True 是填滿 ;False 只繪出邊框, 最後 1 個參數是線條寬度 中壢高商 53

繪出橢圓形 Canvas 物件繪出橢圓形方法是 DrawOval() 方法, 我們是在 Rect 物件的範圍內繪出橢圓形, 如下所示 : Dim rect2 As Rect rect2.initialize(20dip, 120dip, 150dip, 190dip) 建立 Rect 物件 rect2 後, 就可以繪出橢圓形, 如下所示 : cvsmain.drawoval(rect2, Colors.Red, False, 5dip) 方法的第 1 個參數是橢圓形尺寸的 Rect 物件, 第 2 個參數是色彩, 第 3 個參數決定是否填滿, 值 True 是填滿 ;False 只繪出邊框, 最後 1 個參數是線條寬度 繪出文字內容 Canvas 物件是使用 DrawText() 方法在畫布繪出文字內容, 如下所示 : cvsmain.drawtext("b4a 繪圖 ", 190dip, 150dip, Typeface.DEFAULT, _ 20, Colors.Red, "LEFT") 方法的第 1 個參數是繪出的字串, 第 2 和 3 個參數是繪出位置的參考座標 (x, y), 因為繪出座標會因文字對齊方式而不同, 第 4 個參數是字型, 以此例為預設字型, 第 5 個參數是文字尺寸, 第 6 個參數是文字色彩, 最後 1 個參數是文字對齊方式, 可以是 :"LEFT" "CENTER" 和 "RIGHT" 中壢高商 54

B4A 專案 : 繪出圖檔 \ 繪出圖檔 \ 繪出圖檔.b4a 載入圖檔 我們可以使用 Canvas 物件的方法來載入圖檔 並且繪出剪裁 旋轉和翻轉圖片效果, 不只如此, 我們還可以將 Canvas 畫布繪出的圖形儲存成圖檔 首先載入圖檔建立 Bitmap 物件 Bmp, 如下所示 : Dim Bmp As Bitmap Bmp.Initialize(File.DirAssets, "Cow.jpg") 繪出圖檔 Canvas 物件是使用 DrawBitmap() 方法繪出圖檔的 Bitmap 物件, 如下所示 : Dim DestRect As Rect DestRect.Initialize(20dip, 10dip, 20dip + 100dip, 10dip + 100dip) cvsgraph.drawbitmap(bmp, Null, DestRect) 方法使用 Rect 物件定義繪出區域, 第 1 個參數是繪出的 Bitmap 物件, 第 2 個參數是來源區域的 Rect 物件,Null 表示全部, 第 3 個參數是實際顯示區域的目標 Rect 物件, 如果尺寸比原圖大, 就是放大 ; 反之是縮小 中壢高商 55

繪出剪裁的圖檔 DrawBitmap() 方法的參數有來源和目的 Rect 物件, 如果來源 Rect 物件只有原圖的部分區域, 就是剪裁圖檔 首先定義剪裁的 Rect 物件, 如下所示 : Dim SrcRect As Rect SrcRect.Initialize(0, 0, Bmp.Width / 2, Bmp.Height) SrcRect 物件尺寸寬度只有原來一半, 繪出剪裁圖片, 如下所示 : DestRect.Left = 150dip DestRect.Right = 150dip + 100dip cvsgraph.drawbitmap(bmp, SrcRect, DestRect) 程式碼直接更改目標 DestRect 區域物件的 Left 和 Right 屬性值後, 呼叫 DrawBitmap() 方法繪出剪裁圖片, 因為有指定來源的 SrcRect 物件 繪出旋轉的圖檔 如同第 11-2-3 節的方法,DrawBitmap() 方法也有繪出旋轉圖形的 DrawBitmapRotated() 方法, 例如 : 順時鐘方向旋轉 70 度, 如下所示 : Dim Rect1 As Rect Rect1.Initialize(20dip, 200dip, 20dip + 100dip, 200dip + 100dip) cvsgraph.drawbitmaprotated(bmp, Null, Rect1, 70) 方法的前 3 個參數和 DrawBitmap() 方法相同, 最後 1 個參數是旋轉角度 ( 順時鐘方向 ) 中壢高商 56

繪出翻轉的圖檔 除了旋轉圖檔,Canvas 還提供繪出翻轉圖檔的 DrawBitmapFlipped() 方法, 例如 : 水平翻轉圖檔, 如下所示 : Rect1.Left = 150dip Rect1.Right = 150dip + 100dip cvsgraph.drawbitmapflipped(bmp, Null, Rect1, False, True) 方法的前 3 個參數和 DrawBitmap() 方法相同, 第 4 個參數是垂直翻轉, 值 True 是翻轉 ;False 為沒有, 最後 1 個參數是水平翻轉, 值 True 是翻轉 ; False 為沒有 將 Canvas 畫布的圖形儲存成檔案 對於 Canvas 畫布的 Bitmap 物件, 我們可以將它儲存成圖檔, 如下所示 : Dim Out As OutputStream Out = File.OpenOutput(File.DirRootExternal, "Graph.png", False) cvsgraph.bitmap.writetostream(out, 100, "PNG") Out.Close 程式碼宣告 OutputStream 輸出串流物件後, 呼叫 File.OpenOutput() 方法開啟輸出串流的 Graph.png 圖檔, 然後呼叫 Bitmap 物件的 WriteToStream() 方法將 Bitmap 物件寫入串流, 第 1 個參數是輸出串流, 第 2 個參數是品質 0~100, 最後 1 個參數是圖檔格式 "PNG" 或 "JPEG" 中壢高商 57

B4A 專案 : Lesson5\ImageView 元件 \ImageView 元件的使用.b4a 建立 ImageView 元件 ImageView 元件可以在 Designer 視窗執行 Add View>ImageView 指令來新增, 或自行使用程式碼來建立, 如下所示 : Sub Globals Dim ImageView1 As ImageView End Sub ImageView1.Initialize("ImageView1") 程式碼使用 Initialize() 方法初始物件, 參數是事件名稱 B4A 專案 : Lesson5\ImageView 元件 \ImageView 元件的使用.b4a 指定 ImageView 元件顯示的圖片 然後使用 Bitmap 屬性指定顯示的圖片, 如下所示 : igvcow.bitmap = LoadBitmapSample(File.DirAssets, "Cow.jpg", 100, 100) 使用 LoadBitmapSample() 方法 ( 此為關鍵字 ) 載入專案的 Cow.jpg 圖檔, 最後 2 個參數是圖片尺寸的最大寬度與最大高度, 如果圖檔尺寸比較大, 就是建立縮圖 如果需要載入全尺寸圖檔, 請使用 LoadBitmap() 方法 ( 此為關鍵字 ), 如下所示 : igvoutput.bitmap = LoadBitmap(File.DirAssets, "Snake.jpg") 中壢高商 58

Android 的檔案 一般來說, 大部分應用程式都需要儲存一些應用程式所需的資料, 即存取永久儲存體 (Persistent Storage) 的儲存裝置來寫入與讀取資料, 我們最常使用的儲存種類有 : 檔案和資料庫 在討論 Android 檔案時, 我們需要先了解 Android 檔案的命名規則和可以在哪些位置儲存檔案 Android 的檔案名稱 Android 作業系統的檔案基本命名規則, 如下所示 : 檔案名稱可以使用 a-z A-Z 0-9 _ 底線等字元, 或使用 + - % 和 & 字元 檔案名稱不允許空白 * 和? 字元 名稱區分英文字母大小寫,MyFile.txt 和 myfile.txt 是不同檔案 中壢高商 59

Android 檔案的儲存位置 File.DirAssets: 此目錄是位在 Android App 的.apk 檔案中, 隨著 APK 檔一起安裝至 Android 作業系統, 我們是在 B4A 專案的 Files 標籤加入此目錄的檔案, 這些檔案是唯讀, 不允許寫入資料 File.DirInternal/File.DirInternalCache: 這兩個目錄是儲存在裝置主記憶體的應用程式專屬檔案, 其他 Android App 並無法存取這些檔案, 如果 Android 作業系統需要更多記憶體空間時, 位在暫存目錄的檔案會被清除 File.DirRootExternal: 儲存在記憶卡根目錄, 通常是指 SD 卡 File.DirDefaultExternal: 這是儲存在 SD 卡的應用程式預設目錄, 其格式為 :< 記憶卡 >/Android/data/< 套件 >/files/, 此目錄如果有需要, 就會自動建立, 而且其他應用程式也可以存取這些檔案 File 預建物件 - 儲存位置與檢查檔案是否存在 File 預建物件提供相關屬性與方法來檢查外部儲存媒體是否可讀或可寫, 檔案是否存在, 其說明如下表所示 : 屬性與方法說明 File.ExternalReadable 此屬性可以檢查外部儲存媒體是否可讀取, 值 True 為可讀 ;False 為不可 File.ExternalWritable 此屬性可以檢查外部儲存媒體是否可寫入, 值 True 為可寫 ;False 為不可 File.Exists(Dir, FileName) 檢查參數的檔案是否存在, 第 1 個參數是上一節的儲存位置, 第 2 個參數是檔案名稱, 傳回 True 表示存在 ;False 為不存在 中壢高商 60

File 預建物件 - 文字檔案讀寫 File 預建物件關於文字檔案讀寫的相關方法說明 ( 存取的檔案是位在第 1 個參數 Dir 目錄, 檔案名稱是第 2 個參數 ), 如下表所示 : 方法 File.WriteString(Dir, FileName, Text) File.ReadString(Dir, FileName) File.WriteList(Dir, FileName, List) File.ReadList(Dir, FileName) File.WriteMap(Dir, FileName, Map) File.ReadMap(Dir, FileName) 說明 將參數 Text 字串寫入參數檔案 讀取參數檔案傳回檔案內容字串 將參數 List 物件寫入參數檔案 讀取參數檔案傳回檔案內容的 List 物件 將參數 Map 物件寫入參數檔案 讀取參數檔案傳回檔案內容的 Map 物件 B4A 專案 :Lesson5\ 行動 Memo\ 行動 Memo(II).b4a WriteString() 方法寫入字串 對於文字檔案, 我們可以使用 WriteString() 方法將字串寫入檔案, 如下所示 : File.WriteString(File.DirInternal, "note" & slot & ".txt", content) 方法的第 1 個參數是 Android 儲存位置的目錄, 第 2 個參數是檔案名稱, 可以將最後 1 個參數的 content 字串寫入檔案 中壢高商 61

B4A 專案 :Lesson5\ 行動 Memo\ 行動 Memo(II).b4a ReadString() 方法讀取字串 讀取檔案內容是使用 ReadString() 方法, 如下所示 : content = File.ReadString(File.DirInternal, "note" & cslot & ".txt") content 變數是取得的檔案內容, 方法第 1 個參數是第 10-1- 1 節儲存位置的目錄, 第 2 個參數是檔案名稱 在讀取前, 我們可以呼叫 File.Exist() 方法檢查檔案是否存在, 如下所示 : If File.Exists(File.DirInternal,"note" & cslot & ".txt") Then End If B4A 專案 :Lesson5\ 讀寫 List 物件 \ 學生課程註冊.b4a 建立寫入檔案的 List 物件 對於程式使用的 List 物件 ( 清單資料 ), 我們可以直接讀寫 List 物件來處理文字檔案, 使用的是 WriteList() 與 ReadList() 方法 例如 : 將學生註冊課程姓名清單的 List 物件寫入文字檔案 首先建立 List 物件, 如下所示 : Dim Students As List Students.Initialize() Students.Add(edtName.Text) 程式碼宣告和初始 List 物件後, 新增一位學生資料至 List 物件 中壢高商 62

B4A 專案 :Lesson5\ 讀寫 List 物件 \ 學生課程註冊.b4a WriteList() 方法寫入 List 物件 然後將 List 物件寫入學生註冊資料的檔案, 如下所示 : File.WriteList(File.DirRootExternal, myfile, Students) 方法的第 1 個參數是 Android 儲存位置的目錄, 第 2 個參數是檔案名稱, 可以將最後 1 個參數的 List 物件 Students 寫入檔案 B4A 專案 :Lesson5\ 讀寫 List 物件 \ 學生課程註冊.b4a ReadList() 方法讀取 List 物件 讀取檔案是使用 ReadList() 方法, 如下所示 : Students = File.ReadList(File.DirRootExternal, myfile) 程式碼可以取得檔案內容的 List 物件 Students, 方法的第 1 個參數是 Android 儲存位置的目錄, 第 2 個參數是檔案名稱 中壢高商 63

B4A 專案 :Lesson5\ 讀寫 List 物件 \ 學生課程註冊.b4a 將讀取 List 物件建立 ListView 元件的項目 在讀取 List 物件後, 就可以將 List 物件元素新增成為 ListView 元件的項目, 如下所示 : ListView1.Clear() For i = 0 To Students.Size - 1 ListView1.AddSingleLine(Students.Get(i)) Next 程式碼呼叫 Clear() 方法清除項目資料後, 使用 For/Next 迴圈走訪 List 物件的每一個元素, 和呼叫 AddSingleLine() 方法加入成為 ListView 元件的清單項目 B4A 專案 :Lesson\ 讀寫 Map 物件 \ 我的最愛.b4a 建立寫入檔案的 Map 物件 對於程式使用的 Map 物件 ( 鍵值資料 ), 如同 List 物件, 我們也可以直接讀寫 Map 物件來處理文字檔案, 使用的是 WriteMap() 與 ReadMap() 方法 例如 : 將我的最愛書籤的網站名稱 ( 鍵 ) 和 URL 網址 ( 值 ) 建立成 Map 物件, 和寫入文字檔案 首先建立 Map 物件, 如下所示 : Dim items As Map items.initialize() items.put(edttitle.text, edturl.text) 程式碼宣告和初始 Map 物件後, 新增一個書籤的網站名稱和 URL 網址資料至 Map 物件 中壢高商 64

B4A 專案 :Lesson\ 讀寫 Map 物件 \ 我的最愛.b4a WriteMap() 方法寫入 Map 物件 然後寫入 Map 物件至檔案, 如下所示 : File.WriteMap(File.DirRootExternal, "mapitems.txt", items) 方法的第 1 個參數是 Android 儲存位置的目錄, 第 2 個參數是檔案名稱, 可以將最後 1 個參數的 Map 物件 items 寫入檔案 B4A 專案 :Lesson\ 讀寫 Map 物件 \ 我的最愛.b4a ReadMap() 方法讀取 Map 物件 讀取檔案是使用 ReadMap() 方法, 如下所示 : items = File.ReadMap(File.DirRootExternal, "mapitems.txt") 程式碼可以取得檔案內容 Map 物件 items, 方法的第 1 個參數是 Android 儲存位置的目錄, 第 2 個參數是檔案名稱 中壢高商 65

B4A 專案 :Lesson\ 讀寫 Map 物件 \ 我的最愛.b4a 將讀取的 Map 物件建立 ListView 元件項目 在讀取 Map 物件後, 就可以將 Map 物件元素新增成為 ListView 元件的項目, 如下所示 : ListView1.Clear() For i = 0 To items.size - 1 ListView1.AddSingleLine2(items.GetKeyAt(i), items.getvalueat(i)) Next 程式碼呼叫 Clear() 方法清除項目資料後, 使用 For/Next 迴圈走訪 Map 物件的每一個元素, 和呼叫 AddSingleLine2() 方法加入成為 ListView 元件的清單項目, 包含項目名稱和值 Basic4android 的線上教學資源 http://www.basic4ppc.com/android/documentation.html 中壢高商 66

意圖與意圖篩選 Android 應用程式送出意圖的訊息需要經過 Android 作業系統來判斷接收者是誰, 它是使用意圖篩選 ( Intent Filters) 找出有能力處理的活動或內建應用程式, 然後才將訊息送給接收者, 如右圖所示 : 意圖 (Intents) 是一個啟動其他 Android 活動 服務和廣播接收器的系統訊息, 可以告訴 Android 作業系統我想作什麼? 專案 :Lesson6\ 建立多活動 \ 建立多活動 App.b4a 建立多活動 App- 步驟一 : 建立 Main 主活動 建立多活動 App 的第一步是建立 B4A 專案和輸入程式碼, 如下所示 : Sub Globals Dim Button1 As Button End Sub Sub Activity_Create(FirstTime As Boolean) Activity.Title = " 建立多活動 App" End Sub Sub Button1_Click StartActivity("Second") End Sub 啟動 Second 活動 中壢高商 67

專案 :Lesson6\ 建立多活動 \ 建立多活動 App.b4a 建立多活動 App- 步驟二 : 新增 Second 活動模組 B4A 專案擁有 2 個活動模組, 我們需要新增名為 Second 的第 2 個活動模組, 如下所示 : Sub Globals Dim Button1 As Button End Sub Sub Activity_Create(FirstTime As Boolean) Activity.Title = " 第二個活動 " End Sub Sub Button1_Click 啟動 Main 活動 StartActivity("Main") End Sub 專案 :Lesson6\ 建立多活動 \ 建立多活動 App.b4a 建立多活動 App- 步驟三 : 編譯和執行多活動 App 現在, 我們已經完成 2 個活動的 Android App, 其編譯和執行結果如下圖所示 : 中壢高商 68

專案 :Lesson6\ 傳遞資料至其他活動 \ 我的最愛.b4a 傳遞資料至其他活動 -B4A 的作法 程式是使用 ListView 元件顯示網站名稱清單, 點選項目, 就可以啟動第 2 個活動, 和在 WebView 元件顯示選取網站的首頁, 如下圖所示 : 傳遞 URL 網址 專案 :Lesson6\ 傳遞資料至其他活動 \ 我的最愛.b4a 傳遞資料至其他活動 -Process_Globals 程序 資料是從 Main 傳遞至 WebView 活動, 所以是在 Main 活動模組宣告傳遞資料的變數, 如下所示 : Sub Process_Globals Dim URL As String End Sub 程序宣告名為 URL 的行程變數 在第 2 個 WebVew 活動可以使用活動名稱加上變數名稱 Main.URL 取得 Main 活動的行程變數值, 如下所示 : Dim URL As String URL = Main.URL 中壢高商 69

意圖的動作類型 ( 準備作什麼 ) B4A 在呼叫 Initialize() 方法初始 Intent 意圖物件時, 可以在第 1 個參數指定使用的動作類型, 第 2 個參數是 URI 活動常用的動作類型說明, 如下表所示 : 動作類型 ACTION_VIEW ACTION_EDIT ACTION_CALL ACTION_SEND ACTION_PICK ACTION_APPWIDGET_UPDATE ACTION_MAIN 說明 顯示資料給使用者檢視 顯示資料給使用者編輯 使用自動撥號打電話 寄送簡訊或電子郵件 從資料來源選取一個項目資料 更新應用程式小工具 (App Widget), 詳見第 13-3 節的說明 啟動如同是程式進入點的主程式 意圖的 URI( 操作所需的資料 ) 萬用資源識別 URI 是用來定位 Android 系統的資源, 幫助 Intent 意圖物件的動作可以取得或找到操作的資料 Android 常用的 URI 說明, 如下所示 : URL 網址 :URI 可以直接使用 URL 網址, 如下所示 : http://www.google.com.tw/ 地圖位置 :GPS 定位的座標值 (GeoPoint 格式 ), 如下所示 : geo:25.04692437135412,121.5161783959678 電話號碼 : 指定撥打的電話號碼, 如下所示 : tel:123456789 寄送簡訊 : 寄送簡訊給指定的電話號碼, 如下所示 : sms:123456789 中壢高商 70

專案 :Lesson6\ 使用意圖啟動程式 \Android 工具箱.b4a 使用隱含意圖啟動瀏覽器 在活動啟動內建瀏覽器是建立 ACTION_VIEW 動作, 和 URI 為 URL 網址的 Intent 物件, 如下所示 : Dim i As Intent i.initialize(i.action_view, "http://www.google.com.tw") StartActivity(i) 程式碼宣告 Intent 物件變數後, 呼叫 Initialize() 方法初始 Intent 物件, 第 1 個參數是動作, 第 2 個參數是 URI 字串, 最後呼叫 StartActivity() 方法啟動活動, 參數是 Intent 物件 專案 :Lesson6\ 使用意圖啟動程式 \Android 工具箱.b4a 使用隱含意圖啟動打電話程式 在活動啟動內建撥號程式是使用 ACTION_VIEW 動作,URI 為電話號碼, 如下所示 : Dim i As Intent i.initialize(i.action_view, "tel:123456789") StartActivity(i) 中壢高商 71

專案 :Lesson6\ 使用意圖啟動程式 \Android 工具箱.b4a 使用隱含意圖啟動程式傳送簡訊 在活動可以啟動內建簡訊工具來傳送簡訊, 它是使用 ACTION_VIEW 動作,URI 為簡訊收件者的電話號碼, 如下所示 : Dim i As Intent i.initialize(i.action_view, "sms:123456789") i.putextra("sms_body", " 這是一封測試簡訊 ") StartActivity(i) 程式碼呼叫 Intent 物件 PutExtra() 方法來附加資料, 第 1 個參數是資料名稱, 第 2 個參數是資料值, 以此例是指定簡訊內容 專案 :Lesson6\ 使用意圖傳遞資料 \BMI 計算機.b4a 使用明確意圖啟動 App 的其他活動 明確意圖需要在 StartActivity() 方法參數的 Intent 意圖物件指明目標活動的活動類別, 或進一步指明元件名稱來啟動指定的 Android App, 而不是讓 Android 作業系統依據動作類別和 URI 來選擇適合的 Android App 使用明確意圖啟動其他活動需要使用 SetComponent() 方法指定目標的元件名稱, 如下所示 : Dim i As Intent i.initialize("", "") i.setcomponent("com.android.calculator2/.calcula tor") StartActivity(i) 中壢高商 72

專案 :Lesson6\ 使用意圖啟動程式 \Android 工具箱.b4a 使用明確意圖啟動 Google 地圖 在活動啟動內建 Google 地圖是使用 ACTION_VIEW 動作,URI 為 GPS 座標值, 不過稍有不同, 如下所示 : Dim i As Intent Dim lat, lon As String lat = "25.04692437135412" lon = "121.5161783959678" i.initialize(i.action_view, "geo:" & lat & "," & lon & "?q=" & lat & "," & lon) i.setcomponent("googlemaps") StartActivity(i) URI 字串的最後重複加上 q 參數的 GPS 座標值, 以便在 Google 地圖加上標記, 呼叫 SetComponent() 方法指明元件名稱是 Google 地圖 狀態列通知的基礎 狀態列 (Status Bar) 是行動裝置最上方的一條橫向長條區域, 平板電腦 Android 3.x 是位在最下方,Android 4.x 版作業系統的狀態列是位在最上方 通知服務 (Notification Service) 是一種系統服務, 可以在狀態列顯示可向下捲動的通知訊息, 例如 : 未接來電, 如右圖所示 : 中壢高商 73

專案 :Lesson6\ 狀態列通知 \BMI 計算機.b4a 建立 Notification 物件的狀態列通知 Notification 物件建立狀態列通知十分簡單, 不過, 請注意! 我們一定需要指定圖示和訊息內容, 才能正確顯示通知 首先宣告 Notification 物件變數, 如下所示 : Dim n As Notification n.initialize() 程式碼呼叫 Initialize() 方法初始 Notification 物件 專案 :Lesson6\ 狀態列通知 \BMI 計算機.b4a 指定狀態列通知的圖示 然後使用 Icon 屬性指定顯示的圖示, 如下所示 : n.icon = "w1" Icon 屬性值是圖示檔名稱, 不含副檔名且區分英文字母大小寫, 我們需要自行將圖示檔複製到 B4A 專案的 \Objects\res\drawable 目錄, 和將屬性值改為唯讀, 否則當編譯時,B4A 會自動刪除圖示檔, 我們也可以指定成 icon, 即 App 本身的應用程式圖示, 如下所示 : n.icon = "icon" 中壢高商 74

專案 :Lesson6\ 狀態列通知 \BMI 計算機.b4a 指定狀態列通知的通知訊息 接著指定通知訊息, 和點選通知開啟的活動, 如下所示 : n.setinfo("bmi 計算機 ", "BMI 值太高, 體重稍重...", BMI) SetInfo() 方法的第 1 個參數是標題文字, 第 2 個參數是訊息內容, 最後 1 個參數是點選通知開啟的活動物件名稱, 如果程式碼位在 Main 模組且點選開啟的也是 Main 活動, 最後 1 個參數值就是空字串 "" 專案 :Lesson6\ 狀態列通知 \BMI 計算機.b4a 顯示狀態列通知 現在, 我們已經指定圖示和通知訊息, 最後就可以呼叫 Notify() 方法顯示通知, 如下所示 : n.notify(1) 方法的參數是整數的通知編號, 此編號就是用來在之後更新或取消通知 中壢高商 75

專案 :Lesson6\ 狀態列通知 \BMI 計算機.b4a 更新狀態列通知 對於已經顯示的通知, 我們可以更新圖示和通知訊息文字後, 再送出一次, 如下所示 : n.icon = "w2" 更改圖示 n.setinfo("bmi 計算機 ", "BMI 值太高, 體重過重...", BMI) n.notify(1) 通知更新圖示和訊息文字後, 因為 Notify() 方法的參數值是同一個通知編號, 換句話說, 就是顯示更新的狀態列通知 專案 :Lesson6\ 狀態列通知 \BMI 計算機.b4a 取消狀態列通知 當點選狀態列通知開啟目標活動時, 我們可以在此活動的 Activity_Resume 程序取消此通知, 如下所示 : Sub Activity_Resume Dim n As Notification n.initialize() n.cancel(1) 取消通知 End Sub 程序建立 Notification 物件後, 呼叫 Cancel() 方法取消通知, 參數是通知編號 中壢高商 76

專案 :Lesson6\ 從狀態列通知傳遞資料 \ 四則計算機.b4a 從狀態列通知傳遞資料至活動 - 傳遞字串資料 在建立狀態列通知的訊息內容時, 可以額外傳遞一個字串至啟動活動, 使用的是 SetInfo2() 方法, 如下所示 : Dim n As Notification n.initialize() n.icon = "icon" n.autocancel = True 自動取消通知 傳遞的字串 n.setinfo2(" 四則計算機 ", " 除以 0 的錯誤...", " 第 2 個運算元 不能為 0", Error) n.notify(1) 圖示是應用程式圖示, 指定 AutoCancel 屬性值為 True, 表 示點選通知就自動取消通知, 在 SetInfo2() 方法的第 3 個參 數是傳遞字串, 可以傳遞至最後一個參數的 Error 活動 是否有參數 專案 :Lesson6\ 從狀態列通知傳遞資料 \ 四則計算機.b4a 從狀態列通知傳遞資料至活動 - 取得傳遞字串 在 Activity_Resume 程序取得狀態列通知傳遞字串, 如下 所示 : Sub Activity_Resume Dim i As Intent i = Activity.GetStartingIntent() If i.hasextra("notification_tag") Then 取得啟動活動的 Intent 物件 lbloutput.text = i.getextra("notification_tag") End If End Sub 呼叫 Activity.GetStartingIntent() 方法取得啟動此活動的 Intent 物件,If 條件呼叫 HasExtra() 方法, 參數是資料名稱 "Notification_Tag", 如果存在, 就呼叫 GetExtra() 方法取出傳遞字串 中壢高商 77

服務 服務是在背景執行的行程, 可以執行和活動一樣的工作, 只是沒有使用介面 例如 : 在播放背景音樂時, 之所以不會打斷我們發送簡訊或收發電子郵件, 因為它是在背景執行的服務, 才能讓音樂播放不中斷 服務的生命周期 服務的生命周期幾乎不會被目前存在的活動影響, 因為它是在背景執行工作, 所以沒有任何活動的使用介面, 也不能使用對話方塊 (Toast 彈跳訊息框除外 ), 通常都是使用狀態列通知, 作為與使用者互動的管道 服務不會暫停和重新啟動, 當使用者旋轉螢幕, 也不會重新建立服務 ( 只會重新建立活動 ), 因此, 在活動模組撰寫的程式碼, 一旦活動進入背景, 程式也隨之暫停, 但是, 服務就可以持續執行, 換句話說, 對於哪些沒有使用介面的任務與工作, 使用服務來實作比起活動還來的簡單 中壢高商 78

服務模組的範本程式碼 服務模組範本程式碼的程序是服務的生命周期, 它是作業系統依序呼叫的一些程序, 如下所示 : Sub Process_Globals End Sub Sub Service_Create End Sub Sub Service_Start (StartingIntent As Intent) End Sub Sub Service_Destroy End Sub 服務模組的程序說明 -1 Process_Globals 程序 : 在此程序宣告服務模組的全域變數 ( 即行程變數 ), 服務模組沒有 Globals 程序, 因為服務不支援活動物件, 我們在服務模組宣告的全域變數, 相當於是在活動模組宣告行程變數, 可以讓其他模組存取 Service_Create 程序 : 當服務第 1 次啟動時就會呼叫此程序, 我們可以在此程序初始行程變數, 當服務啟動後, 它會一直存在直到活動模組呼叫 StopService() 方法停止服務, 或整個行程被刪除 中壢高商 79

服務模組的程序說明 -2 Service_Start 程序 : 當每一次呼叫 StartService() 或 StartServiceAt() 方法時就會呼叫此程序, 將 App 的行程移至前景狀態, 作業系統不會刪除此行程, 直到程序結束執行為止 如果是排程工作, 定時在間隔時間執行的工作, 請在此程序呼叫 StartServiceAt() 方法建立排程執行的服務 Service_Destroy 程序 : 當在活動呼叫 StopService() 方法時, 就是呼叫此程序來終止服務且停止服務的執行, 我們需要再次呼叫 StartService() 方法來啟動服務, 然後依序呼叫 Service_Create() 和 Service_Start() 方法來執行服務 專案 :Lesson6\ 服務模組 \ 計數器服務.b4a Service_Start() 程序 Service_Start() 程序使用 StartServiceAt() 方法排程自動在下一秒啟動服務, 方法第 1 個參數是服務模組名稱, 空字串是目前服務, 第 2 個參數指定間隔時間是目前時間的下一秒, 最後 1 個參數是當裝置如果在睡眠時是否啟動服務,True 為是 ;False 要等到裝置恢復才啟動, 如下 : Sub Service_Start(StartingIntent As Intent) Counter = Counter + 1 排程啟動服務 If isrun Then StartServiceAt("", DateTime.Now + DateTime.TicksPerSecond, True) End If End Sub 中壢高商 80

專案 :Lesson6\ 服務模組 \ 計數器服務.b4a 在服務模組 Process_Globals 使用行程變數 Counter 和 IsRun 變數都是全域的行程變數, 在活動模組是使用 Timer 物件來定時取得 Counter 變數值,IsRun 變數是用來控制服務是否執行 Sub Process_Globals Dim Counter As Int = 0 行程變數 Dim isrun As Boolean End Sub 專案 :Lesson6\ 服務模組 \ 計數器服務.b4a Service_Create() 程序 在 TimeService 服務模組的 Service_Create() 程序建立狀態列通知, 可以讓使用者透過通知訊息來開啟可以關閉服務的活動, 如下所示 : Sub Service_Create Dim n As Notification n.initialize() n.icon = "icon" n.autocancel = True 指定圖示 建立與初始 Nofification 物件 n.setinfo(" 計數器服務 ", " 停止計數器服務...", Main) n.notify(1) End Sub 指定訊息 中壢高商 81

在活動模組 Main 建立 Timer 物件 Timer 物件可以在指定間隔時間產生 Tick 事件, 我們可以使用 Timer 物件取代很長次數的迴圈和實作動畫效果 Sub Process_Globals Dim Timer1 As Timer Timer1.Initialize("Timer", 1000) End Sub... Sub Timer_Tick lbloutput.text = TimeService.Counter End Sub 建立與初始 Timer 物件 顯示計數 在活動模組 Main 啟動和停止服務 Sub Button1_Click Timer1.Enabled = True TimeService.isRun = True StartService(TimeService) End Sub 啟動計時器物件 啟動服務 Sub Button2_Click Timer1.Enabled = False 取消排程啟動服務 TimeService.isRun = False CancelScheduledService(TimeService) StopService(TimeService) End Sub 停止服務 中壢高商 82