Giáo Trình Lập Trình Mobile
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA CÔNG NGHỆ THÔNG TIN
TH.S TRỊNH CÔNG DUY
(TÀI LIỆU LƯU HÀNH NỘI BỘ)
Trang 2MỤC LỤC
I Tổng quan về công nghệ di động 2
I.1 Lịch sử của điện thoại di động 2
I.2 Các chuẩn công nghệ 11
II Giới thiệu về J2ME 14 II.1 Lịch sử 14
II.2 Lý do chọn J2ME 14
II.3 Kiến trúc của J2ME 14
II.4 Giới thiệu MIDP 17
II.5 Môi trường phát triển J2ME 23
III Các thành phần giao diện ở mức cao của ứng dụng MIDP 30 III.1 Đối tượng Display, Displayable và Screens 30
III.2 Thành phần Form và Items 31
III.3 Thành phần List, Textbox, Alert, và Ticker 43
IV Các thành phần giao diện ở mức thấp của ứng dụng MIDP 51 IV.1 Các hàm API ở mức thấp 51
IV.2 Lớp Canvas 51
IV.3 Lớp Graphics 61
IV.4 Các hàm API dùng để lập trình Game 78
V Xử lý sự kiện 79 V.1 Đối tượng Command 79
V.2 Đối tượng Item 80
V.3 Ví dụ 80
VI Record Management System 82 VI.1 Persistent Storage Through the Record Store 82
VI.2 Các vấn đề liên quan đến RMS 84
VI.3 Các hàm API trong RMS 84
VI.4 Duyệt Record với RecordEnumeration 96
VI.5 Sắp xếp các record với interface RecordComparator 97
VI.6 Searching with RecordFilter 116
VI.7 Notification of Changes with RecordListener 130
VI.8 Exception Handling 135
VII Kết nối mạng với Generic Connection Framework 135 VII.1 Những protocol được hỗ trợ trong GCF 136
VII.2 Hỗ trợ giao thức HTTP trong MIDP 142
VII.3 Accessing a Java servlet 152
VIII Phụ lục 157 VIII.1 Tổng số class và interface trong CLDC 157
VIII.2 Thông tin của các dòng điện thoại thông dụng 158
VIII.3 Tham khảo: 178
Trang 3I Tổng quan về công nghệ di động
I.1 Lịch sử của điện thoại di động
I.1.1 Phát minh ra điện thoại di động:
Tiến sĩ Martin Cooper, cựu tổng giám đốc đơn vị hệ thống của Motorola, được coi là “cha đẻ”của thiết bị liên lạc di động cầm tay và cũng là người đầu tiên thực hiện một cuộc gọi thông quacông cụ này Ý tưởng liên lạc di động được bộ phận nghiên cứu AT&T thuộc Trung tâm BellLabs (Mỹ) đưa ra năm 1947 Nhưng đến cuối những năm 60 và đầu thập kỷ 70 của thế kỷ trước,Motorola và Bell Labs mới thực sự trở thành 2 đối thủ lao vào cuộc đua trong việc tích hợp côngnghệ này vào các thiệt bị cá nhân di động
Kỹ sư điện Cooper từng có 4 năm phục vụ trong hải quân trước khi chuyển về làm việc chomột công ty viễn thông nhỏ Năm 1954, ông được Motorola tuyển dụng và tham gia phát triểncác sản phẩm di động, đáng chú ý nhất là công cụ liên lạc radio di động đầu tiên dành cho cảnhsát Chicago năm 1967 Năm 1973, ông thiết lập một trạm thu phát tại New York đồng thời tung
ra mẫu đầu tiên của cái gọi là điện thoại di động (cellphone): máy Motorola Dyna-Tac Saunhững cuộc thử nghiệm ban đầu tại Washington, Cooper và Motorola quyết định đưa công nghệmới tới New York để quảng bá với công chúng
Motorola Dyna-Tac - chiếc điện thoại di động đầu tiên:
Kích thước (cm): 22,86 x 12,7 x 4,44
Trọng lượng: 1,13kg
Màn hình: không có
Số bo mạch điện: 30
Thời lượng thoại: 35 phút
Thời lượng pin: 10 tiếng
Tính năng: Nói, nghe, quay số
Ngày 3/4/1973, đứng trên một phố gần khách sạn Manhattan Hilton, Cooper quyết địnhthử thực hiện một cuộc gọi riêng trước khi đi lên gác tham dự một cuộc họp báo giới thiệu thiết
bị Cú điện thoại ấy được ông gọi tới chính đối thủ cạnh tranh của mình: Joel Engel, Giám đốcTrung tâm thí nghiệm Bell Labs
Thật tuyệt vời, “hòn gạch” biết nói nặng hơn 1kg của Cooper đã hoạt động rất tốt, kết nốiông với trạm thu phát đặt trên nóc tòa tháp Burlington Consolidated (nay là tòa nhà AllianceCapital Building) ở New York, đồng thời liên lạc được với cả đường dây cố định Những ngườiqua đường tỏ ra rất ngạc nhiên khi thấy một người đàn ông bấm bấm một công cụ gì đó, áp sátvào tai và rồi say sưa nói chuyện
Nói về tương lai của ngành di động, tiến sĩ Cooper, năm nay đã ngoài 70 tuổi, cho rằngthế giới viễn thông thực ra vẫn còn rất non trẻ và mới đang bắt đầu bùng nổ Động lực cho quátrình bùng nổ ấy trước hết là quan niệm kinh doanh mới, trong đó chú trọng vào người tiêu
Trang 4dùng Quan trọng hơn nữa là một nền hoạt động mở, trong đó có những công nghệ mới với khảnăng tăng cường khai thác giải tần Bên cạnh đó, nhà phát minh viễn thông cho rằng, cần cóchính sách để ưu tiên cho những đối tượng biết khai thác tốt nhất giải tần sóng hiện có “Nhữngthay đổi sẽ không diễn ra quá nhanh, nhưng trong 10 năm tới, đó sẽ là những chuyển biến cótính cơ bản”, Cooper nhận định “Lời khuyên của tôi về công nghệ liên lạc di động trong tươnglai, nhất là đối với các thị trường đang phát triển, là hãy từ từ, chậm nhưng hiệu quả” Theo ông,cần thận trọng trong việc phân bổ giải tần đối với mỗi ứng dụng cụ thể Và khi phân bổ, dù làcho thế hệ 3G hay 4G, cần tiến hành một cách hợp lý tùy thực tế của mỗi thị trường Đối với cácnước đang phát triển, Cooper cho rằng không nên vội cuốn theo sự cám dỗ của xu thế nhảysang 3G, cho tới khi nào thấy rõ được những ích lợi cụ thể cho mỗi ngành kinh tế và mỗi quốcgia.
kỳ đâu
Trang 52 Nokia Mobira Senator (1982)
Mới nhìn Nokia Mobira Senator giống hộp bom hơn điện thoại di động, nhưng thiết bịhình hộp to đồ sộ này là điện thoại đầu tiên của Nokia Được giới thiệu năm 1982, Nokia MobiraSenator được thiết kế sử dụng trong xe ô tô Nó nặng khoảng 10 kg
3 PDA Simon Personal Communicator (1993)
Điện thoại có tính năng PDA bây giờ không còn mới Nhưng năm 1993 đây là một ý tưởngmới lạ Simon Personal Communicator là điện thoại đầu tiên có tính năng của liên minh IBM vàBellSouth Nó là điện thoại kiêm máy tính, sổ địa chỉ, máy fax và e-mail Giá 900 USD
Trang 64 Motorola StarTAC (1996)
Trước khi Motorola Star TAC được giới thiệu năm 1996, các tính năng điện thoại di độngđược chú trọng nhiều hơn thời trang Nhưng thiết bị nhỏ bé có thể gập này đã cho thấy rằngphong cách là cực kỳ quan trọng Motorola StarTAC 3.1 ounce là nhỏ nhất trong thời điểm đó vàđến nay nó vẫn nhỏ và nhẹ hơn nhiều "dế" khác
5 Nokia 6160 (1998) và Nokia 8260 (2000)
Vào những năm 1990, các điện thoại hình thỏi kẹo của Nokia xuất hiện hàng loạt NhưngNokia 6160 và Nokia 8260 gây được sự chú ý của nhiều người Nokia 6160 có màn hình đentrắng, ăng-ten ngoài, thân 5,2 inch, nặng 6 ounce Nokia 8260 ra mắt năm 2000 ấn tượng hơnkhi được tô điểm chiếc áo màu, dài 4 inch, nặng chỉ 3,4 ounce
Trang 76 Phần mềm Palm với Kyocera QCP6035 (2000)
Nếu bạn là một trong những người hâm mộ điện thoại Treo sử dụng hệ điều hành Palm thì
có thể cảm ơn Kyocera Dế thông minh QCP6035 của công ty này thống lĩnh thị trường bán lẻnăm 2001 Với giá 400 USD và 500 USD, đây là điện thoại dùng phần mềm Palm đầu tiên đượcphân phối rộng rãi Sản phẩm có 8 MB bộ nhớ, màn hình trắng đen
7 PDA đến điện thoại: Handspring Treo 180 (2001)
Trở lại khi Palm và Handspring còn là đối thủ Handspring đã khuấy động thị trường với sảnphẩm Treo 180 gồm hai phiên bản: một với bàn pím QWERTY và một Treo 180g với thiết bịnhập liệu Graffiti Như Kyocera QCP6035, nó có màn hình đen trắng nhưng có 16MB bộ nhớ
Trang 88 Tiên phong về thiết kế xoay: Danger Hiptop (2002)
T-Mobile Sidekick từng được mệnh danh là sản phẩm của năm 2003 Mặc dù các khả năngđàm thoại của nó xoàng, nhưng là một trong những thiết bị đầu tiên cung cấp tính năng duyệtweb, truy cập email và nhắn tin Hơn thế nữa, nó là người tiên phong về thiết kế xoay tròn
9 Điện thoại cách tân: BlackBerry 5810 (2002)
BlackBerry 5810 được biết đến nhưng một thiết bị điển hình về các khả năng xử lý dữ liệu.Đây là sản phẩm đầu tiên cung cấp các tính năng voice, GSM
Trang 910 Đột phá với tính năng chụp ảnh: Sanyo SCP-5300 (2002)
Sanyo SCP-5300 PCS là "dế" đầu tiên có tính năng chụp ảnh được Sanyo và Sprint giớithiệu năm 2002 Ở độ phân giải cao nhất nó có thể chụp được các ảnh VGA (640 x 480), nhưngđến nay, tất nhiên, nó không thể sanh với các điện thoại kiêm máy ảnh 5 megapixel
11 Điện thoại kiêm máy chơi game Nokia N-Gage (2003)
Dòng máy N-Gage tạo được nhiều dư luận khi xuất hiện trên thị trường năm 2003, nhưngthật không may, đó lại là sản phẩm bất lợi Sự kết hợp điện thoại di động/thiết bị chơi gameđược kỳ vọng sẽ quyến rũ được game thủ từ bỏ máy chơi game cầm tay của họ Nhưng thayvào đó, nó gây phản cảm bởi thiết kế hình bán nguyệt kỳ quặc
Trang 1012 Siêu mỏng: Motorola Razr v3 (2004)
Điện thoại di động ngày càng mỏng và phong cách hơn, nhưng Motorola Razr v3 là sảnphẩm đầu tiên gây ấn tượng về thiết kế thời thượng mỏng và nhẹ vào 2004 Ba năm sau "dế"này vẫn được đánh giá là một trong những điện thoại phổ biến nhất trên thị trường
13 Điện thoại nghe nhạc Motorola Rokr (2005)
Motorola Rokr – điện thoại di động kiêm máy nghe nhạc đầu tiên sử dụng phần mềm nghenhạc của Apple Với thiết bị này, người dùng có thể thưởng thức các bài hát, bản nhạc từ dịch
vụ iTunes
Trang 1114 Phong cách: BlackBerry Pearl (2006)
Thiết kế mỏng, bàn phím SureType, tính năng chụp ảnh, nghe nhạc, xem video, hỗ trợ dịch vụe-mail ấn tượng và nhiều khả năng đa phương tiện khác, BlackBerry Pearl trở thành viên ngọcquý của không ít người
15 Cách tân với Apple iPhone (2007)
Sau những tháng chờ đợi, Apple khẳng định tháng 6 là thời điểm quan trọng để iPhone
sẽ xuất hiện trên thị trường Đây là thiết kế cách tân với màn hình cảm ứng cảm ứng đa điểm sẽmang lại một thế giới sinh động với e-mail bằng giọng nói, bàn phím "mềm" dạng Qwerty có thểđoán từ, trình duyệt web Safari, tích hợp camera2-megapixel iPhone là thiết bị gây tò mò nhấttrong giới chơi điện thoại di động, dùng hệ điều hành Mac OS X Giá bán: 500 USD cho mẫu 4
GB, 600 USD cho mẫu 8 GB
Trang 12I.2 Các chuẩn công nghệ
a GMS: Hệ thống thông tin di động toàn cầu
Hệ thống thông tin di động toàn cầu (tiếng Anh: Global System for Mobile Communications; tiếng Pháp: Groupe Spécial Mobile; viết tắt: GSM) là một công nghệ dùng cho
mạng thông tin di động Dịch vụ GSM được sử dụng bởi hơn 2 tỷ người trên 212 quốc gia vàvùng lãnh thổ Các mạng thông tin di động GSM cho phép có thể roaming với nhau do đó nhữngmáy điện thoại di động GSM của các mạng GSM khác nhau ở có thể sử dụng được nhiều nơitrên thế giới
GSM là chuẩn phổ biến nhất cho điện thoại di động (ĐTDĐ) trên thế giới Khả năng phúsóng rộng khắp nơi của chuẩn GSM làm cho nó trở nên phổ biến trên thế giới, cho phép người
sử dụng có thể sử dụng ĐTDĐ của họ ở nhiều vùng trên thế giới GSM khác với các chuẩn tiềnthân của nó về cả tín hiệu và tốc độ, chất lượng cuộc gọi Nó được xem như là một hệ thống
ĐTDĐ thế hệ thứ hai (second generation, 2G) GSM là một chuẩn mở, hiện tại nó được phát
triển bởi 3rd Generation Partnership Project (3GPP) Đứng về phía quan điểm khách hàng, lợithế chính của GSM là chất lượng cuộc gọi tốt hơn, giá thành thấp và dịch vụ tin nhắn Thuận lợiđối với nhà điều hành mạng là khả năng triển khai thiết bị từ nhiều người cung ứng GSM chophép nhà điều hành mạng có thể sẵn sàng dịch vụ ở khắp nơi, vì thế người sử dụng có thể sửdụng điện thoại của họ ở khắp nơi trên thế giới
Giao diện radio
GSM là mạng điện thoại di động thiết kế gồm nhiều tế bào do đó các máy điện thoại di độngkết nối với mạng bằng cách tìm kiếm các cell gần nó nhất Các mạng di động GSM hoạt độngtrên 4 băng tần Hầu hết thì hoạt động ở băng 900 Mhz và 1800 Mhz Vài nước ở Châu Mỹ thì
sử dụng băng 850 Mhz và 1900 Mhz do băng 900 Mhz và 1800 Mhz ở nơi này đã bị sử dụngtrước Các mạng sử dụng băng tần 900 Mhz thì đường uplink sử dụng tần số trong dãi 890-915MHz và đường downlink sử dụng tần số trong dãi 935-960 MHz Và chia các băng tần này thành
124 kênh với độ rộng băng thông 25 Mhz, mỗi kênh cách nhau 1 khoảng 200 Khz Sử dụng
công nghệ phân chia theo thời gian TDM (time division multiplexing) để chia ra 8 kênh full rate
hay 16 kênh haft rate Có 8 khe thời gian gộp lại gọi là 1một khung TDMA Tốc độ truyền dữ liệucủa một kênh là 270.833 kbit/s và khoảng thời gian của một khung là 4.615 m
Công suất phát của máy điện thoại được giới hạn tối đa là 2 watt đối với băng GSM850/900 Mhz và tối đa là 1 watt đối với băng GSM 1800/1900 Mhz
Mạng GSM sử dụng 2 kiểu mã hoá âm thanh để nén tín hiệu âm thanh 3,1 Khz đó là mã
hoá 6 và 13 kbps gọi là full rate (13 kbps) và haft rate (6 kbps) Để nén họ sử dụng hệ thống có tên là linear predictive coding (LPC).Vào năm 1997 thì họ cải tiến thêm cho mạng GSM là bộ mã
GSM-EFR sử dụng full rate 12,2 kbps
Có tất cả bốn kích thước cell site trong mạng GSM đó là macro, micro, pico và umbrella.Vùng phủ sóng của mỗi cell phụ thuộc nhiều vào môi trường Macro cell được lắp trên cột caohoặc trên các toà nhà cao tầng, micro cell lại được lắp ở các khu thành thị, khu dân cư, pico cell
Trang 13thì tầm phủ sóng chỉ khoảng vài chục mét trở lại nó thường được lắp để tiếp sóng trong nhà.Umbrella lắp bổ sung vào các vùng bị che khuất hay các vùng trống giữa các cell.
Bán kính phủ sóng của một cell tuỳ thuộc vào độ cao của anten, độ lợi anten thường thì nó
có thể từ vài trăm mét tới vài chục km Trong thực tế thì khả năng phủ sóng xa nhất của mộttrạm GSM là 32 km (22 dặm) Một số khu vực trong nhà mà các anten ngoài trời không thề phủsóng tới như nhà ga, sân bay, siêu thị thì người ta sẽ dùng các trạm pico để chuyển tiếp sóng
từ các anten ngoài trời vào
b GPRS (General Packet Radio Service) là dịch vụ vô tuyến gói tổng hợp được phát triển trên
nền tảng công nghệ thông tin di động toàn cầu (GSM) sử dụng đa truy nhập phân chia theo thờigian (TDMA) Công nghệ GPRS hay còn biết đến với mạng di động thế hệ 2.5G, áp dụngnguyên lý gói vô tuyến để truyền số liệu của người sử dụng một cách có hiệu quả giữa máy điệnthoại di động tới các mạng truyền số liệu
c EDGE (Enhanced Data Rates for GSM Evolution), đôi khi còn gọi là EGPRS, là một công
nghệ di động được nâng cấp từ GPRS cho phép truyền dự liệu với tốc độ có thể lên đến 384kbit/s cho người dùng cố định hoặc di chuyển chậm và 144kbit/s cho người dùng di chuyển tốc
độ cao Trên đường tiến đến 3G, EDGE được biết đến như một công nghệ 2.75G Thực tế bêncạnh điều chế GMSK, EDGE dùng phương thức điều chế 8-PSK để tăng tốc độ dự liệu truyền.Chính vì thế, để triển khai EDGE, các nhà cung cấp mạng phải thay đổi trạm phát sóng BTScũng như là thiết bị di động so với mạng GPRS
d CDMA (Code Division Multiple Access), tiếng Việt gọi là phương thức Đa truy cập phân
chia theo mã, là một kỹ thuật đa truy cập vào kênh truyền vật lý sử dụng kỹ thuật phân chia theo
mã (code) Trong kỹ thuật CDMA, tín hiệu của mỗi người dùng (user) sẽ được dàn trãi(spreading) bằng 1 mã xác định trực giao (hoặc giả trực giao) với nhau Tín hiệu truyền sẽ là tínhiệu chồng chập của nhiều người dùng khác nhau theo thời gian và trên cùng 1 băng tần số
Kỹ thuật CDMA hiện đang được sử dụng rộng rãi trong các hệ thống điện thoại di động:
IS95A/B, CDMA2000, WCDMA(UMTS)
e CDMA2000 là một họ chuẩn thông tin di động sử dụng công nghệ CDMA được chuẩn hóa bởi
3GPP2 CDMA2000 bao gồm 3 chuẩn chính: CDMA2000 1xRTT, CDMA2000 EV-DO,CDMA2000 EV-DV CDMA2000 hoạt động trong dãi tần số 450 MHz, 700 MHz, 800 MHz, 900MHz, 1700 MHz, 1800 MHz, 1900 MHz, và 2100 MHz CDMA2000 là công nghệ 3G tiếp nối củacông nghệ 2G CdmaOne (hay IS-95) và được xem như là một đối thủ cạnh tranh với công nghệ3G/UMTS Tuy nhiên, CDMA2000 1xRRT thường được nhắc đến như là một công nghệ 2.5G(tương ứng với GPRS)
f CDMA2000 EV-DO (Evolution-Data Optimized) là một chuẩn thông tin di động thuộc họ
CDMA2000, kết hợp giữa kỹ thuật CDMA và TDMA để cung cấp dịch vụ số liệu tốc độ cao.CDMA2000 EV-DO được QualComm đề xuất vào 3/2000 và được chuẩn hóa bởi 3GPP2
Đặc điểm nổi bật của CDMA2000 EV-DO:
Trang 14- EV-DO hỗ trợ tốc độ số liệu hướng xuống 2,4576 Mbps trên băng thông 1,25 MHz và
tốc độ số liệu hướng lên 153,6 Kbps
- Trạm gốc linh hoạt dễ dàng phát công suất lớn
- Hỗ trợ sơ đồ điều chế cấp cao kèm với khả năng thực hiện nhiều phương pháp sửa lỗi
- Kỹ thuật chuyển mạch đó là chuyển mạch gói ghép kênh theo thời gian
g Time Division Multiple Access (TDMA), tiếng Việt gọi là phương thức Đa truy cập phân chia theo thời gian, là một kĩ thuật đa truy cập vào kênh truyền vật lý sử dụng kĩ thuật phân
chia theo thời gian
Trang 15II Giới thiệu về J2ME
II.1 Lịch sử
J2ME được phát triển từ kiến trúc Java Card, Embeded Java và Personal Javacủa phiên bản Java 1.1 Đến sự ra đời của Java 2 thì Sun quyết định thay thế PersonalJava và đươc gọi với tên mới là Java 2 Micro Edition, hay viết tắt là J2ME Đúng với têngọi, J2ME là nền tảng cho các thiết bị có tính chất nhỏ, gọn:
II.2 Lý do chọn J2ME
a) Java ban đầu được thiết kế dành cho các máy với tài nguyên bộ nhớ hạnchế
b) Thị trường của J2ME được mở rộng ra cho nhiều chủng loại thiết bị như:
Các lọai thẻ cá nhân như Java Card
Máy điện thoại di động
Máy PDA (Personal Digital Assistant - thiết bị trợ giúp cá nhân)
Các hộp điều khiển dành cho tivi, thiết bị giải trí gia dụng …
II.3 Kiến trúc của J2ME
Phần này sẽ trình bày kiến trúc tổng quát của nền tảng Java
Trang 16a) Giới thiệu các thành phần trong nền tảng J2ME:
Định nghĩa về Configuration (Cấu hình): là đặc tả định nghĩa một môi trường phần mềmcho một dòng các thiết bị được phân loại bởi tập hợp các đặc tính, ví dụ như:
CLDC (Connected Limited Device Configuration-Cấu hình thiết bị kết nối giớihạn): được thiết kế để nhắm vào thị trường các thiết bị cấp thấp (low-end),các thiết bị này thông thường là máy điện thọai di động và PDA với khoảng
512 KB bộ nhớ Vì tài nguyên bộ nhớ hạn chế nên CLDC được gắn với Javakhông dây (Java Wireless ), dạng như cho phép người sử dụng mua và tải vềcác ứng dụng Java, ví dụ như là Midlet
CDC- Connected Device Configuration (Cấu hình thiết bị kết nối): CDCđược đưa ra nhắm đến các thiết bị có tính năng mạnh hơn dòng thiết bị thuộcCLDC nhưng vẫn yếu hơn các hệ thống máy để bàn sử dụng J2SE Nhữngthiết bị này có nhiều bộ nhớ hơn (thông thường là trên 2Mb) và có bộ xử lýmạnh hơn Các sản phẩm này có thể kể đến như các máy PDA cấp cao,điện thoại web, các thiết bị gia dụng trong gia đình …
Cả 2 dạng Cấu hình kể trên đều chứa máy ảo Java (Java Virtual Machine) và tậphợp các lớp (class) Java cơ bản để cung cấp một môi trường cho các ứng dụng J2ME Tuynhiên, bạn chú ý rằng đối với các thiết bị cấp thấp, do hạn chế về tài nguyên như bộ nhớ và
bộ xử lý nên không thể yêu cầu máy ảo hổ trợ tất cả các tính năng như với máy ảo của
Trang 17J2SE, ví dụ, các thiết bị thuộc CLDC không có phần cứng yêu cầu các phép tính toán dấuphẩy động, nên máy ảo thuộc CLDC không được yêu cầu hỗ trợ kiểu float và double.
Bảng dưới là sự so sánh các thông số kỹ thuật của CDC và CLDC
Định nghĩa veef Profile: Profile mở rộng Configuration bằng cách thêm vào các class để
bổ trợ các tính năng cho từng thiết bị chuyên biệt Cả 2 Configuration đều có những profileliên quan và từ những profile này có thể dùng các class lẫn nhau Đến đây ta có thể nhậnthấy do mỗi profile định nghĩa một tập hợp các class khác nhau, nên thường ta không thểchuyển một ứng dụng Java viết cho một profile này và chạy trên một máy hỗ trợ một profilekhác Cũng với lý do đó, bạn không thể lấy một ứng dụng viết trên J2SE hay J2EE và chạytrên các máy hỗ trợ J2ME Sau đây là các profile tiêu biểu:
Mobile Information Device Profile (MIDP): profile này sẽ bổ sung các tính năng như
hỗ trợ kết nối, các thành phần hỗ trợ giao diện người dùng … vào CLDC Profile nàyđược thiết kế chủ yếu để nhắm vào điện thọai di động với đặc tính là màn hình hiểnthị hạn chế, dung lượng chứa có hạn Do đó MIDP sẽ cung cấp một giao diện ngườidùng đơn giản và các tính năng mạng đơn giản dựa trên HTTP Có thể nói MIDP làprofile nổi tiếng nhất bởi vì nó là kiến thức cơ bản cho lập trình Java trên cácmáy di động (Wireless Java)
PDA Profile: tương tự MIDP, nhưng với thị trường là các máy PDA với màn hình và bộnhớ lớn hơn
Foundation Profile: cho phép mở rộng các tính năng của CDC với phần lớn các thư
Trang 18viện của bộ Core Java2 1.3
Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile
II.4 Giới thiệu MIDP
II.4.1 Giới thiệu về MIDP
a) Định nghĩa:
Đây là Profile được định nghĩa dành riêng cho các thiết bị di động và là thànhphần chính trong J2ME MIDP cung cấp các chức năng cơ bản cho hầu hết các dòngthiêt bị di động phổ biến nhất như các máy điện thoạI di động và các máy PDA Tuy nhiênMIDP không phải là cây đũa thần cho mọi lập trình viên vì như chúng ta đã biết, MIDPđược thiết kế cho các máy di động có cấu hình rất thấp Trong phần sau tôi sẽ liệt kê quacác tính năng mà MIDP cung cấp và những giới hạn của nó
b) Những chức năng MIDP không thực hiện được:
Phép tính dấu phẩy động (floating point): Phép tính này đòi hỏi rất nhiều tàinguyên CPU và phần lớn các CPU cho các thiết bị di động không hỗ trợ phép tínhnày, do đó MIDP cũng không có
Bộ nạp class (Class Loader)
Hỗ trợ từ khóa finalize() như trong J2SE: Việc “dọn dẹp“ tài nguyên trước khi nó bị xóađược đẩy về phía các lập trình viên
Không hỗ trợ JNI
Hỗ trợ hạn chế thao tác bắt lỗi
Phần lớn các thư viện API cho Swing và AWT không thể sử dụng được trong MIDP
Không hỗ trợ các tính năng quản lý file và thư mục: Đây có thể làm bạn ngạcnhiên nhưng thực tế là các thiết bị J2ME không có hỗ trợ các thiết bị lưu trữ thôngthường như ổ cứng v.v Tuy nhiên, điều đó không có nghĩa là bạn phải mất đi mọi dữliệu quan trọng mỗi khi tắt máy, Sun đã cung cấp một chức năng khác tươngđương gọi là Record Management system (RMS) để cung cấp khả năng lưu trữ chocác thiết bị này
c) Những chức năng MIDP cung cấp
Trang 19 Các lớp và kiểu dữ liệu: Phần lớn các lớp mà các lập trình viên Java quen thuộcvẫn còn được giữ lại ví dụ như các lớp trong gói java.util như Stack, Vector vàHastable cũng như Enumeration.
Hỗ trợ đối tượng Display: Đúng như tên gọi một chương trình MIDP sẽ hỗ trợ duynhất một đối tượng Display là đối tượng quản lý việc hiển thị dữ liệu trên mànhình điện thoại
Hỗ trợ Form và các giao diện người dùng
Hỗ trợ Timer và Alert
Cung cấp tính năng Record Management System (RMS) cho việc lưu trữ dữ liệu
Ngoài ra vào tháng 11 năm 2003 Sun đã tung ra MIDP 2.0 với hàng loạt tính năng khácđược cung cấp thêm so với bản 1.0 Những cải tiến nổi bật so với MIDP 1.0
Nâng cấp các tính năng bảo mật như
o Download qua mạng an toàn hơn qua việc hỗ trợ giao thức HTTPS
o Kiểm soát việc kết nối giữa máy di động và server: ví dụ như các chương trìnhkhông thể kết nối tới server nếu thiếu sự chấp thuận của người sử dụng
Thêm các API hỗ trợ Multimedia Một trong nhưng cải tiến hấp dẫn nhất của MIDP 2.0
là tập các API media của nó Các API này là một tập con chỉ hỗ trợ âm thanh củaMobile Media API (MMAPI)
Mở rộng các tính năng của Form Nhiều cải tiến đã được đưa vào APIjavax.microedition.lcdui trong MIDP 2.0, nhưng các thay đổi lớn nhất (ngoài APIcho game) là trong Form và Item
Hỗ trợ các lập trình viên Game bằng cách tung ra Game API: Có lẽ Sun đã kịp nhận rathị trường đầy tiềm năng của các thiết bị di động trong lĩnh vực Game Với MIDP 1.0thì các lập trình viên phải tự mình viết code để quản lý các hành động của nhân vậtcũng như quản lý đồ họa Việc này sẽ làm tăng kích thước file của sản phẩm cũngnhư việc xuất hiện các đoạn mã bị lỗi Được hưởng lợi nhất từ Game API trong MIDP2.0 không chỉ là các lập trình viên Game mà còn là các lập trình viên cần sử dụngcác tính năng đồ họa cao cấp Ý tưởng cơ bản của Game API là việc giả định rằngmột màn hình game là tập hợp các layer (lớp) Ví dụ như: trong một game đua xe thìmàn hình nền là một layer, con đường là một layer và chiếc xe được xem nhưđang nằm trên layer khác Với Game API nhà phát triển còn được cung cấp các tínhnăng như quản lý các thao tác bàn phím
Hỗ trợ kiểu ảnh RGB: một trong những cải tiến hấp dẫn cho các nhà phát triển MIDP làviệc biểu diễn hình ảnh dưới dạng các mảng số nguyên, cho phép MIDlet thao tác với
dữ liệu hình ảnh một cách trực tiếp
II.4.2 MIDLet
MIDP (Mobile Information Device Profile) là tập các hàm API dành cho thiết bị thông tin di
động MIDlet là ứng dụng MIDP Thuật ngữ MIDlet và MID application được sử dụng như nhau.Các MIDlets hình thành nên các khối xây dựng của môi trường thực thi Java 2 Platform MicroEdition (J2ME)
Trang 20MIDlet được thiết kế để chạy và được điều khiển bởi trình quản lý ứng dụng trong máy ảo K
(K Virtual Machine - KVM), một dạng đơn giản nhất của máy ảo Java được thiết kế để chạy trên thiết bị di động Lớp javax.microedition.midlet.MIDlet hoạt động như là một giao diện (interface)
giữa MIDlet và trình quản lý ứng dụng Các phương thức thuộc lớp này cho phép trình quản lýứng dụng tạo, bắt đầu, tạm dừng, và hủy MIDlet
Hình 1 Hình biểu diễn MIDlet
Thông báo import dùng để truy xuất các lớp của CLDC và MIDP Lớp chính của ứng dụngđược định nghĩa là lớp kế thừa lớp MIDlet của MIDP Có thể chỉ có một lớp trong ứng dụng kếthừa lớp này Lớp MIDlet được trình quản lý ứng dụng trên điện thoại di động dùng để khởi động,dừng, và tạm dừng MIDlet Ví dụ, trong trường hợp có cuộc gọi đến
II.4.3 Bộ khung của MIDlet (MIDlet Skeleton)
Một MIDlet là một lớp Java kế thừa (extend) của lớp trừu tượngjava.microedition.midlet.MIDlet và thực thi (implement) các phương thức startApp(), pauseApp(),
Trang 21Hàm tạo chỉ được thực thi một lần khi MIDlet được khởi tạo lần đầu tiên Hàm tạo sẽ khôngđược gọi lại trừ phi MIDlet thoát và sau đó khởi động lại.
(4) startApp():
Phương thức startApp() được gọi bởi bộ quản lý ứng dụng khi MIDlet được khởi tạo, và mỗikhi MIDlet trở về từ trạng thái tạm dừng Nói chung, các biến toàn cục sẽ được khởi tạo lại trừhàm tạo bởi vì các biến đã được giải phóng trong hàm pauseApp() Nếu không thì chúng sẽ khôngđược khởi tạo lại bởi ứng dụng
(5) pauseApp():
Phương thức pauseApp() được gọi bởi bộ quản lý ứng dụng mỗi khi ứng dụng cần được tạmdừng (ví dụ, trong trường hợp có cuộc gọi hoặc tin nhắn đến) Cách thích hợp để sử dụngpauseApp() là giải phóng tài nguyên và các biến để dành cho các chức năng khác trong điện thoạitrong khi MIDlet được tạm dừng Cần chú ý rằng khi nhận cuộc gọi đến hệ điều hành trên điệnthoại di động có thể dừng KVM thay vì dừng MIDlet Việc này không được đề cập trong MIDP
mà đó là do nhà sản xuất quyết định sẽ chọn cách nào
(6) destroyApp():
Phương thức destroyApp() được gọi khi thoát MIDlet Ví dụ khi nhấn nút exit trong ứngdụng Nó chỉ đơn thuần là thoát MIDlet Nó không thật sự xóa ứng dụng khỏi điện thoại di động.Phương thức destroyApp() chỉ nhận một tham số Boolean Nếu tham số này là true, MIDlet đượctắt vô điều kiện Nếu tham số là false, MIDlet có thêm tùy chọn từ chối thoát bằng cách ném ramột ngoại lệ MIDletStateChangeException
II.4.4 Vòng đời của MIDlet (gMIDlet lifecycle)
Lớp chính của một MIDlet kế thừa là lớp javax.microedition.midlet.MIDlet Lớp chính nàyđịnh nghĩa ba phương thức hành động trong chu kỳ sống của nó: startApp(), pauseApp(), vàdestroyApp()
Có ba trạng thái trong vòng đời của một MIDlet:
paused: MIDlet instance đã được tạo xong và chưa hoạt động (inactive)
active: MIDlet đang hoạt động
destroyed: MIDlet đã kết thúc và sẵn sàng cho việc tái chế bởi bộ thu gom rác
Chú ý ở đây không có trạng thái nào tương đương với trạng thái loaded của applet, bởi vì ở
đây không có phương thức khởi tạo Thông thường, một MIDlet khởi tạo chính nó ngay lần đầutiên khi phương thức startApp() được gọi
Trang 22Hình 3 Hình biểu diễn các trạng thái của MIDlet
Khi người dùng yêu cầu khởi động ứng dụng MIDlet, bộ quản lý ứng dụng sẽ thực thiMIDlet (thông qua lớp MIDlet) Khi ứng dụng thực thi, nó sẽ được xem là đang ở trạng thái tạmdừng Bộ quản lý ứng dụng gọi hàm tạo và hàm startApp() Hàm startApp() có thể được gọi nhiềulần trong suốt chu kỳ sống của ứng dụng Hàm destroyApp() chỉ có thể gọi từ trạng thái hoạt độnghay tạm dừng
Lập trình viên cũng có thể điều khiển trạng thái của MIDlet Các phương thức dùng để điềukhiển các trạng thái của MIDlet:
resumeRequest(): Yêu cầu vào chế độ hoạt động Ví dụ: Khi MIDlet tạm dừng, và một sự
kiện timer xuất hiện
notifyPaused(): Cho biết MIDlet tự nguyện chuyển sang trạng thái tạm dừng
Ví dụ: Khi đợi một sự kiện timer
notifyDestroyed(): Sẵn sàng để hủy Ví dụ: Xử lý nút nhấn Exit
Lập trình viên có thể yêu cầu tạm dừng MIDlet trong khi đợi một sự kiện timer hết hạn
Trong trường hợp này, phương thức notifyPaused() sẽ được dùng để yêu cầu bộ quản lý ứng dụng
chuyển ứng dụng sang trạng thái tạm dừng
II.4.5 Tập tin JAR
Các lớp đã biên dịch của ứng dụng MIDlet được đóng gói trong một tập tin JAR (JavaArchive File) Đây chính là tập tin JAR được download xuống điện thoại di động
Tập tin JAR chứa tất cả các tập tin class từ một hay nhiều MIDlet, cũng như các tài nguyêncần thiết Hiện tại, MIDP chỉ hỗ trợ định dạng hình png (Portable Network Graphics) Tập tinJAR cũng chứa tập tin kê khai (manifest file) mô tả nội dung của MIDlet cho bộ quản lý ứng dụng
Trang 23Nó cũng phải chứa các tập tin dữ liệu mà MIDlet cần Tập tin JAR là toàn bộ ứng dụng MIDlet.MIDlet có thể load và triệu gọi các phương thức từ bất kỳ lớp nào trong tập tin JAR, trong MIDP,hay CLDC Nó không thể truy xuất các lớp không phải là bộ phận của tập tin JAR hay vùng dùngchung của thiết bị di động.
Mô tả nội dung của tập tin JAR:
Các trường yêu cầu:
Manifest-Version // Phiên bản tập tin Manifest
MIDlet-Name // Tên bộ MIDlet (MIDlet suite)
MIDlet-Version // Phiên bản bộ MIDlet
MIDlet-Vendor // Nhà sản xuất MIDlet
MIDlet-<n> for each MIDlet // Tên của MIDlet
MicroEdtion-Profile // Phiên bản hiện trạng
MicroEdtion-Configuration // Phiên bản cấu hình
Tập tin kê khai (manifest) và tập tin JAD
Tập tin kê khai (manifest.mf) và tập tin JAD (Java Application Descriptor) mô tả các đặcđiểm của MIDlet Sự khác biệt của hai tập tin này là tập tin kê khai là một phần của tập tin JARcòn tập tin JAD không thuộc tập tin JAR Ưu điểm của tập tin JAD là các đặc điểm của MIDlet cóthể được xác định trước khi download tập tin JAR Nói chung, cần ít thời gian để download mộttập tin văn bản nhỏ hơn là download một tập tin JAR Như vậy, nếu người dùng muốn downloadmột ứng dụng không được thiết bị di động hỗ trợ (ví dụ, MIDP 2.0), thì quá trình download sẽ bịhủy bỏ thay vì phải đợi download hết toàn bộ tập tin JAR
Ví dụ một tập tin manifest.mf:
MIDlet-Name: CardGames
MIDlet-Version: 1.0.0
MIDlet-Vendor: Sony Ericsson
MIDlet-Description: Set of Card Games
MIDlet-1: Solitaire, /Sol.png, com.semc.Solitaire
MIDlet-2: BlackJack, /Blkjk.png, com.semc.BlackJack
Tập tin JAD chứa cùng thông tin như tập tin manifest Nhưng nó nằm ngoài tập tin JAR
Trang 24Các thuộc tính MIDlet-Name, MIDlet-Version, và MIDlet-Vendor phải được lặp lại trong
tập tin JAD và JAR Các thuộc tính khác không cần phải lặp lại Giá trị trong tập tin mô tả sẽ đègiá trị của tập tin manifest
II.4.6 Bộ MIDlet (MIDlet Suite)
Một tập các MIDlet trong cùng một tập tin JAR được gọi là một bộ MIDlet (MIDlet suite).Các MIDlet trong một bộ MIDlet chia sẻ các lớp, các hình ảnh, và dữ liệu lưu trữ bền vững Đểcập nhật một MIDlet, toàn bộ tập tin JAR phải được cập nhật
Hình 4 Hình biểu diễn hai bộ MIDlet
Trong hình trên, một bộ MIDlet chứa MIDlet1, MIDlet2, và MIDlet3 Bộ kia chỉ chứaMIDlet4 Ba MIDlet trong bộ đầu tiên truy xuất các lớp và dữ liệu của nhau nhưng không truyxuất đến các lớp hay dữ liệu của MIDlet4 Ngược lại, MIDlet4 cũng không truy xuất được các lớp,hình ảnh, và dữ liệu của chúng
II.5 Môi trường phát triển J2ME
II.5.1 Phát triển ứng dụng J2ME với J2ME Wireless Toolkit
Có nhiều môi trường phát triển ứng dụng J2ME và mỗi hãng điện thoại cũng đưa
ra những môi trường phát triển cho riêng mình Ở đây tôi sẽ giới thiệu toolkit của Sun:J2ME Wireless Toolkit
Địa chỉ download chương trình: http://java.sun.com/j2me/download.html Ngoài ra bạncần phải có J2SDK 1.4 trở lên
Cài đặt Wireless tool Kit 2.5.1
- Wireless toolkit là công cụ cho phép chúng ta biên dịch và chạy những ứng dụng điệnthoại trên điện thoại ảo có thể download tạihttp://java.sun.com/products/sjwtoolkit/download-
2_5_1.html
Trang 25- Chạy file sun_java_wireless_toolkit-2_5_1-windows.exe để cài đặt chương trình Sau khicài đặt thành công, bạn sẽ có thư mục chương trình trong menu Start như hình bên dưới
Để chạy chương trình chúng ta chọn wireless Toolkit 2.5.1 Bạn sẽ thấy cửa sổ hiện ra nhưhình bên dưới
Chương trình Hello đầu tiên
- Chúng ta click chuột vào New project và nhấp vào Project và Class bạn muốn tạo vidu:TestMidlet và không nhất thiết tên Class trùng với tên Project
- Từ Target Platform chọn Custom Ví dụ chúng ta muốn ứng dụng thích hợp với điệnthoại N70 cho nên trong group MIDP 2.0 và CLDC 1.1, chúng ta có thể tra cứu flatform tại đâyhttp://www.forum.nokia.com/devices/matrix_s60_1.html
Trang 26ToolKit sẽ tự động tạo 1 thư mục con trong thư mục apps có tên trùng với tên Project màbạn vừa tạo, trong trường hợp này là TestMidlet.
Trang 27Các thư mục trong dự án:
- Bin: Chứa 2 file để cài đặt, Jar ( Java ARchive) và file miêu tả jad
- Lib: Chứa các thư viện bổ sung mà bạn muốn thêm vào chương trình
- Res: là thư mục để bạn để các file tài nguyên dành riêng cho chương trình như file vănbản và hình ảnh
- Src: Đây là thư mục quan trọng nhất, là nơi bạn đặt các file chứa mã nguồn
Bây giờ chúng ta dùng chương trình soãn thảo văn bản nào đó và viết:
mMainForm.append(new StringItem(null, "Chao cac ban, MIDP!")); 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) {
Trang 28notifyDestroyed();
} }
- Sau đó, hãy lưu đoạn code trên vào file tên là TestMidlet.java trong thư mục src
- Bấm vào nút Build, nếu code của bạn không bị lỗi, bạn sẽ nhận được thông báo sau:Project settings saved; Building "TestMidlet"; Build complete
- Nhấn nút Run để chạy Emulator
- Nếu bạn thấy trên máy bạn xuất hiện hình như hình bên dưới thì xin chúc mừng bạn.Chương trình J2ME đầu tiên đã chạy thành công
Trang 29II.5.2 Phát triển ứng dụng J2ME với Netbean
Import Wireless toolkit project sang Netbeans
- Trước tiên ta cần phải có module Netbeans_mobility 5.5.1 đề gắn vào Netbeans 5.5.1, bạn cóthể download tại đâyhttp://dlc.sun.com/netbeans/download/5_ 704122300/
- Chạy file netbeans_mobility-5_5_1-windows_2.exe để cài đặt
- Đây là dao diện khi khởi động Netbeans
- Bước 1: Chọn File -> New Project
- Bước 2: trong Categories chọn Mobile và trong Projects chọn Import Wireless Toolkit Project,sau đó chọn Next
- Bước 3: Browse tới thư mục C:\WTK2.5.1\apps (nơi cài đặt Wireless Toolkit) chọn TestMidlet
sau đó chọn Open -> Next.
Trang 30- Bước 4: Đặt tên Project và cấu hình như hình dưới đây, sau đó nhấn Next.
- Bước 5: cấu hình như hình dưới Device Configuration và Device Profile chương trinh sẽ tự
Trang 31động chọn tương ứng với Midlet và CLDC bên Project của Wireless Toolkit, tuy nhiên chúng ta
có thể chọn theo mục đích riêng của mình mà không làm ảnh hường tới Project nguồn bênWireless Toolkit vì Netbeans sẽ tự đông copy Project nguồn sang dạng Project của Netbeanssau mỗi lần biên dịch Người lập trình có thể edit code trên Project nguồn hay Project của
Netbeans tùy ý Cuối cùng là chọn Finish
- Để build chương trình chúng ta có thể vào Build -> Build Main Project và Run -> Run MainProject để chạy chương trình
III Các thành phần giao diện ở mức cao của ứng dụng MIDP III.1 Đối tượng Display, Displayable và Screens
Một ứng dụng MIDlet chỉ có 1 đối tượng thể hiện Display Đối tượng này dùng để
lấy thông tin về đối tượng trình bày, ví dụ màu được hỗ trợ, và bao gồm các phương
thức để yêu cầu các đối tượng được trình bày Đối tượng Display cần thiết cho bộ
quản lý việc trình bày trên thiết bị điều khiển thành phần nào sẽ được hiển thị lên trênthiết bị
Mặc dù chỉ có một đối tượng Display ứng với mỗi MIDlet, nhưng nhiều đối
tượng trong một MIDlet có thể được hiển thị ra trên thiết bị như Forms, TextBoxes, ChoiceGroups,
Một đối tượng Displayable là một thành phần được hiển thị trên một thiết bị MIDP chứa 2 lớp con của lớp Displayable là Screen và Canvas Hình dưới đây mô tả mối
quan hệ trên
Một đối tượng Screen không phải là một cái gì đó hiện ra trên thiết bị, mà lớp Screen
Trang 32này sẽ được thừa kế bởi các thành phần hiển thị ở mức cao, chính các thành phần này
sẽ được hiển thị ra trên màn hình Hình dưới đây sẽ mô tả mối quan hệ của lớp Screen
và các thành phần thể hiện ở mức cao
Tóm lại, phần này chỉ giới thiệu hệ thống phân cấp đối tượng dùng để thể hiện giaodiện người dùng trong MIDP
III.2 Thành phần Form và Items
Trong phần này sẽ giới thiệu các thành phần được hiển thị ra trên một Form Một Form chỉ đơn giản là một khung chứa các thành phần, mà mỗi thành phần được thừa kế
từ lớp Item Chúng ta sẽ xem qua các thành phần hiển thị trên thiết bị trên:
Trang 33Thành phần DateField cung cấp một phương tiện trực quan để thao tác đối tượng
Date được định nghĩa trong java.util.Date Khi tạo một đối tượng DateField, bạn cần chỉ
rõ là người dùng chỉ có thể chỉnh sửa ngày, chỉnh sửa giờ hay đồng thời cả hai Cácphương thức dựng của lớp DateField gồm:
D ateField(String label, int m ode)
D ateField(String label, int m ode, Tim eZone tim eZone)
Các mode tương ứng của lớp DateField gồm:
D ateField.D A TE_TIM E: cho phép thay đổi ngày giờ
D ateField.TIM E: chỉ cho phép thay đổi giờ
D ateField.D A TE: chỉ cho phép thay đổi ngày
Ví dụ:
private DateField dfAlarm;
// T ạ o m ột đổi tượ ng DateField v ớ i nhãn, cho phép thay
implements ItemStateListener, CommandListener {
object private Form fmMain; // Main form private Command cmExit; // Exit MIDlet private DateField dfAlarm; // DateField component public DateFieldTest()
{ display = Display.getDisplay(this);
// The main form fmMain = new Form("DateField Test");
// DateField with todays date as a default dfAlarm = new DateField("Set Alarm Time", DateField.DATE_TIME);
Trang 34} public void startApp () {
display.setCurrent(fmMain);
} public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void itemStateChanged(Item item) {
System.out.println("Date field changed.");
} public void commandAction(Command c, Displayable s) {
if (c == cmExit) {
destroyApp(false);
notifyDestroyed();
} } } b) Gauge
Một thành phần Gauge là một kiểu giao diện thường được dùng để mô tả mức độ hoàn thành một công việc Có 2 loại Gauge là loại tương tác và loại không tương tác Loại đầu cho phép người dùng có thể thay đổi Gauge, loại 2 thì đòi hỏi người phát triển phải cập nhật Gauge
Dười đây là hàm dựng của lớp Gauge:
G auge(String label, boolean interactive, int maxValue, int initialValue)
Ví dụ:
private Gauge gaVolume; // Đ i u
ch ỉ n h âm lượ ng gaVolume = new Gauge("Sound Level", true, 100, 4);
Dưới đây là đoạn chương trình mẫu minh họa cách sử dụng lớp Gauge
private Command cmExit; // Exit the form private Gauge gaVolume; // Volume adjustment
Trang 35public InteractiveGauge() {
display = Display.getDisplay(this);
// Create the gauge and exit command gaVolume = new Gauge("Sound Level", true, 50, 4);
cmExit = new Command("Exit", Command.EXIT, 1);
// Create form, add commands, listen for events fmMain = new Form(""); fmMain.addCommand(cmExit);
fmMain.append(gaVolume); fmMain.setCommandListener(this);
} // Called by application manager to start the MIDlet.
public void startApp() {
display.setCurrent(fmMain);
} public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable s) {
if (c == cmExit) {
destroyApp(false);
notifyDestroyed();
} } } c) StringItem
Một thành phần StringItem được dùng để hiển thị một nhãn hay chuỗi văn bản.
Người dùng không thể thay đổi nhãn hay chuỗi văn bản khi chương trình đang chạy.StringItem không nhận ra sự kiện
Phương thức dựng của lớp StringItem
StringItem(String label, String text)
Dưới đây là đoạn mã minh họa việc sử dụng đối tượng StringItem
private Display display; // Reference to
Display object private Form fmMain; //
Trang 36Main form
private StringItem siMsg; // StringItem
private Command cmChange; // Change the
label and message private Command cmExit; // Exit
the MIDlet
public StringItemTest()
{
display = Display.getDisplay(this );
// Create text message and commands
siMsg = new StringItem("Website: ", "www.IBM.com");
cmChange = new Command("Change", Command.SCREEN, 1);
cmExit = new Command("Exit", Command.EXIT, 1);
// Create Form, add Command and StringItem, listen for events fmMain = new Form("StringItem
// Called by application manager to start the MIDlet.
public void startApp()
// Change text siMsg.setText("developerWor ks");
Trang 37// Remove the command fmMain.removeCommand(cmChange);
tự nhập vào sẽ được che bởi các ký tự mặt nạ
Phương thức dựng của lớp TextField
TextField(String label, String text, int maxSize, int constraints)
Thành phần thứ 3 constraints là thành phần mà chúng ta quan tâm, vì nó là phương tiện để xác định loại dữ liệu nào được phép nhập vào TextField
MIDP định nghĩa các tham số ràng buộc sau cho thành phần TextField:
ANY: cho phép nhập bất kỳ ký tự nào
EMAILADDR: chỉ cho phép nhâp vào các địa chỉ email hợp lệ
NUMERIC: chỉ cho phép nhập số
PHONENUMBER: Chỉ cho phép nhập số điện thoại
URL: Chỉ cho phép nhập các ký tự hợp lệ bên trong URL
PASSWORD: che tất cả các ký tự nhập vào
Dưới đây là đoạn mã minh họa việc sử dụng thành phần TextField
private Display display; // Reference
to Display object private Form fmMain;// Main
form
private Command cmTest; // Get
contents of textfield private Command cmExit;
// Command to exit the MIDlet private TextField tfText; // Textfield
Trang 38cmExit = new Command("Exit", Command.EXIT, 1);
// Textfield for phone number
tfText = new TextField("Phone:", "", 10, TextField.PHONENUMBER);
// Create Form, add Commands and textfield, listen for events fmMain = new Form("Phone Number");
// Called by application manager to start the MIDlet.
public void startApp()
Thành phần ChoiceGroup cho phép người dùng chọn từ một danh sách đầu vào
đã được định nghĩa trước ChoiceGroup có 2 loại:
multi-selection(cho phép chọn nhiều mục): nhóm này có liên quan đến các
Trang 39 exclusive-selection(chỉ được chọn một mục): nhóm này liên quan đến nhóm
các radio buttonDưới đây là đoạn mã minh họa cho việc sử dụng ChoiceGroup:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ChoiceGroupTest extends MIDlet implements ItemStateListener, CommandListener {
private Display display; // Reference to display object private Form fmMain; //
Main form private Command cmExit; // A Command to exit the MIDlet private Command cmView; // View the choice selected private int selectAllIndex;
// Index of the "Select All" option private ChoiceGroup cgPrefs; // Choice Group of preferences
private int choiceGroupIndex; // Index of
choice group on form public ChoiceGroupTest() {
cgPrefs.append("Save bookmarks", null);
cgPrefs.append("Detect file type", null); selectAllIndex =
cgPrefs.append("Select All", null);
cmExit = new Command("Exit", Command.EXIT, 1);
cmView = new Command("View", Command.SCREEN,2);
// Create Form, add components, listen for events fmMain = new Form("");
choiceGroupIndex = fmMain.append(cgPrefs);
Trang 40{ display.setCurrent(fmMain);
boolean selected[] = new boolean[cgPrefs.size()];
// Fill array indicating whether each element is checked
cgPrefs.getSelectedFlags(selected);
for (int i = 0; i <
cgPrefs.size(); i++) System.out.println(cgPrefs.getSt ring(i) +
(selected[i] ? ": selected" : ": not selected"));
} else if (c == cmExit) {
destroyApp(false);
notifyDestroyed();
} }
public void itemStateChanged(Item item) {
if (item == cgPrefs) {
// Is "Select all" option checked ?
if (cgPrefs.isSelected(selectAllIndex)) {
// Set all checkboxes to true for (int i = 0; i < cgPrefs.size(); i++) cgPrefs.setSelectedIndex(i, true);
// Remove the check by "Select All"
cgPrefs.setSelectedIndex(selectAllIndex, false);
} }
}