ኼ¿
̴ͺͺ ͳ
BÀI 1: GIỚI THIỆU VỀ LẬP TRÌNH CHO ĐIỆN THOẠI DI ĐỘNG VÀ
CÔNG CỤ J2ME WIRELESS TOOLKIT
Bài viết này giúp bạn làm quen với việc lập trình trên điện thoại di động.
Khi sử dụng chiếc điện thoại hàng ngày, có thể bạn vẫn nghĩ lập trình cho chiếc
điện thoại của mình là một việc không dễ dàng và chỉ có những chuyên gia mới
làm được. Loạt bài viết về lập trình trên điện thoại di
động sắp tới sẽ hướng dẫn
bạn từng bước cách “vọc” để tự viết những ứng dụng và trò chơi đơn giản cho
mình.
Khi đi vào thế giới của lập trình cho ĐTDĐ, bạn sẽ bắt gặp những thuật ngữ
mới như J2ME, CLDC, Configuration, Profile, . Những thuật ngữ này có thể lạ
với bạn nhưng chúng ta sẽ từ từ làm quen với chúng. Còn bi giờ hãy sắn tay áo cài
đặt phần mềm trước đã.
Những phần mềm cần chuẩn bị:
Bạn cần chuẩn bị 3 phần mềm sau để bắt đầu, bạn có thể tải về từ Internet hoặc ra
các cửa hàng bán CD để mua về:
•
Bộ công cụ phát triển của Java (Java 2 Standard Edition – J2SE) phiên bản
1.4.2 hoặc mới hơn. Bạn có thể tải về tại địa chỉ sau:
/>•
J2ME Wireless Toolkit. Đây chính là công cụđể bạn vọc lập trình trên điện
thoại. Bạn có thể download về tại đây:
/>•
Một chương trình soạn thảo mã nguồn Java. Bạn có thể dùng bất kỳ chương
trình soạn thảo văn bản nào cho phép lưu các văn bản không có định dạng
như Notepad, Notepad Plus tại , jEdit tại
ኼ¿
hãy chọn đường dẫn mà bạn đã cài đặt ở bước trước). Chương trình cài đặt mặc
định sẽ cài vào thư mục c:\WTK22 và nó sẽ tạo thêm một số shortcut trong thực
đơn Start của Windows. Bạn chọn menu Start -> All Programs -> J2ME Wireless
Toolkit 2.2 và bạn sẽ thấy những shortcut như hình sau:
Để chạy bộ công cụ này, bạn chọn KToolbar trong thực đơn ở trên, chương trình
KToolbar sẽ chạy lên như
hình sau:
ኼ¿
̴ͺͺ Ͷ
Trên thanh công cụ của chương trình, bạn hãy chọn Open Project , bạn sẽ thấy
một cửa sổ Open Project hiện lên:
Bạn hãy chọn Games, và nhấn Open Project, sau đó bạn nhấn Run trên thanh công
cụđể chạy ứng dụng mẫu này, và chương trình giả lập điện thoại sẽ chạy lên:
ኼ¿
̴ͺͺ ͷ
Bạn sẽ thấy 3 trò chơi, trong đó có trò WormGame (Rắn săn mồi) rất quen
thuộc. Bạn dùng chuột nhấn vào các nút trên điện thoại giả lập giống như bạn đang
sử dụng chiếc điện thoại thật của bạn. Bạn chú ý đây chỉ là một điện thoại giả lập
chung chứ không phải một đời điện thoại của bấ
t kỳ nhà sản xuất điện thoại nào
như Samsung hay Nokia. Bạn nhấn chuột lên nút DOWN của điện thoại và nhấn
ኼ¿
̴ͺͺ
nút SELECT, bạn sẽ chạy được chương trình game Rắn săn mồi quen thuộc như
sau:
Sau khi chơi thử xong, bạn đóng màn hình giả lập lại bằng cách nhấn nút X ở phía
trên bên phải như khi bạn đóng bất kỳứng dụng Windows nào khác. Bây giờ bạn
giới. Đúng vậy, ứng dụng nổi tiếng nhất thế giới chính là ứng dụng Hello World.
Đầu tiên, bạn cần mở chương trình KToolbar bằng cách chọn menu Start -> All
Programs -> J2ME Wireless Toolkit 2.2 -> KToolbar , và chương trình sẽ hiện lên
như sau:
ኼ¿
̴ͺͺ ͳͲ
Trên thanh công cụ, bạn hãy chọn nút New Project , một cửa sổ New Project sẽ
hiện lên, trong ô Project Name, bạn nhập vào HelloSuite và trong ô MIDlet Class
Name, bạn nhập vào HelloMIDlet (xem hình dưới). Kế tiếp, bạn nhấn vào nút
Create Project.
Một cửa sổ cho phép bạn cấu hình dự án của bạn sẽđược hiện lên như hình sau:
ኼ¿
̴ͺͺ ͳͳ
Đây là một hộp hội thoại cho phép bạn thay đổi các thông số của dự án. Bạn cũng
chưa cần quan tâm đến các tham số cấu hình này vào thời điểm hiện nay. Các
thông số mặc định này đã thích hợp với đa số các dự án nhỏ, bạn chỉ cần nhấn OK
và bạn đã có trong tay một dự án của riêng mình.
Trên cửa sổ của KToolbar bạn sẽ thấy các thông tin sau:
Creating project "HelloSuite"
Place Java source files in "C:\soft\WTK22\apps\HelloSuite\src"
Place application resource files in "C:\soft\WTK22\apps\HelloSuite\res"
Place application library files in "C:\soft\WTK22\apps\HelloSuite\lib"
Settings updated
Project settings saved
ኼ¿
̴ͺͺ ͳʹ
Các bạn chú ý là trên máy của tôi thì bộ Wireless Toolkit được cài vào thư mục
extends MIDlet
implements CommandListener {
private Form mMainForm;
public HelloMIDlet() {
mMainForm = new Form("HelloMIDlet");
mMainForm.append(new StringItem(null, "Hello World!"));
mMainForm.addCommand(new Command("Exit", Command.EXIT, 0));
mMainForm.setCommandListener(this);
}
public void startApp() {
Display.getDisplay(this).setCurrent(mMainForm);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
notifyDestroyed();
ኼ¿
̴ͺͺ ͳͶ
}
}
Tạm thời hiện nay bạn chưa cần hiểu nội dung của đoạn mã nguồn này. Trong bài
kế tiếp chúng ta sẽ tìm hiểu nội dung của chương trình này một cách toàn diện và
chi tiết.
Trên thanh công cụ của KToolbar, bạn hãy nhấn nút Build để biên dịch và đóng
gói toàn bộ dự án của bạn. Quá trình build này sẽ hoàn tất và bạn sẽ thấy thông tin
sau trong cửa sổ của KToolbar:
Project settings saved
Building "HelloSuite"
Build complete
TIÊN CỦA BẠN
Trong bài trước bạn đã biết cách sử dụng bộ công cụ Wireless Toolkit để tạo một
dự án mới của riêng bạn, đó là ứng dụng Hello World, tuy nhiên các bạn vẫn chưa
tìm hiểu về mã nguồn của chương trình đầu tiên này. Trong bài này chúng ta sẽ
cùng phân tích cấu trúc đơn giản nhất của một ứng dụng Java trên điện thoại di
động cũng như gi
ải thích một số khái niệm cơ bản về công nghệ lập trình thời
thượng này.
Chắc bạn cũng còn nhớ là trong bài trước bạn đã sử dụng chương trình KToolbar
để tạo một dự án, biên dịch và chạy chúng. Các bạn có thể xem lại bài trước một
lần nữa trước khi chúng ta bắt đầu vọc mã nguồn của ứng dụng Hello World. Tuy
nhiên đầu tiên ta cần tìm hiểu những khái niệm cơ bả
n trước đã.
Giới thiệu về J2ME
Khi nghe nói về Java, các bạn hay gặp những thuật ngữ như J2SE, J2EE và J2ME.
J2SE viết tắt của Java 2 Standard Edition, là bản Java dùng để viết các chương
trình chạy trên desktop. Còn J2EE là Java 2 Enterprise Edition, một phiên bản
chuyên dùng để viết các ứng dụng web cũng như các dịch vụ web chạy trên các hệ
thống máy chủ. Thế còn J2ME là gì? J2ME (Java 2 Micro Edition) là công nghệ
cũng như nền tảng để viết các ứng dụng chạy trên các thiết bị nhỏ
nhưđiện thoại di
động hay các máy trợ giúp cá nhân PDA. Với nền tảng J2ME, các bạn sẽ có được
một tập các giao diện lập trình ứng dụng (API) được thiết kếđặc thù cho các thiết
bị nhỏ. Vì các thiết bị nhỏ có khả năng xử lý cũng như bộ nhớ rất hạn chế nên các
thiết bị này không thể chạy các máy ảo Java (Java Virtual Machine) của J2SE
được. Và vì lý do này nên một phiên bản máy ảo Java nhỏ gọn đượ
c định nghĩa ra
để có thể chạy được trên các thiết bị di động này.
Một cách ngắn gọn dễ hiểu thì bạn có thể coi J2ME bao gồm một máy ảo Java thu
gọn và một tập các thư viện lập trình thiết kế riêng cho các thiết bi di động.
Profile MIDP bổ sung cho Cấu Hình CLDC bởi vì nó cung cấp thư viện được thiết
kếđặc biệt để có thể chạy được trên các thiết bị rất nhỏ với tài nguyên CPU và bộ
nhớ rất hạn chế. Ví dụ là MIDP có gói
javax.microedition.lcdui
cho phép chúng ta
lập trình giao diện người dùng (GUI) trên thiết bị có màn hình rất nhỏ. Với các
thiết bị mạnh hơn và màn hình lớn hơn như PDA thì các profile thường gặp trên đó
có tên là Foundation và Personal. Trong loạt bài viết này tôi sẽ không trình bày về
CDC và Foundation/Personal mà chỉ tập trung vào CLDC và MIDP, là nền tảng
trong các điện thoại di động hiện nay.
CLDC có 2 phiên bản là 1.0 và 1.1, trong đó phiên bản 1.0 là phổ biến nhất trong
các điện thoại hỗ trợ Java. MIDP cũng có 2 phiên bản là 1.0 và 2.0. Hầu hết các
máy đ
iện thoại đời mới hiện nay trên thị trường đã hỗ trợ MIDP 2.0.
Tìm hiểu về mã nguồn ứng dụng Hello World
Như vậy là bạn đã nắm được những khái niệm cơ bản nhất về nền tảng J2ME trên
các thiết bị di động. Với những kiến thức nền tảng này chúng ta sẽ tiếp tục bằng
cách phân tích mã nguồn ứng dụng Hello World.
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloMIDlet
extends MIDlet
implements CommandListener {
private Form mMainForm;
public HelloMIDlet() {
mMainForm = new Form("HelloMIDlet");
mMainForm.append(new StringItem(null, "Hello World!"));
ኼ¿
̴ͺͺ ʹͲ
ኼ¿
̴ͺͺ ʹͳ
là Command dùng cho việc kết thúc chương trình. Một lệnh được đặt vào trong
biểu mẫu thông qua phương thức addCommand(). Sau đó ta chỉđịnh chính lớp này
sẽ là lớp xử lý các lệnh thông qua phương thức setCommandListener().
Mỗi ứng dụng viết cho điện thoại bằng MIDP đều phải kế thừa lớp trừu tượng
MIDlet và phải định nghĩa đủ 3 phương thức là startApp(), pauseApp() và
destroyApp(). Chắc các bạn cũng đoán ra được, startApp() được gọ
i khi khởi tạo
ứng dụng, pauseApp() được gọi khi ứng dụng cần được tạm dừng, ví dụ như khi
cần nhận một cuộc gọi đến. Còn phương thức destroyApp() được gọi khi thoát ứng
dụng, thường là thông qua một lệnh thoát (Exit). Trong ví dụ Hello World này thì
ta chỉ sử dụng phương thức startApp() để lấy đối tượng Display (màn hình) và đặt
biểu mẫu mMainForm thành biểu mẫu hiện hành cho màn hình điện thoại. Vì
phương thức này được gọi nên chúng ta sẽ thấy được chuỗi Hello World hiện trên
màn hình điện thoại. Các bạn cũng chú ý là mặc dù ta không cần xử lý gì cho 2
phương thức còn lại là pauseApp() và destroyApp() nhưng ta vẫn phải khai báo
thành phương thức rỗng vì đây là yêu cầu bắc buộc của một ứng dụng MIDlet.
Phương thức cuối cùng, commandAction() sẽđược gọi khi có lệnh nhấn từ người
dùng. Ởđây ta chỉđơn giản gọi phươ
ng thức notifyDestroyed() để kết thúc ứng
dụng.
Bây giờ các bạn có thể thử Việt hoá ứng dụng này bằng cách thay thế 3 chuỗi như
sau và thử biên dịch, chạy lại ứng dụng của mình.
Tiếng Anh Tiếng Việt không dấu
"HelloMIDlet" Ung dung Xin chao
"Hello World!" Xin chao cac ban
Exit" Thoat
Tóm tắt
n thoại thật đều tương tác với các ứng dụng MIDlet
của bạn thông qua một phần mềm của chính thiết bịđó và thường được gọi là Phần
mềm quản lý các ứng dụng MIDlet (gọi tắt là PMQLƯD). PMQLƯD này chịu
tránh nhiệm khởi tạo, kích hoạt, tạm dừng, chạy lại và kết thúc ứng dụng MIDlet.
Ngoài những chức năng này thì PMQLƯD còn chịu trách nhiệm cài đặt và gỡ bỏ
MIDlet c
ủa bạn. Một MIDlet của bạn sẽở một trong 3 trạng thái là kích hoạt
(active), tạm dừng (paused) hay kết thúc (destroyed) và được quản lý thông qua 3
phương thức
startApp()
,
pauseApp()
và
destroyApp()
.
ኼ¿
̴ͺͺ ʹͶ
Khi ở trạng thái tạm dừng, ứng dụng MIDlet sẽđợi chuyển sang trạng thái kích
hoạt. Khi ở trạng thái này thì ứng dụng của bạn nên giải phóng bớt các tài nguyên
hệ thống. Khi khởi động chương trình thì ứng dụng của bạn sẽở trạng thái tạm
dừng này trước khi chuyển sang trạng thái kích hoạt. Đôi khi ứng dụng của bạn
phải chuyển sang trạng thái tạm dừng để thiết bị x
ử lý một số chức năng nào đó, ví
dụ như việc nhận một cuộc điện thoại gọi tới. Để chuyển ứng dụng sang trạng thái
tạm dừng thì PMQLƯD sẽ gọi phương thức
pauseApp()
. Ngoài ra nếu bạn muốn
tạm dừng ứng dụng của bạn, bạn có thể gọi phương thức
notifyPaused()
phương thức
destroyApp(boolean unconditional)
sẽ không được gọi.
Vậy chuyện gì sẽ xảy ra khi ứng dụng của bạn đang xử lý một thao tác quan trọng
nào đó và phương thức
destroyApp(boolean unconditional)
được gọi? Điều này tuỳ
thuộc vào giá trị của biến
unconditional
truyền vào. Nếu biến này có giá trị là true
(đúng) thì ứng dụng của bạn sẽ chắc chắn bị kết thúc mà PMQLƯD không cần biết
ứng dụng của bạn đang làm gì. Tuy nhiên nếu biến
unconditional
này có giá trị
false (sai) thì có nghĩa là PMQLƯD muốn kết thúc ứng dụng của bạn, nhưng nếu
ứng dụng của bạn đang xử lý một công việc quan trọng, bạn có thể ném ra ngoại lệ
MIDletStateChangeException
để thông báo PMQLƯD rằng ứng dụng chưa muốn
kết thúc. Tuy nhiên việc này cũng có thể tuỳ thuộc vào đời điện thoại cụ thể, ví dụ
như có thể PMQLƯD vẫn kết thúc ứng dụng hoặc nó sẽ gọi
destroyApp(boolean
unconditional)
sau đó. Các bạn cũng chú ý là khi ứng dụng chuyển sang trạng thái
kết thúc có nghĩa là ứng dụng sẽđược giải phóng khỏi bộ nhớ nhưng ứng dụng vẫn
nằm trong ĐTDĐ và bạn vẫn có thể tiếp tục chạy nó những lần sau (trừ khi bạn gỡ
bỏứng dụng của bạn ra khỏi ĐTDĐ)
Tóm tắt
Như vậy qua bài viết này các bạn đã nắm
được những kiến thức hết sức quan trọng
về chu kỳ sống của các ứng dụng, 3 trạng thái tạm dừng, kích hoạt, kết thúc của bất