Tài liệu Khóa luận Nghiên cứu JAVA MOBILE va xây dựng ứng dụng minh họa: SV
ne
t.vn
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG MÁY TÍNH – VIỄN THÔNG
ĐẶNG NGUYỄN KIM ANH – ĐÀO ANH TUẤN
NGHIÊN CỨU JAVA MOBILE
VÀ XÂY DỰNG ỨNG DỤNG
MINH HỌA
KHÓA LUẬN CỬ NHÂN TIN HỌC
TP.HCM, 2005
SV
ne
t.vn
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG MÁY TÍNH – VIỄN THÔNG
ĐẶNG NGUYỄN KIM ANH – 0112424
ĐÀO ANH TUẤN – 0112451
NGHIÊN CỨU JAVA MOBILE
VÀ XÂY DỰNG ỨNG DỤNG
MINH HỌA
KHÓA LUẬN CỬ NHÂN TIN HỌC
GIÁO VIÊN HƯỚNG DẪN
Thầy NGUYỄN MINH TUẤN
NIÊN KHÓA 2001-2005
SV
ne
t.vn
Lời Cảm Ơn!
Sau hơn năm tháng tìm hiểu và thực hiện, luận văn “Nghiên cứu công nghệ
Java Mobile và xây dựng ứng dụng minh hoạ” đã cơ bản hoàn thành. Để đạt được
kết quả này, chúng tôi đã nỗ lực hết sức đồng thời cũng nhận được rất nhiều sự
quan tâm, giúp đỡ, ủng hộ của các thầy cô, bạn bè và gia đình.
Trước hết, chúng em xin gởi lời cảm ơn chân thành đến Bộ môn Mạng máy
tính và Viễn thông, Khoa ...
234 trang |
Chia sẻ: haohao | Lượt xem: 1069 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Khóa luận Nghiên cứu JAVA MOBILE va xây dựng ứng dụng minh họa, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
SV
ne
t.vn
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG MÁY TÍNH – VIỄN THÔNG
ĐẶNG NGUYỄN KIM ANH – ĐÀO ANH TUẤN
NGHIÊN CỨU JAVA MOBILE
VÀ XÂY DỰNG ỨNG DỤNG
MINH HỌA
KHÓA LUẬN CỬ NHÂN TIN HỌC
TP.HCM, 2005
SV
ne
t.vn
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG MÁY TÍNH – VIỄN THÔNG
ĐẶNG NGUYỄN KIM ANH – 0112424
ĐÀO ANH TUẤN – 0112451
NGHIÊN CỨU JAVA MOBILE
VÀ XÂY DỰNG ỨNG DỤNG
MINH HỌA
KHÓA LUẬN CỬ NHÂN TIN HỌC
GIÁO VIÊN HƯỚNG DẪN
Thầy NGUYỄN MINH TUẤN
NIÊN KHÓA 2001-2005
SV
ne
t.vn
Lời Cảm Ơn!
Sau hơn năm tháng tìm hiểu và thực hiện, luận văn “Nghiên cứu công nghệ
Java Mobile và xây dựng ứng dụng minh hoạ” đã cơ bản hoàn thành. Để đạt được
kết quả này, chúng tôi đã nỗ lực hết sức đồng thời cũng nhận được rất nhiều sự
quan tâm, giúp đỡ, ủng hộ của các thầy cô, bạn bè và gia đình.
Trước hết, chúng em xin gởi lời cảm ơn chân thành đến Bộ môn Mạng máy
tính và Viễn thông, Khoa Công nghệ Thông tin, trường Đại học Khoa học Tự nhiên
và các thầy cô đặc biệt là Thầy Nguyễn Minh Tuấn đã tận tình giúp đỡ, hướng dẫn
chúng em hoàn thành luận văn này.
Chúng tôi rất cảm ơn các bạn bè trong khoa, các anh chị, các bạn trong cộng
đồng Java Việt Nam đã bên cạnh ủng hộ, đóng góp ý kiến cho chúng tôi trong quá
trình thực hiện luận văn.
Và chúng con cũng xin chân thành cảm ơn gia đình đã luôn động viên, tạo
điều kiện tốt nhất cho chúng con học tập và hoàn tất luận văn.
Luận văn đã hoàn thành với một số kết quả nhất định, tuy nhiên vẫn không
tránh khỏi sai sót. Kính mong sự cảm thông và đóng góp ý kiến từ các thầy cô và
các bạn.
Thành phố Hồ Chí Minh, tháng 7 năm 2005
Đặng Nguyễn Kim Anh - Đào Anh Tuấn
SV
ne
t.vn
MỤC LỤC
Lời Nói Đầu...................................................................................................... 1
Phần 1: Kiến thức nền tảng J2ME ................................................................ 5
Chương 1: Tổng quan về J2ME.................................................................... 5
1.1 Giới thiệu J2ME (Java 2 Micro Edition).......................................................5
1.2 Lý do chúng ta cần J2ME..............................................................................6
1.3 Các thành phần của J2ME:............................................................................7
1.3.1 Configuration:.............................................................................................7
1.3.2 Profile: ........................................................................................................9
1.3.3 Máy ảo Java..............................................................................................10
Chương 2: Giới thiệu CLDC và MIDP ...................................................... 13
2.1. CLDC ..........................................................................................................13
2.1.1. Yêu cầu phần cứng: ..................................................................................13
2.1.2. Yêu cầu phần mềm: ..................................................................................13
2.1.3. Máy ảo Java:.............................................................................................13
2.2. MIDP:..........................................................................................................16
2.2.1. Yêu cầu phần cứng: ..................................................................................16
2.2.2. Yêu cầu phần mềm: ..................................................................................16
2.2.3. Cấu trúc MID Profile:...............................................................................16
2.2.4. MIDlet Suite: ............................................................................................18
2.2.5. Môi trường phát triển ứng dụng J2ME.....................................................22
Chương 3: Các vấn đề cơ bản của chương trình MIDlet ......................... 25
3.1. Cấu trúc cơ bản: ..........................................................................................25
3.2. Xây dựng một ứng dụng MIDlet:................................................................25
3.3. Lớp MIDlet: ................................................................................................26
3.4. Lớp MIDletStateChangeException: ............................................................28
3.5. Display.........................................................................................................28
3.6. Lớp Displayable: .........................................................................................30
3.7. Quản lý các sự kiện (event).........................................................................32
3.7.1. Command & CommandListener...............................................................33
3.7.2. Item và ItemStateListener.........................................................................38
Chương 4: Giao diện đồ họa cấp cao.......................................................... 40
4.1. Screen: .........................................................................................................42
4.2. Form: ...........................................................................................................43
4.3. Item:.............................................................................................................45
4.3.1. DateField: .................................................................................................46
4.3.2. Gauge:.......................................................................................................48
4.3.3. String Item:...............................................................................................51
4.3.4. TextField: .................................................................................................53
4.3.5. ChoiceGroup: ...........................................................................................57
4.3.6. Image và ImageItem: ................................................................................61
4.4. List:..............................................................................................................64
SV
ne
t.vn
4.5. TextBox:......................................................................................................69
4.6. Alert và AlertType: .....................................................................................72
4.6.1. Alert: .........................................................................................................72
4.6.2. AlertType:.................................................................................................74
4.7. Ticker: .........................................................................................................77
Chương 5: Giao diện đồ họa cấp thấp........................................................ 78
5.1. Canvas: ........................................................................................................78
5.1.1. Hệ toạ độ:..................................................................................................79
5.1.2. Vẽ trên đối tượng Canvas:........................................................................79
5.1.3. Bắt sự kiện trong các đối tượng Canvas:..................................................82
5.1.4. Game action:.............................................................................................85
5.1.5. Sự kiện con trỏ:.........................................................................................87
5.2. Graphics: .....................................................................................................89
5.2.1. Màu sắc:....................................................................................................90
5.2.2. Nét vẽ:.......................................................................................................93
5.2.3. Font chữ:...................................................................................................98
5.2.4. Vẽ các đối tượng hình ảnh (image): .......................................................101
5.2.5. Các phương thức tịnh tiến đối tượng:.....................................................103
5.2.6. Vùng xén (Clipping regions):.................................................................105
Chương 6: Lưu trữ thông tin với RMS.................................................... 106
6.1. Giới thiệu RMS .........................................................................................106
6.2. Duyệt danh sách Record với RecordEnumeration ....................................115
6.3. Sắp xếp bằng RecordComparator..............................................................117
6.4. Lọc record với RecordFilter ......................................................................119
6.5. Nhận thông điệp khi Record Store thay đổi ..............................................121
6.6. Xử lý lỗi khi thao tác với Record Store.....................................................122
Chương 7: Kết nối mạng với Generic Connection Framework (GCF) 124
7.1. Giới thiệu GFC..........................................................................................124
7.2. Lược đồ lớp ...............................................................................................124
7.3. Kết nối HTTP:...........................................................................................127
7.3.1. Khởi tạo kết nối: .....................................................................................127
7.3.2. Các đặc điểm của kết nối HTTP bằng J2ME: ........................................130
7.3.3. Thông số kết nối: ....................................................................................137
7.4. Kết nối socket Datagram (UDP) ...............................................................138
7.5. Kết nối TCP socket ...................................................................................141
7.6. Gửi và nhận SMS ......................................................................................144
Phần 2 : Web Service và Ứng dụng "Đăng Ký Học Phần" .................... 149
Chương 8: Giới thiệu Web Service........................................................... 149
8.1. Ứng dụng phân tán (Distributed Application) ..........................................149
8.1.1. Giới thiệu................................................................................................149
8.1.2. Các vấn đề nảy sinh trong hệ thống ứng dụng phân tán.........................150
8.1.3. Hạn chế của những mô hình ứng dụng phân tán trước đây....................151
8.2. Web Service ..............................................................................................152
SV
ne
t.vn
8.2.1. Định nghĩa ..............................................................................................152
8.2.2. Thành phần cơ bản của Web service:.....................................................152
8.2.3. Hoạt động của Web service....................................................................152
8.2.4. Ưu điểm của web service .......................................................................155
8.3. Các thành phần chính của Web Service ....................................................157
8.3.1. SOAP (Simple Object Access Protocol) ................................................157
8.3.2. WSDL (Web Service Definition Language) ..........................................162
Chương 9: Ứng dụng đăng ký học phần.................................................. 172
9.1 Đặc tả chương trình:..................................................................................172
9.1.1 Tổng quan:..............................................................................................172
9.1.2 Các chức năng chính: .............................................................................172
9.2 Kiến trúc chương trình: .............................................................................174
9.2.1 Mô hình kết nối: .....................................................................................174
9.2.2 Mô hình bảo mật (mã hoá password): ....................................................176
9.3 Phân tích - thiết kế:....................................................................................177
9.3.1 Mô hình use case: ...................................................................................177
9.3.2 Đặc tả một số use case chính:.................................................................178
9.4 Thiết kế mô hình dữ liệu: ..........................................................................183
9.4.1 Mô hình thực thể kết hợp: ......................................................................183
9.4.2 Các bảng dữ liệu:....................................................................................183
9.4.3 Chi tiết các bảng dữ liệu:........................................................................184
9.4.4 Ràng buộc dữ liệu:..................................................................................188
9.4.5 Mô hình dữ liệu: .....................................................................................190
9.4.6 Các chức năng store procedures: ............................................................190
9.4.7 Thiết kế lớp:............................................................................................191
9.5 Cài đặt - thử nghiệm:.................................................................................192
9.5.1 Yêu cầu phần cứng: ................................................................................192
9.5.2 Yêu cầu phần mềm: ................................................................................193
9.5.3 Giao diện chương trình:..........................................................................193
Chương 10: Tổng kết ............................................................................... 205
10.1 Kết luận: ....................................................................................................205
10.2 Hướng phát triển: ......................................................................................207
Tài liệu tham khảo ...................................................................................... 210
Phụ Lục A: Hướng dẫn sử dụng công cụ Sun Wireless ToolKit 2.3 ...... 211
Phụ Lục B: Xây dựng và Sử dụng Web Service....................................... 217
Phụ Lục C: Giới thiệu các thư viện JSR ................................................... 222
SV
ne
t.vn
Danh Sách Các Hình
Hình 1.1 Các thiết bị J2ME hỗ trợ ..............................................................................6
Hình 1.2 Các thành phần của J2ME............................................................................7
Hình 1.3 Configurations và các thiết bị ......................................................................9
Hình 1.4 Cấu trúc chương trình J2ME......................................................................11
Hình 1.5 Cấu trúc chương trình MIDP .....................................................................11
Hình 2.1 Cấu trúc thiết bị MID .................................................................................17
Hình 3.1 Command Exit ...........................................................................................34
Hình 3.2 Command Label .........................................................................................36
Hình 3.3 Ánh xạ soft-button......................................................................................36
Hình 4.1 Sơ đồ các lớp giao diện đồ hoạ ..................................................................40
Hình 4.2 Giao diện đối tượng DateField...................................................................46
Hình 4.3 Giao diện đối tượng Gauge chế độ tương tác ............................................48
Hình 4.4 Giao diện đối tượng Gauge chế độ không tương tác .................................49
Hình 4.5 Giao diện đối tượng StringItem .................................................................52
Hình 4.6 Giao diện đối tượng TextField ...................................................................56
Hình 4.7 Giao diện đối tượng ChoiceGroup chế độ một lựa chọn ...........................59
Hình 4.8 Giao diện đối tượng ChoiceGroup chế độ nhiều lựa chọn.........................60
Hình 4.9 Giao diện đối tượng List dạng menu..........................................................67
Hình 4.10 Giao diện đối tượng List cho phép chọn nhiều lựa chọn .........................68
Hình 4.11 Giao diện đối tượng TextBox...................................................................71
Hình 4.12 Giao diện đối tượng Alert ........................................................................76
Hình 4.13 Giao diện Ticker.......................................................................................77
Hình 5.1 Các phương thức vẽ đường cong ...............................................................94
Hình 5.2 Các phương thức vẽ hình chữ nhật ............................................................95
Hình 5.3 Các phương thức hỗ trợ vẽ Text ................................................................97
Hình 5.4 Các định dạng trong Text Graphic.............................................................97
Hình 5.5 Các phương thức tạo font.........................................................................100
Hình 5.6 Vẽ bằng đối tượng Immutable Image ......................................................101
Hình 5.7 Vẽ bằng đối tượng Mutable Image ..........................................................102
Hình 5.8 Các định dạng vị trí trong Graphics .........................................................103
Hình 7.1 Lược đồ các lớp trong thư viện GCF .......................................................125
Hình 7.2 Kết nối UDP.............................................................................................138
Hình 7.3 Kết Nối TCP.............................................................................................141
Hình 7.4 Lược đồ lớp thư viện WMA.....................................................................145
Hình 8.1 Hoạt động của Web Service.....................................................................152
Hình 8.2 Một client truy xuất đến nhiều web services cùng lúc.............................154
Hình 8.3 Một web service có thể triệu tập đến các web services khác...................155
Hình 8.4 Web Service Endpoint..............................................................................162
Hình 9.1 Kiến trúc chương trình ứng dụng.............................................................174
Hình 9.2 Mô hình mã hoá password .......................................................................176
SV
ne
t.vn
Hình 9.3 Lược đồ use case ......................................................................................177
Hình 9.4 Mô hình thực thể kết hợp ER...................................................................183
Hình 9.5 Ràng buộc chu trình .................................................................................189
Hình 9.6 Mô hình cơ sở dữ liệu ..............................................................................190
Hình 9.7 Mô hình Lớp.............................................................................................192
Hình 9.8 Sơ đồ các màn hình ..................................................................................194
Hình 9.9 Màn hình welcome...................................................................................195
Hình 9.10 Màn hình đăng nhập...............................................................................196
Hình 9.11 Confirm ..................................................................................................197
Hình 9.12 Menu chức năng.....................................................................................198
Hình 9.13 Màn hình đăng ký học phần lý thuyết....................................................199
Hình 9.14 Màn hình đăng ký học phần thực hành ..................................................200
Hình 9.15 Màn hình xem thời khoá biểu ................................................................201
Hình 9.16 Màn hình xem kết quả học tập ...............................................................202
Hình 9.17 Màn hình xem phiếu đăng ký.................................................................203
Hình 9.18 Màn hình xem thời khoá biểu ................................................................204
Hình 10.1 Hướng phát triển thực tế ........................................................................207
Hình A.1 Công cụ Sun WirelessToolkit 2.3 ...........................................................211
Hình A.2 Màn hình chính của công cụ ...................................................................212
Hình A.3 Tạo project mới .......................................................................................212
Hình A.4 Các options cho project ...........................................................................213
Hình A.5 Chỉnh sửa nội dung file Jad và Jar ..........................................................214
Hình A.6 Biên dich project .....................................................................................215
Hình A.7 Đóng gói ứng dụng..................................................................................216
Hình B.1 Tạo project Web Service .........................................................................217
Hình B.2 Khai báo lớp và hàm................................................................................218
Hình B.3 Export nhiều hàm cùng lúc......................................................................219
Hình B.4 Màn hình thực thi Web Service của IE ...................................................219
Hình B.5 File WSDL...............................................................................................220
Hình B.6 Công cụ Stub Generator ..........................................................................221
Hình B.7 Các options của công cụ Stub Generator.................................................221
SV
ne
t.vn
Danh Sách Các Bảng
Bảng 2.1 Cấu trúc file manifest.................................................................................19
Bảng 2.2 Cấu trúc file JAD.......................................................................................20
Bảng 3.1 Lớp MIDlet ................................................................................................27
Bảng 3.2 Lớp Display ...............................................................................................29
Bảng 3.3 Lớp Displayable.........................................................................................32
Bảng 3.4 Các Command Type ..................................................................................37
Bảng 3.5 Command và CommandListener ...............................................................38
Bảng 3.6 Item và ItemStateListener..........................................................................39
Bảng 4.1 Lớp Screen.................................................................................................42
Bảng 4.2 Lớp Form ...................................................................................................44
Bảng 4.3 Lớp Item ....................................................................................................45
Bảng 4.4 Lớp DateField ............................................................................................46
Bảng 4.5 Lớp Gauge .................................................................................................49
Bảng 4.6 Lớp StringItem...........................................................................................51
Bảng 4.7 Các Ràng Buộc của TextField ...................................................................53
Bảng 4.8 Lớp TextField ............................................................................................55
Bảng 4.9 Lớp ChoiceGroup ......................................................................................58
Bảng 4.10 Lớp Image................................................................................................62
Bảng 4.11 Định dạng ImageItem ..............................................................................62
Bảng 4.12 Lớp ImageItem ........................................................................................63
Bảng 4.13 So sánh List và ChoiceGroup ..................................................................65
Bảng 4.14 Lớp List....................................................................................................66
Bảng 4.15 So sánh TextField và TextBox ................................................................69
Bảng 4.16 Lớp TextBox............................................................................................70
Bảng 4.17 Lớp Alert..................................................................................................73
Bảng 4.18 AlertType.................................................................................................75
Bảng 4.19 Lớp Ticker ...............................................................................................77
Bảng 5.1 Truy vấn kích thước Canvas......................................................................79
Bảng 5.2 Lớp Canvas ................................................................................................81
Bảng 5.3 Giao tiếp với Application Manager ...........................................................81
Bảng 5.4 Mã Phím.....................................................................................................83
Bảng 5.5 Sự kiện keyPressed ....................................................................................84
Bảng 5.6 Sự kiện Game Action.................................................................................85
Bảng 5.7 Bắt sự kiện trong Game Action .................................................................86
Bảng 5.8 Sự kiện con trỏ ...........................................................................................87
Bảng 5.9 Lớp Graphics .............................................................................................90
Bảng 5.10 Các phương thức vẽ .................................................................................93
Bảng 5.11 Xử lý Text................................................................................................96
Bảng 5.12 Giá trị Anchor ..........................................................................................96
Bảng 5.13 Xử lý Font chữ .........................................................................................98
Bảng 5.14 Các giá trị Font ........................................................................................99
Bảng 5.15 Vẽ hình ảnh............................................................................................101
SV
ne
t.vn
Bảng 5.16 Giá trị Image Anchor .............................................................................103
Bảng 5.17 Các phương thức tịnh tiến .....................................................................103
Bảng 5.18 Vùng xén................................................................................................105
Bảng 6.1 Mô hình Record Store..............................................................................107
Bảng 6.2 Lớp RecordStore......................................................................................109
Bảng 6.3 Lớp RecordEnumeration .........................................................................117
Bảng 6.4 Các giá trị hằng để sắp xếp record...........................................................118
Bảng 6.5 Lớp RecordListener .................................................................................121
Bảng 7.1 Lớp Connector .........................................................................................128
Bảng 7.2 Mode Kết Nối ..........................................................................................128
Bảng 7.3 Các Request Method chính......................................................................130
Bảng 7.4 Các phương thức set/get Request Method...............................................131
Bảng 7.5 Các phương thức truy vấn HTTP Header................................................134
Bảng 7.6 Lấy thông số kết nối ................................................................................137
Bảng 7.7 Lớp DatagramConnection .......................................................................139
Bảng 7.8 Lớp Datagram..........................................................................................140
Bảng 7.9 Thuộc tính của SocketConnection...........................................................142
Bảng 7.10 Lớp SocketConnection ..........................................................................143
Bảng 7.11 Các interfaces chính của WMA.............................................................144
Bảng 9.1 Danh sách các Use Case ..........................................................................178
Bảng 9.2 Table ChuyenNganh ................................................................................184
Bảng 9.3 Table SV ..................................................................................................184
Bảng 9.4 Table MonHoc.........................................................................................185
Bảng 9.5 Table GV .................................................................................................185
Bảng 9.6 Table Lop.................................................................................................185
Bảng 9.7 Table Lop_MonLT ..................................................................................186
Bảng 9.8 Table Lop_MonTH..................................................................................187
Bảng 9.9 Table PhanCongTH .................................................................................187
Bảng 9.10 Table DangKyLT...................................................................................187
Bảng 9.11 Table DangKyTH ..................................................................................187
Bảng 9.12 Table ThongBao ....................................................................................188
SV
ne
t.vn
Các chữ viết tắt, thuật ngữ được sử dụng
API Application Program Interface
CDC Connected Device Configuration
CLDC Connected Limited Device Configuration
Configuration
Đặc tả qui định các thư viện gốc J2ME phải hỗ trợ cho một dòng
phần cứng.
DES Thuật toán mã hóa khóa bí mật 64 bits
GCF General Connection Framework
IIS Internet Information Services-Web server chuẩn trên Windows
J2EE Java 2 Enterpise Edition, phiên bản Java cho những dự án lớn.
J2ME Java 2 Micro Edition, phiên bản Java cho những thiết bị nhỏ.
J2SE
Java 2 Standard Edition, phiên bản Java ra đời đầu tiên, dành cho
PC thông thường.
JCP Tổ chức Java Community Process
JDK Java Development Kits
JSR
Java Specification Requests, những yêu cầu cần bổ sung cho các
phiên bản Java.
JSR-172 Thư viện truy xuất web service cho ngôn ngữ J2ME.
JSR-177 Thư viện mã hóa và bảo mật cho ngôn ngữ J2ME.
KVM Máy ảo Java cho môi trường CLDC.
MIDlet Tên gọi chung cho các ứng dụng J2ME.
MIDP Mobile Information Device Profile.
MMS
Multimedia Message Service, tin nhắn hình ảnh, âm thanh, video
cho di động.
PDA Personal Digital Assistant.
Profile Các tập thư viện cấp cao định nghĩa trên nền Configuration.
RMS RecordStore Management System, cơ chế lưu trữ của J2ME.
SV
ne
t.vn
SMS
Short Message Service, tin nhắn thông thường cho điện thoại di
động.
SOAP
Simple Object Access Protocol, định dạng thông điệp của Web
Service.
Symbian Hệ điều hành cho điện thoại di động của hãng Symbian.
UDDI Universal Description, Discovery, and Integration
Web Service Giao thức gọi hàm từ xa dựa trên XML và HTTP.
WMA Wireless Message API
WSDL Web Service Definition Language
XML Extensible Markup Language
SV
ne
t.vn
Java Mobile
Lời Nói Đầu
Mạng điện thoại di động xuất hiện tại Việt Nam từ đầu những năm 1990 và
theo thời gian, số lượng các thuê bao cũng như các nhà cung cấp dịch vụ di động tại
Việt Nam ngày càng tăng. Cùng với sự phát triển của số lượng thuê bao di động là
sự đa dạng hoá các dịch vụ hướng đến thiết bị di động. Ngày nay điện thoại di động
không chỉ còn mang chức năng gọi điện hay nhắn tin thông thường mà còn là một
thiết bị giải trí, tra cứu thông tin rất tiện lợi. Do đó, xây dựng các ứng dụng cho điện
thoại di động đang là một yêu cầu tất yếu trong xu thế hiện nay. Ngành công nghiệp
phần mềm cho các thiết bị di động được xem như một mảnh đất màu mỡ và hứa hẹn
đem lại nhiều tỉ đô la doanh thu.
Hai hướng phát triển ứng dụng trên điện thoại di động phổ biến hiện nay là
sử dụng ngôn ngữ C++ trên nền hệ điều hành Symbian và J2ME. Các ứng dụng viết
trên nền Symbian có các ưu thế truy cập trực tiếp các tài nguyên của điện thoại cũng
như hỗ trợ hệ thống tập tin, thư mục… như máy tính cá nhân vì được hỗ trợ trực
tiếp bởi hệ điều hành. Tuy nhiên hệ điều hành Symbian lại có kích thước khá lớn
nên chỉ có ở các thế hệ điện thoại tương đối cao cấp, và xây dựng ứng dụng dùng
Symbian API cũng phức tạp hơn.
Đối trọng với Symbian API là công nghệ J2ME với kích thước nhỏ gọn,
tiện dụng, được hỗ trợ bởi hầu hết các thế hệ điện thoại mới ra đời, kể cả các điện
thoại có hệ điều hành Symbian. J2ME không những là một ngôn ngữ hướng đến các
thiết bị di động mà còn là ngôn ngữ chính để lập trình trên các thiết bị gia dụng, thẻ
tín dụng điện tử và các thiết bị thông minh khác. Chúng ta có thể nói đối tượng của
ngôn ngữ J2ME là rộng hơn rất nhiều so với C++ trên nền Symbian. Tại thời điểm
hiện tại, ngôn ngữ J2ME không hỗ trợ được nhiều tính năng như C++ trên Symbian
nhưng lại có những ưu điểm trội hơn.
J2ME là một ngôn ngữ nhỏ, gọn nhưng rất chặt chẽ và dễ nắm bắt, với
những lập trình viên đã có kinh nghiệm với Java việc lập trình với J2ME trở nên rất
1
SV
ne
t.vn
Java Mobile
dễ dàng. J2ME còn là một ngôn ngữ được các tổ chức mã nguồn mở ủng hộ mạnh
mẽ và phát triển rất nhanh chóng, JCP (Java Community Process-
là một chương trình do Sun thành lập luôn tiếp thu các ý kiến
và đưa ra các đặc tả mới dành cho Java nói chung và J2ME nói riêng. Các đặc tả
này thường có tiếp đầu ngữ JSR và là các tính năng bổ sung mới cho J2ME.
Những JSR quan trọng có thể được nhắc đến như JSR-82 (Bluetooth), JSR
205 (Gửi tin nhắn SMS, MMS), JSR-172 (Web service), JSR-177 (Security and
Trust Services), JSR 184 (3D Game)… Các đặc tả này ngày càng phong phú và
phần nào phát triển nhanh hơn cả sự phát triển của phần cứng.
Thật khó so sánh giữa các dòng ngôn ngữ lập trình với nhau vì mỗi loại đều
có ưu và khuyết điểm riêng. Trong luận văn của mình, chúng tôi chọn nghiên cứu
về J2ME vì những ưu điểm khá rõ ràng đã nêu trên, mặt khác chúng tôi cũng muốn
thử sức ở một lãnh vực khá mới mẻ là tiếp cận với phần mềm mã nguồn mở.
Về chương trình ứng dụng, tính khả thi và thực tế ngày càng được đề cao.
Chúng tôi nhận thấy xu hướng mở rộng các ứng dụng trên web sang điện thoại di
động đang được chú trọng. Thương mại điện tử (e-commerce) đang tiến dần sang
thương mại di động (m-commerce). Với thực trạng Việt Nam hiện nay, số người sở
hữu máy vi tính cá nhân, đặc biệt là máy tính xách tay chưa nhiều nhưng tỉ lệ số
người có điện thoại di động lại khá cao. Việc chuyển các ứng dụng thương mại từ
môi trường web sang môi trường di động sẽ khiến sự tiện dụng tăng cao, số người
sử dụng dịch vụ trực tuyến chắc chắn sẽ tăng nhanh vì đối với nhiều người chiếc
điện thoại di động dễ sử dụng hơn rất nhiều so với chiếc máy tính "phức tạp và khó
hiểu".
Ứng dụng chúng tôi chọn thực hiện để bước chân vào lãnh vực khá mới mẻ
này là ứng dụng "Đăng Ký Học Phần" qua mạng di động. Đối với sinh viên khoa
công nghệ thông tin, hệ thống đăng ký học phần SMS qua môi trường web là một
ứng dụng rất quen thuộc. Chúng tôi muốn phát triển ứng dụng của mình như một
mở rộng của hệ thống đăng ký học phần này trên điện thoại di động nhằm hỗ trợ các
bạn sinh viên có thể sử dụng các tiện ích của hệ thống mà không cần phải có máy
2
SV
ne
t.vn
Java Mobile
tính kết nối mạng. Với ứng dụng này, tính tiện dụng của hệ thống đăng ký học phần
SMS đã được mở rộng. Chỉ cần có một điện thoại di động hỗ trợ GPRS các bạn sinh
viên có thể đăng ký học phần ngay cả khi đang về quê ăn tết ở những vùng internet
chưa phổ biến nhưng đã phủ sóng di động hay khi đang di chuyển trên tàu xe… Vì
một số điều kiện đặc biệt của điện thoại, hiện nay ứng dụng này chỉ chạy trên
chương trình giả lập. Tuy nhiên, chúng tôi hi vọng trong một tương lai rất gần, khi
các thế hệ điện thoại mới có giá thành vừa phải ra đời và hỗ trợ một số công nghệ
như WebService, mã hoá… mà chúng tôi đang sử dụng để xây dựng phần mềm thì
ứng dụng này có thể được áp dụng rộng rãi trong thực tế cho sinh viên của khoa.
Cần phải nói thêm, ứng dụng hiện tại hoàn toàn có thể sử dụng được trong thực tế
Việt Nam nhưng có một số đòi hỏi về thiết bị khá đắt tiền (xin xem thêm Chương
10, phần Kết Luận), chứ không chỉ mới là lý thuyết trên giấy tờ.
Với việc xây dựng thành công hệ thống đăng ký học phần qua mạng điện
thoại di động, chúng tôi rất tự tin về việc xây dựng các hệ thống thương mại di động
lớn hơn. Trong tương lai gần, khách hàng có thể ngồi trên taxi mua vé máy bay, đặt
chỗ khách sạn, xem lại tài khoản ngân hàng… với chiếc điện thoại di động nhỏ bé.
Chiếc điện thoại di động sẽ trở thành một công cụ giao dịch không thể thiếu trong
thời đại mới, thời đại của thương mại điện tử toàn cầu.
Luận văn được trình bày thành hai phần lớp:
Phần 1: Giới thiệu về lý thuyết nền tảng của J2ME, các thư viện, các kỹ thuật lập
trình, đóng gói ứng dụng di động.
Chương 1. Tổng quan về J2ME : Giới thiệu tổng quan về J2ME, các đặc điểm và
các thành phần con.
Chương 2. Giới thiệu CLDC và MIDP: Trình bày chi tiết về hai thành phần quan
trọng của J2ME dành cho điện thoại di động, môi trường phát triển ứng dụng J2ME.
Chương 3. Các vấn đề cơ bản của chương trình MIDlet: Chương này sẽ trình bày
những đặc điểm quan trọng nhất của một ứng dụng J2ME, các bước cơ bản để xây
dựng ứng dụng này.
3
SV
ne
t.vn
Java Mobile
Chương 4. Giao diện đồ họa cấp cao: Trình bày về thư viện đồ họa cấp cao như
Form, List, TextBox… trong J2ME.
Chương 5. Giao diện đồ họa cấp thấp: Trình bày về lập trình đồ họa cấp thấp, các
phương thức vẽ, xử lý font, game action … trong J2ME.
Chương 6. Lưu trữ thông tin với RMS: Trình bày về Record Management System,
một cơ chế lưu trữ riêng của J2ME.
Chương 7. Lập trình mạng vơi GCF: Trình bày về khả năng lập trình mạng trong
J2ME.
Phần 2: Giới thiệu về Web Service, một công nghệ rất mới để xây dựng các ứng
dụng thương mại điện tử phân tán và giới thiệu chi tiết về ứng dụng cùng những
đánh giá, tổng kết.
Chương 8. Giới thiệu về ứng dụng phân tán và web service
Chương 9. Trình bày chi tiết về ứng dụng "Đăng Ký Học Phần"
Chương 10. Đánh giá, tổng kết các kết quả đạt được và hướng phát triển trong
tương lai.
Tuy đã đầu tư khá nhiều thì giờ và công sức vào luận văn này nhưng chắc
chắn chúng tôi cũng không tránh khỏi những sai sót. Rất mong nhận được ý kiến
đóng góp và sự thông cảm của quý thầy cô và các bạn! Xin chân thành cảm ơn!
Kim Anh – Anh Tuấn
4
SV
ne
t.vn
Java Mobile
Phần 1: Kiến thức nền tảng J2ME
Chương 1: Tổng quan về J2ME
1.1 Giới thiệu J2ME (Java 2 Micro Edition)
J2ME là một nhánh của ngôn ngữ lập trình JAVA được phát triển nhằm hướng
tới việc lập trình cho các thiết bị “nhỏ” (micro) có bộ nhớ, khả năng hiển thị và xử
lý hạn chế.
Ban đầu Java được xây dựng chỉ gồm một phiên bản duy nhất, ngày nay được
biết đến với tên J2SE (Java 2 Standard Edition), với phương châm là “viết một lần,
chạy trên mọi môi trường” (“Write once, run anywhere”). Java được hình thành trên
ý tưởng xây dựng một ngôn ngữ mà lập trình viên chỉ cần viết một lần duy nhất
nhưng ứng dụng có thể chạy trên bất cứ môi trường nào có hỗ trợ máy ảo Java (Java
Virtual Machine). Để làm được việc này, Java sử dụng một phương thức biên dịch
mã nguồn tương đối khác so với các ngôn ngữ lập trình truyền thống. Bộ biên dịch
Java không biên dịch mã nguồn trực tiếp sang mã máy mà biên dịch sang một dạng
mã trung gian mà máy ảo Java hiểu được (mã bytecode). Khi có nhu cầu sử dụng
ứng dụng, máy ảo Java sẽ đọc mã trung gian này và dịch ra mã máy và thực thi; nhờ
vào quá trình trung gian đó một ứng dụng Java có thể chạy trên bất kỳ môi trường
nào có cài đặt máy ảo Java tương thích.
Được giới thiệu lần đầu vào năm 1995, ngày nay mục tiêu Java nhắm đến cũng
đã thay đổi khá nhiều. Java hiện nay không chỉ nhắm đến họ máy tính để bàn đơn
thuần; hai năm sau ngày đầu được ra mắt, một phiên bản Java mới là J2EE (Java 2
Enterprise Edition) đã được giới thiệu nhắm tới việc phát triển các ứng dụng có qui
mô lớn hơn.
Phiên bản mới nhất được thêm vào dòng ngôn ngữ Java là J2ME (Java 2 Micro
Edition). J2ME nhắm đến việc phát triển ứng dụng cho các ứng dụng có năng lực
hạn chế như đầu giải mã kỹ thuật số TV set-top boxes, điện thoại di động …
5
SV
ne
t.vn
Java Mobile
1.2 Lý do chúng ta cần J2ME
Ngày nay ngành công nghiệp sản xuất thiết bị di động trên thế giới đang phát
triển nhanh chóng. Các thiết bị di động ngày càng hiện đại hơn, “thông minh” hơn
và ngày càng có nhiều tính năng nổi bật. Đơn cử như chiếc điện thoại di động, ngày
nay chúng không chỉ đơn thuần đảm nhận chức năng hội thoại mà còn có thêm
nhiều chức năng như chụp ảnh, nghe nhạc, xem phim … như một “trung tâm giải
trí”. Các thiết bị gia dụng khác như lò vi ba, TV… cũng ngày càng được trang bị
những tính năng hiện đại hơn. Nhu cầu phát triển phần mềm cho các thiết bị di
động, gia dụng ngày càng tăng cao và được đánh giá là một ngành công nghệ có thể
đem lại nhiều tỉ đô la doanh thu. Một thực tế đặt ra cho các nhà phát triển phần
mềm trên các thiết bị này là hiện nay không có một chuẩn hóa nào dành cho các nhà
sản xuất phần cứng. Các thiết bị trên thị trường hiện nay rất đa dạng và mang nhiều
đặc điểm cũng như cấu hình khác nhau. Trước thực tế đó, việc có thể chạy trên
nhiều môi trường là một lợi thế rất lớn của ngôn ngữ Java. Các nhà phát triển Java
đã cho ra đời ngôn ngữ J2ME hướng đến việc phát triển phần mềm cho các thiết bị
di động. Ngôn ngữ J2ME thực sự là một ngôn ngữ nhỏ gọn, dễ nắm bắt, chặt chẽ và
thích hợp cho các thiết bị có khả năng hạn chế. Các thiết bị di động trên thị trường
hiện nay, đặc biệt là điện thoại di động hầu hết đều hỗ trợ rất tốt ngôn ngữ J2ME và
J2ME thực sự đã trở thành một trong những ngôn ngữ phổ biến nhất trong lãnh vực
lập trình di động.
Hình 1.1 Các thiết bị J2ME hỗ trợ
6
SV
ne
t.vn
Java Mobile
1.3 Các thành phần của J2ME:
Hình 1.2 Các thành phần của J2ME
Khái niệm thiết bị di động là tương đối rộng lớn. Chúng bao hàm những thiết bị
có kích thước vật lý khác nhau nhiều lần và cho dù cùng kích thước những thiết bị
này vẫn có khả năng xử lý cũng như hiển thị khác nhau ( những chiếc điện thoại
hiển thị 12,000 pixels cho đến những chiếc PDA 20,000 pixels). Để đáp ứng được
nhu cầu khác nhau của những thiết bị này, bản thân ngôn ngữ J2ME cũng được chia
thành những thành phần nhỏ hơn.
Chúng ta sẽ tìm hiểu hai khái niệm mới là Configurations và Profiles.
1.3.1 Configuration:
Để đáp ứng nhu cầu cho nhiều chủng loại thiết bị khác nhau, Sun đã đưa ra khái
niệm Configuration. Khái niệm Configuration có mối liên hệ chặt chẽ với máy ảo
Java. Nói chính xác hơn, một Configuration qui định những thành phần và những
thư viện gốc của ngôn ngữ Java mà máy ảo phải hỗ trợ cho configuration đó.
Việc phân chia thành những Configurations khác nhau chủ yếu dựa vào khả
năng bộ nhớ, năng lực hiển thị, năng lực xử lý và khả năng kết nối mạng của các
thiết bị. Như chúng ta đã biết, các thiết bị di động rất khác nhau về nguồn tài
nguyên, về khả năng phần cứng. Với những thiết bị có năng lực hạn chế, nếu ta đưa
7
SV
ne
t.vn
Java Mobile
quá nhiều thư viện hỗ trợ vào máy ảo trên thiết bị đó sẽ gây chậm hệ thống và dư
thừa không cần thiết. Với những thiết bị có khả năng cao hơn, chúng ta sẽ đưa thêm
nhiều thư viện hỗ trợ vào máy ảo giúp ích cho công việc lập trình của các nhà phát
triển. Do đó, nhu cầu phân chia thành nhiều Configurations là việc cần thiết.
Hiện nay Sun đã đưa ra hai loại Configurations khác nhau:
CDC (Connected Device Configuration):
• 512 kb (minimum) bộ nhớ để chạy Java
• 256 kb (minimum) bộ nhớ cấp phát động.
• Kết nối mạng liên tục, băng thông rộng.
CLDC(Connected Limited Device Configuration):
• 128 kb (minimum) bộ nhớ để chạy Java
• 32 kb (minimum) bộ nhớ cấp phát động.
• Giao diện người dùng hạn chế
• Năng lượng tiêu tốn ít (chủ yếu dùng pin)
• Kết nối mạng Wireless, chậm.
Việc phân chia này thực chất cũng chỉ mang tính tương đối. Công nghệ hiện nay
đang phát triển khá nhanh, và việc phát triển này càng làm cho ranh giới giữa các
loại Configuration này trở nên không rõ ràng.
8
SV
ne
t.vn
Java Mobile
Hình 1.3 Configurations và các thiết bị
1.3.2 Profile:
Configuration thực ra chỉ cung cấp một số rất ít các lớp và người phát triển ứng
dụng hầu như không thể chỉ làm việc đơn thuần với các configuration này. Ta có thể
thấy điều này qua một ví dụ: các configuration không hỗ trợ các công cụ về giao
diện (GUI), do đó nếu chỉ dùng configuration thì lập trình viên phải xây dựng tất cả
các chức năng giao diện từ đầu. Vì lý do này Sun đã linh hoạt và đưa thêm một khái
niệm mới nằm ở tầng trên của configuration, đó là Profiles.
Ta có thể xem Profile là một mở rộng của khái niệm Configuration. Profile định
nghĩa các thư viện giúp lập trình viên phát triển phát triển ứng dụng cho một dạng
thiết bị nào đó. Ví dụ Mobile Information Device Profile (MIDP) định nghĩa các
hàm API cho các thành phần giao diện, nhập liệu và xử lý sự kiện, lưu trữ, kết nối
mạng và xử lý thời gian,… phù hợp với màn hình hiển thị và khả năng xử lý của các
thiết bị di động. Profile MIDP được định nghĩa trên nền tảng của CLDC. Ngoài ra
chúng ta còn một số Profile tiêu biểu khác như
– 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
9
SV
ne
t.vn
Java Mobile
– 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ư viện của bộ Core Java2 1.3
– Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile, Game
Profile.
Luận văn chủ yếu chỉ đề cập đến Profile MIDP và các thư viện liên quan để
phục vụ cho việc viết ứng dụng trên điện thoại di động.
1.3.3 Máy ảo Java
Như chúng ta đã biết, một chương trình Java sẽ được biên dịch thành mã trung
gian sau đó chính máy ảo Java sẽ biên dịch phần mã này sang mã máy để thực thi.
Máy ảo Java sẽ chịu trách nhiệm việc cung cấp tính năng bảo mật, cấp phát và thu
hồi bộ nhớ và quản lý việc điều phối các tiến trình. Chúng ta có thể nói chính máy
ảo Java làm cho chương trình của chúng ta “chạy”.
Với CDC, máy ảo Java có cùng các đặc tính như J2SE. Tuy nhiên, với CLDC,
Sun đã phát triển riêng một dạng máy ảo chuyên biệt được gọi là K Virtual
Machine, gọi tắt là KVM. Chính những hạn chế về tài nguyên của các thiết bị di
động đã đề ra nhu cầu về sự ra đời của KVM. KVM không phải là một máy ảo Java
“truyền thống”:
• Máy ảo chỉ cần 40-80 kb bộ nhớ
• Chỉ đòi hỏi 20-40 kb bộ nhớ động (heap)
• Có thể chạy với bộ vi xử lý 16-bit và xung nhịp 25 MHz.
Đến đây chúng ta có thể hình dung phần nào cấu trúc tổng thể của một chương
trình J2ME như sau:
10
SV
ne
t.vn
Java Mobile
Hình 1.4 Cấu trúc chương trình J2ME
Nếu chương trình được biên dịch với CDC, chương trình sẽ chạy trên các máy
ảo “truyền thống” và mang các đặc tính như chương trình J2SE.
Nếu chương trình được biên dịch với CLDC, chương trình sẽ chạy với máy ảo
chuyên biệt KVM và những đặc tính riêng do CLDC đòi hỏi.
Với chương trình xây dựng bởi MIDP, chúng ta có cấu trúc chuyên biệt sau:
Hình 1.5 Cấu trúc chương trình MIDP
Tầng dưới cùng là hệ điều hành có hỗ trợ máy ảo Java (KVM), bên trên là
CLDC và trên cùng là MID Profile. Lúc này khái niệm “Viết một lần, chạy bất cứ
11
SV
ne
t.vn
Java Mobile
môi trường nào” của Sun không còn đúng hoàn toàn vì đã xuất hiện máy ảo chuyên
biệt KVM. Một số chương trình viết bằng MIDP sẽ không chạy trên môi trường
J2SE và ngược lại. Tuy nhiên chúng ta phải cảm kích các nỗ lực của Sun đã giúp
cho Java trở thành một trong những ngôn ngữ có khả năng độc lập với môi trường
bên dưới nhất hiện nay, điều này đúng với cả môi trường thiết bị di động.
Ở những phần tiếp theo chúng ta sẽ tìm hiểu kỹ hơn về hai thành phần cơ bản
của J2ME là Configuration và Profile.
12
SV
ne
t.vn
Java Mobile
Chương 2: Giới thiệu CLDC và MIDP
2.1. CLDC
2.1.1. Yêu cầu phần cứng:
Khi đề ra yêu cầu về phần cứng việc xem xét các chi tiết như bộ xử lý, bộ nhớ…
và các phần mềm hiện có trên các thiết bị di động là việc vô cùng quan trọng. Nhằm
mục đích phục vụ tối đa các thiết bị hiện có trên thị trường, CLDC chỉ đề ra các yêu
cầu về bộ nhớ và không đề ra yêu cầu nào cho các thành phần khác. Yêu cầu tối
thiểu để có thể sử dụng CLDC như sau:
• 128 kilobytes để chạy JVM và các thư viện của CLDC. Không phân biệt loại
bộ nhớ sử dụng (Rom, Flash,…), bộ nhớ của thiết bị phải bảo lưu được nội
dung lâu dài, ngay cả khi ngắt điện. Bộ nhớ này thường được gọi là
nonvolatile memory.
• 32 kilobytes bộ nhớ trống để cấp phát các đối tượng (objects). Bộ nhớ này
thường được gọi là volatile memory (hay là “heap”).
2.1.2. Yêu cầu phần mềm:
CLDC có yêu cầu tối thiểu về mặt phần mềm. Hệ điều hành phải tương thích với
JVM và có chức năng quản lý các ứng dụng Java, bao gồm:
• Cho phép chọn và kích hoạt ứng dụng
• Cho phép gỡ bỏ ứng dụng khỏi thiết bị
2.1.3. Máy ảo Java:
Do các thiết bị di động dùng CLDC thường có tài nguyên hạn chế nên Sun đã đề
ra máy ảo Java KVM phục vụ riêng cho các thiết bị này. Máy ảo KVM thực chất là
một bộ phận con của các máy ảo trên môi trường J2SE và J2EE nên cũng có nhiều
hạn chế và khác biệt so với hai phiên bản trên.
13
SV
ne
t.vn
Java Mobile
Một số hạn chế:
• Không hỗ trợ kiểu dữ liệu float: Việc sử lý số float đòi hỏi nhiều tài
nguyên xử lý, ngoài ra các thiết bị di động không có những cấu hình phần
cứng dành riêng cho việc xứ lý số float nên trong J2ME chúng ta không
thể khai báo các biến, mảng float, các hàm cũng không nhận tham số và
trả về các số float.
• Phương thức finalize: Trong J2SE, chúng ta có thể khai báo phương thức
finalize (tương tự như phương thức destructor). Garbage Collector sẽ gọi
phương thức này trước khi hủy bỏ một đối tượng, phương thức này
thường được dùng để thu hồi các tài nguyên hệ thống như sockets, file
handles… trước khi đối tượng bị “phá hủy”. Tuy nhiên trong J2ME chúng
ta không có phương thức finalize.
• Error Handling: Trong J2ME chúng ta vẫn được hỗ trợ các công cụ về bẫy
lỗi (chủ yếu thông qua try và catch). Tuy nhiên khả năng về xử lý lỗi của
J2ME cũng hạn chế hơn với hai phiên bản còn lại.
• Không hỗ trợ việc sử dụng code của các ngôn ngữ lập trình khác
• Không hỗ trợ Reflection: Trong J2SE và J2EE, chúng ta có thể dùng các
lớp Reflection để tìm hiểu thông số môi trường máy ảo Java đang thực thi.
• Không hỗ trợ ThreadGroup: mỗi thread được quản lý riêng biệt, không
còn lớp ThreadGroup. Nếu muốn điểu khiển một lúc nhiều threads chúng
ta có thể dùng mảng hoặc Vector.
J2ME cũng còn một số điểm khác biệt so với J2SE và J2EE, một trong những
khác biệt chính là quá trình Class Verify (tạm dịch là “kiểm tra lớp”). Các lớp trước
khi được load sẽ thông qua một quá trình “kiểm tra” về sự hợp lệ và tính nguyên
vẹn. Đây là một cơ chế quan trọng để bảo đảm an toàn (security) của Java. Quá
trình này trong J2SE và J2EE có thể chiếm đến 50 kbytes bộ nhớ, trong J2ME
chúng được chia thành 2 giai đoạn:
14
SV
ne
t.vn
Java Mobile
• Tiền kiểm tra (Pre-verification): Trước khi một lớp được nạp vào thiết bị,
một phần mềm sẽ được sử dụng để thêm vào một số thông số bổ sung vào
file class. Quá trình này giảm thời gian và bộ nhớ cần thiết để máy ảo thực
hiện giai đoạn 2 trong quá trình kiểm tra. File class sau khi được “tiền
kiểm tra” sẽ tăng dung lượng khoảng 5%
• Kiểm tra nội thiết bị (In-device verification): Khi thiết bị nạp các file class
đã được tiền kiểm tra, công cụ kiểm tra trong thiết bị sẽ thực hiện một vài
kiểm tra để xác nhận tính hợp lệ của đoạn code. Nếu phát hiện một lỗi nào
đó bộ kiểm tra sẽ phát sinh báo cáo và từ chối nạp lớp đối tượng vào bộ
nhớ. Quá trình này đòi hỏi ít bộ nhớ và tài nguyên hơn nhiều lần so với
trong J2SE và J2EE.
CLDC không hỗ trợ tất cả các lớp và thư viện được hỗ trợ trong ngôn ngữ Java
truyền thống mà chỉ hỗ trợ những thư viện thật sự cần thiết đối với thiết bị di động.
Ngoài ra trong CLDC chúng ta cũng được hỗ trợ việc truy vấn một số thuộc tính
của hệ thống:
• Lấy thông tin về platform của thiết bị:
System.getProperty("microedition.platform")
• Lấy thông tin về bảng mã mặc định:
System.getProperty("microedition.encoding")
• Lấy trông tin về version và tên của configuration:
System.getProperty("microedition.configuration")
• Lấy thông tin về Profile:
System.getProperty("microedition.profiles")
Ngoài ra chúng ta có thể truy cập lớp Runtime để lấy các thông số về thiết bị như:
Runtime rtime= Runtime.getRuntime();
System.out.println("Total memory: " + rtime.totalMemory());
//thông tin về tổng bộ nhớ
System.out.println("Free memory: " + rtime.freeMemory());
//thông tin về bộ nhớ trống
15
SV
ne
t.vn
Java Mobile
2.2. MIDP:
2.2.1. Yêu cầu phần cứng:
• Màn hình ít nhất phải có 96 x 54 pixels
• Có ít nhất một thiết bị nhập liệu: bàn phím hoặc màn hình cảm ứng.
• Có ít nhất 128 kilobytes bộ nhớ non-volatile để chạy các thành phần của MID
• Có ít nhất 8 kilobytes bộ nhớ non-volatile để lưu các cấu hình chương trình và dữ
liệu
• Có ít nhất 32 kilobytes để chạy Java
• Có kết nối không dây (wireless network)
2.2.2. Yêu cầu phần mềm:
Mặc dù hệ điều hành của từng thiết bị có thể khác nhau nhưng phải đáp ứng
được các yêu cầu tối thiểu sau:
• Hệ điều hành phải hỗ trợ việc xử lý ngắt, xử lý exception và hỗ trợ xử lý đồ
họa bitmap để xuất dữ liệu ra màn hình
• Hệ điều hành phải nhận được tín hiệu nhập liệu (input) và chuyển dữ liệu đó
cho máy ảo Java
• Hệ điều hành phải hỗ trợ việc đọc/ghi vào bộ nhớ non-volatile. Không đòi hỏi
hệ điều hành phải định nghĩa file system nhưng phải cho phép ghi dữ liệu dạng
persistent (không bị mất đi khi tắt máy, ngắt điện).
• Phải hỗ trợ truy xuất mạng, đặc biệt phải có tính năng đọc/ghi dữ liệu thông
qua mạng không dây (wireless network).
2.2.3. Cấu trúc MID Profile:
16
SV
ne
t.vn
Java Mobile
Hình 2.1 Cấu trúc thiết bị MID
Tầng dưới cùng là phần cứng của thiết bị di động. Bên trên phần cứng ta có hệ
điều hành điều khiển các hoạt động.
Bên trên hệ điều hành ta có thể chia thành 2 phần riêng biệt. Chúng ta sẽ thấy
phần bên phải là các chương trình native application (tạm dịch là “chương trình
nguyên gốc”). Trước khi J2ME ra đời, thông thường đây là loại chương trình duy
nhất có trên các thiết bị. Đây là loại chương trình được nhà sản xuất đưa sẵn vào
máy di động lúc sản xuất như chương trình chọn tiếng chuông, chỉnh thông số điện
thoại, chỉnh giờ… Chính nhờ J2ME ra đời chúng ta mới có chức năng cài đặt thêm
các chương trình được viết thêm vào điện thoại.
CLDC là nền tảng cơ bản cho MID Profile, các chương trình MIDP (MIDP
Applications) có thể sử dụng các lớp được cung cấp bởi cả CLDC và MIDP. Ngoài
ra chúng ta còn có các lớp OEM (original equipment manufacturer) là các lớp do
các nhà sản xuất cung cấp thêm cho điện thoại (các hãng như Nokia, Samsung,
Motorola… thường có thêm nhiều lớp cấp cao hỗ trợ cho lập trình viên) và bên trên
là các ứng dụng được xây dựng từ các lớp này, các ứng dụng này thường chỉ chạy
trên các điện thoại của hãng đã cung cấp thư viện lơp OEM.
17
SV
ne
t.vn
Java Mobile
2.2.4. MIDlet Suite:
Chúng ta gọi chương trình Java chạy trên thiết bị di động là một MIDlet. MIDlet
sẽ sử dụng các lớp cung cấp bởi CLDC và MIDP. Một MIDlet Suite (một bộ
MIDlet) chứa một hay nhiều ứng dụng MIDlet được nén chung trong một file JAR
(Java Archive).
Cấu trúc file Jar:
Ngoài các file lớp và resource, trong file Jar còn có một tập tin được gọi là
manifest. Đây là tập tin mô tả nội dung của toàn file Jar. Tập tin này có tên
manifest.mf và bản thân nó cũng được nén trong file Jar. Trong file manifest chúng
ta có thể định nghĩa các thuộc tính của file jar nhưng quan trọng nhất là 6 thuộc tính
sau:
- MIDlet-Name
- MIDlet-Version
- MIDlet-Vendor
- MIDlet- (mỗi một MIDlet cần một mẫu thông tin này)
- MicroEdition-Profile
- MicroEdition-Configuration
Nếu 1 trong 6 thông tin này thiếu thì thiết bị sẽ từ chối chạy các ứng dụng trong file
Jar này.
Bảng sau mô tả các thuộc tính có thể định nghĩa trong file manifest:
Thuộc tính Mục đích Bắt buộc
MIDlet-Name Tên của bộ MIDlet Có
MIDlet-Version Số phiên bản Có
MIDlet-Vendor Cho biết người tạo MIDlet Suite Có
MIDlet- Tham chiếu đến từng MIDlet trong bộ
MIDlet (trong file Jar), mỗi một MIDlet cần
một mẫu tin này, mẫu tin này gồm 3 mẫu tin
con:
Tên MIDlet
Có
18
SV
ne
t.vn
Java Mobile
File Icon MIDlet (có thể không cần)
Tên lớp sẽ được nạp khi thực thi MIDlet
này
MicroEdition-
Profile
Tên profile cần thiết để chạy MIDlet này,
thường là MIDP1.0 hoặc MIDP2.0
Có
MicroEdition
Configuration
Configuration cần để chạy MIDlet (thường
là CLDC 1.0)
Có
MIDlet-Icon File icon (.pgn) của bộ MIDlet Không
MIDlet-Description Mô tả (text) của bộ MIDlet Không
MIDlet-Info-URL Địa chỉ trang web nhà phát triển MIDlet Không
Bảng 2.1 Cấu trúc file manifest
Đây là một ví dụ đơn giản của file manifest:
MIDlet-Name: Todo List
MIDlet-Version: 1.0
MIDlet-Vendor: Core J2ME
MIDlet-1: TodoList, /images/Todo.png, Todo.TodoMIDlet
MicroEdition-Profile: MIDP-1.0
MicroEdition-Configuration: CLDC-1.0
File JAD (Java Application Descriptor File):
Bên cạnh file Jar, một bộ ứng dụng MIDlet còn có thêm file JAD (.jad) để cung
cấp thông tin về các MIDlet trong file JAR. Việc đặt ra file JAD có một số mục đích
sau:
• Cung cấp thông tin về nội dung file Jar. Từ thông tin này, bộ quản lý ứng dụng
trên thiết bị mới quyết định ứng dụng này có thích hợp để chạy trên thiết bị hay
không.
• Cung cấp các tham số dùng cho MIDlet để tránh thay đổi file JAR. File JAR
chứa mã ứng dụng nên cần tránh bị thay đổi.
19
SV
ne
t.vn
Java Mobile
Danh sách các thuộc tính trong file Jad:
Thuộc tính Mục đích Bắt buộc
MIDlet-Name Tên của bộ MIDlet Có
MIDlet-Version Số phiên bản Có
MIDlet-Vendor Cho biết người tạo MIDlet Suite Có
MIDlet- Tham chiếu đến từng MIDlet trong bộ
MIDlet (trong file Jar), mỗi một MIDlet cần
một mẫu tin này, mẫu tin này gồm 3 mẫu tin
con:
Tên MIDlet
File Icon MIDlet (có thể không cần)
Tên lớp sẽ được nạp khi thực thi MIDlet
này
Có
MIDlet-Jar-URL Địa chỉ URL của file Jar Có
MIDlet-Jar-Size Kích thước file Jar tính bằng byte Có
MIDlet-Data-Size Kích thước tối thiểu tính bằng byte để ghi
các dữ liệu của chương trình (persistent
data)
Không
MIDlet-Description Mô tả MIDlet (dạng text) Không
MIDlet-Delete-
Confirm
Thông báo nhắc nhở khi xóa MIDlet Không
MIDlet-Install-
Notify
URL nhận thông báo về quá trình cài đặt Không
Bảng 2.2 Cấu trúc file JAD
Ta cũng có thể định nghĩa thêm các thuộc tính riêng, bắt đầu bằng “MIDlet-“ tùy
theo mục đích của lập trình viên. Những thuộc tính sau phải giống nhau ở file Jad
và file manifest (nằm trong file Jar):
- MIDlet-Name
- MIDlet-Version
20
SV
ne
t.vn
Java Mobile
- MIDlet-Vendor
- MIDlet- for each MIDlet
- MIDlet-Jar-URL
Nếu các thuộc tính này không giống nhau, ứng dụng sẽ bị thiết bị từ chối. Với
các thuộc tính còn lại, nếu file Jad và file manifest khác nhau thì thuộc tính trong
file Jad sẽ được ưu tiên hơn.
Sau đây là một ví dụ đơn giản về file Jad:
MIDlet-Name: Todo List
MIDlet-Version: 1.0
MIDlet-Vendor: Core J2ME
MIDlet-Jar-URL:
MIDlet-Jar-Size: 17043
MIDlet-1: TodoList, /images/Todo.png, Todo.TodoMIDlet
Ở đây có một câu hỏi được đặt ra: Tại sao phải ghép nhiều ứng dụng MIDlet
thành một file nén dạng JAR. Mục đích của việc kết hợp này giúp cho các ứng dụng
MIDlet được nén chung này có thể chia xẻ chung các tài nguyên với nhau. Một ví
dụ có thể đề cập đến là việc chia sẻ chung các Record Store: trong môi trường
J2ME chúng ta không có khái niệm file system; mọi nhu cầu lưu trữ dữ liệu được
thông qua các Record. Trong một bộ MIDlet Suite thì tên các Record phải phân biệt
và các ứng dụng MIDlet cùng chung trong một bộ sẽ có thể chia sẻ các Record này
với nhau. Điều này khá thuận lợi, nó có thể giúp chúng ta viết các games cùng chia
sẻ danh sách người chơi, danh sách các người chơi có điểm cao nhất…
Khi nạp ứng dụng vào thiết bị ta cùng lúc nạp hai file .Jar và .Jad; file .Jad sẽ là
file thực thi và file .Jar chứa mã thực thi của chương trình
21
SV
ne
t.vn
Java Mobile
2.2.5. Môi trường phát triển ứng dụng J2ME
Phần này chúng ta sẽ tìm hiểu về các phần mềm cần thiết dùng để phát triển một
ứng dụng J2ME, cách cài đặt và cấu hình các phần mềm này. Ngoài ra chúng ta sẽ
nghiên cứu về các tools phát triển được hỗ trợ thêm.
Để viết một ứng dụng J2ME chúng ta cần ít nhất 3 chương trình sau:
Java Development Kit (JDK) , version 1.3 hoặc cao hơn (phiên bản mới nhất tính
đến lúc luận văn được thực hiện là phiên bản 1.42)
Connected, Limited Device Configuration (CLDC):
Mobile Information Device Profile(MIDP):
Ghi chú: Ở đây xem Microsoft Windows như hệ điều hành mặc định được sử dụng,
nếu người dùng sử dụng hệ điều hành khác thì phải có một số điều chỉnh phù hợp
với hệ điều hành đó.
Cài đặt các phần mềm:
• Cài đặt JDK:
File cài đặt JDK có dạng file thực thi (.exe), chúng ta chỉ cần chạy và làm theo
các hướng dẫn sẽ cài đặt thành công bộ JDK (giả sử thư mục cài đặt là C:\jdk1.3.1)
Set biến môi trường (Environment Variable):
Việc set biến môi trường giúp chúng ta chạy trình biên dịch từ bất cứ vị trí nào,
không cần phải gõ tên và đường dẫn đầy đủ của trình biên dịch.
– Vào Control Panel, Chọn System.
– Chọn Environment (hoặc Advanced/Environment)
– Tìm mục PATH, thêm thư mục \bin của thư mục JDK (ví dụ C:\JDK\bin)
vào biến môi trường PATH (PATH=…………..;c:\jdk\bin;)
• Cài đặt CLDC và MIDP:
File CLDC và MIDP có dạng zip, ta giải nén vào chung một thư mục (ví dụ
C:\J2ME).
22
SV
ne
t.vn
Java Mobile
Thư mục J2ME có dạng:
C:\J2ME
j2me_cldc (thư mục chứa CLDC)
midp1.0.1.fcs (thư mục chứa MIDP)
Sau cùng ta set hai biến môi trường PATH và CLASSPATH như sau:
PATH=C:\jdk1.3.1\bin;C:\j2me\j2me_cldc\bin;C:\j2me\midp1.0.3fcs\bin;
CLASSPATH=C:\j2me\midp1.0.3fcs\classes;. (dấu "." chỉ thư mục hiện hành)
Lúc này ta đã đủ công cụ để xây dựng ứng dụng J2ME. Chúng ta có nhiều công cụ
hỗ trợ cho quá trình biên dịch và thực thi MIDlet nhưng ban đầu chúng ta sẽ tìm
hiểu cách sử dụng những công cụ cơ bản nhất và là công cụ chuẩn của J2ME.
Quá trình biên dịch và thực thi ứng dụng J2ME phải qua một số thao tác bằng dòng
lệnh (command lines), chúng ta giả sử thư mục chứa mã nguồn là thư mục
C:\Midlets.
Ta sẽ xây dựng một ứng dụng J2ME đơn giản để mô phỏng quá trình biên dịch và
thực thi, ứng dụng có tên Welcome và file source code có tên Welcome.java
C:\Midlets\Welcome\Welcome.java
• Quá trình biên dịch và Pre-verify:
Để biên dịch ta chuyển đến thư mục chứa ứng dụng (C:\Midlets\Welcome\) và
gọi lệnh:
javac -bootclasspath c:\j2me\midp1.0.3fcs\classes Welcome.java
hoặc
javac –bootclasspath %CLASSPATH% Welcome.java
(CLASSPATH là biến môi trường đã được định nghĩa trước thay cho
c:\j2me\midp1.0.3.fcs\classes;.)
Javac là chương trình biên dịch của bộ JDK, thông số -bootclasspath ra lệnh cho
chương trình dich lấy các file lớp cơ sở tại thư mục c:\j2me\midp1.0.3fcs\classes
(Đây là file lớp cơ sở của MIDP). Nếu không có thông số này, file lớp cơ sở của
JDK sẽ được sử dụng, file lớp cơ sở này khác với file của MIDP nên J2ME có thể
không sử dụng được.
23
SV
ne
t.vn
Java Mobile
Sau quá trình này file Welcome.class sẽ được tạo ra và mặc địch ở chung thư mục
với file mã nguồn.
Sau khi có file class ta cần thực hiện việc “pre-verify” (đã được đề cập ở phần trước
của luận văn).
Ta thực thi dòng lệnh:
preverify -classpath c:\j2me\midp1.0.3fcs\classes;. -d . Welcome
hoặc
preverify –classpath %CLASSPATH% –d . Welcome
Tương tự, thông số classpath chỉ ra vị chí các file class tại thư mục
c:\j2me\midp1.0.3fcs\classes và thư mục hiện hành (dấu “.”). Thông số -d chỉ ra thư
mục output kết quả là thư mục hiện hành.
Quá trình Pre-verify này là bắt buộc, nếu không thực hiện công đoạn này thiết
bị di động sẽ từ chối thực thi ứng dụng
• Thực thi ứng dụng MIDlet:
Ta thực thi câu lệnh:
midp -classpath . Welcome
Thông số class path chỉ ra thư mục chứa file cần thực thi, ở đây là thư mục hiện
hành, tên ứng dụng là Welcome (file Welcome.class đã được pre – verify).
Trên đây là quá trình cơ bản nhất để biên dịch và thực thi một ứng dụng J2ME,
để sử dụng những tính năng cao hơn (tạo MIDlet Suite chứa nhiều MIDlet, tạo file
Jad, file Jar) xin vui lòng xem file hướng dẫn trong đĩa CD đính kèm hoặc xem tài
liệu của các bộ biên dịch. Để tiết kiệm thời gian, chúng ta thường dùng các công cụ
tiện ích như Sun Wireless Toolkit, xin xem phần phụ lục để biết cách sử dụng.
24
SV
ne
t.vn
Java Mobile
Chương 3: Các vấn đề cơ bản của chương
trình MIDlet
3.1. Cấu trúc cơ bản:
Chúng ta gọi chung các chương trình J2ME là MIDlet. Các chương trình MIDlet
này đều được kế thừa từ lớp MIDlet. Không giống như chương trình trên máy PC,
các chương trình MIDlet không cần hàm main() để thực thi. Trước hết chúng ta sẽ
xem xét về “vòng đời” (lifecycle) của các ứng dụng MIDlet.
Một chương trình MIDlet khi được nạp vào thiết bị có những trạng thái sau:
– Paused: Một chương trình MIDlet sẽ được đưa vào trạng thái paused sau khi
thực hiện phương thức khởi tạo (constructor) và trước khi được chương trình
quản lý ứng dụng (application manager) trên thiết bị gọi thực thi. Trong quá
trình hoạt động, chương trình MIDlet cũng có thể bị đưa trở lại trạng thái
paused bởi thiết bị (khi cần trả lời cuộc gọi đến …) hoặc bởi chính chương
trình MIDlet.
– Active: Chương trình MIDlet đang thực thi.
– Destroyed: Chương trình MIDlet đã giải phóng tất cả tài nguyên và đã được
tắt bởi trình quản lý ứng dụng trên thiết bị.
3.2. Xây dựng một ứng dụng MIDlet:
Chúng ta xây dựng một ứng dụng MIDlet bằng cách kế thừa (extends) lớp
MIDlet. Lớp này thực chất là một interface và chúng ta phải khai báo ba hàm sau
đây: startApp(), pauseApp() và destroyApp(). Đây là một ví dụ về một chương trình
MIDlet đơn giản:
public class Shell extends MIDlet
{
25
SV
ne
t.vn
Java Mobile
// phương thức khởi tạo (constructor) không bắt buộc phải có
public Shell(){ … }
// Được application manager gọi trước khi thực thi MIDlet
public void startApp(){…}
// Được gọi trước khi tạm dừng MIDlet
public void pauseApp(){ …}
// Được gọi trước khi kết thúc chương trình
public void destroyApp(boolean unconditional){… }
}
3.3. Lớp MIDlet:
Như đã đề cập, mọi ứng dụng của ta đều kế thừa từ lớp MIDlet. Lơp này được
khai báo như sau:
public abstract class MIDlet {
…
protected abstract void startApp()
throws MIDletStateChangeException;
protected abstract void pauseApp();
protected abstract void destroyApp(boolean
unconditional) throws
MIDletStateChangeException;
}
Ba hàm được nêu ở trên là ba hàm bắt buộc chúng ta phải xây dựng khi tạo ứng
dụng MIDlet. Lớp MIDlet được chứa trong package javax.microedition.midlet
Sau đây là danh sách các hàm thường dùng trong lớp MIDlet:
Phương thức: Mô tả:
abstract void destroyApp
(boolean unconditional)
Hàm này được gọi khi có nhu cầu tắt MIDlet. Đây
là nơi giải phóng các tài nguyên đã dùng.
abstract void pauseApp() Hàm này được gọi để giải phóng các tài nguyên
26
SV
ne
t.vn
Java Mobile
trước khi tạm dừng chương trình.
abstract void startApp() Được gọi khi MIDlet sắp được đưa vào trạng thái
thực thi (active state).
final void notifyDestroyed() Báo cho application manager biết chương trình
MIDlet đã giải phóng tài nguyên và cần được tắt.
(sau khi gọi destroyApp)
final void notifyPause() Báo cho application manager biết chương trình
MIDlet đã giải phóng tài nguyên và muốn vào trạng
thái tạm dừng (sau khi gọi pauseApp)
final void resumeRequest() Báo cho application manager ta cần đưa MIDlet
vào trạng thái hoạt động trở lại. (Sau đó application
manager sẽ gọi startApp).
final String getAppProperty
(String key)
Lấy các thông số của chương trình (từ file jad và
file manifest).
Bảng 3.1 Lớp MIDlet
Ở đây chúng tôi xin mô tả hai quá trình quan trọng nhất của một ứng dụng MIDlet
là quá trình khởi nạp và quá trình thoát ứng dụng:
– Quá trình nạp:
• User chọn kích hoạt ứng dụng MIDlet
• Application manager khởi tạo các biến, gọi phương thức khởi tạo
(constructor).
• Ứng dụng MIDlet sau khi được nạp vào bộ nhớ sẽ được đưa vào trạng thái
paused (nhưng hàm pauseApp() sẽ không được gọi).
• Application manager gọi hàm startApp(). Thực chất hàm startApp() sẽ
được gọi mỗi khi ứng dụng được đưa vào trạng thái thực thi (active); khi ta
tạm ngưng ứng dụng và có nhu cầu kích hoạt trở lại hàm này cũng được
gọi.
– Quá trình thoát:
• User chọn thoát chương trình
27
SV
ne
t.vn
Java Mobile
• Hàm destroyApp() được gọi, hàm này phải bảo đảm việc giải phóng tài
nguyên.
• Hàm notifyDestroyed() được gọi để báo cho application manager ứng dụng
đã giải phóng hết tài nguyên và sẵn sàng bị tắt.
3.4. Lớp MIDletStateChangeException:
Khi tìm hiểu về package javax.microedition.midlet, còn một lớp quan trọng
chúng ta phải chú ý đến là lớp MIDletStateChangeException. Ứng dụng MIDlet có
hai hàm có khả năng tạo ra (throw) Exception này là hàm destroyApp() và hàm
startApp().
Như chúng ta đã biết, trước khi ứng dụng được đưa vào trạng thái active thì hàm
startApp() sẽ được gọi. Nếu trong quá trình gọi hàm này dẫn đến phát sinh lỗi (thiết
bị hết tài nguyên, tài nguyên cần dùng đang bị ứng dụng khác chiếm…) thì
MIDletStateChangeException sẽ được tạo ra. Trong quá trình thoát, hàm
destroyApp() cũng có thể phát sinh exception này, ví dụ như khi chúng ta thoát mà
chương trình đang nhận dữ liệu hết sức quan trọng từ network ta có thể phát sinh
exception để dừng việc thoát.
Ta xem xét hàm destroyApp(boolean condition):
Tham số condition ở đây có một ý nghĩa khá thú vị, nếu tham số này là true dù
chúng ta có phát sinh exception MIDletStateChangeException thì ứng dụng vẫn
thoát; chỉ khi nào tham số này là false thì exception MIDletStateChangeException
mới có khả năng hủy việc thoát chương trình.
3.5. Display
Ứng dụng của chúng ta chắc chắn có nhu cầu xuất dữ liệu ra màn hình. Việc
này trong một ứng dụng MIDlet do một đối tượng thuộc lớp display đảm nhiệm.
Lớp này nằm trong package javax.microedition.lcdui, package này chứa hầu như tất
cả các lớp phục vụ cho việc phát triển giao diện của ứng dụng.
Chúng ta sẽ xem xét một số hàm quan trọng nhất của lớp Display:
28
SV
ne
t.vn
Java Mobile
Phương thức: Mô tả:
static Display getDisplay(MIDlet m) Lấy đối tượng Display của MIDlet
Displayable getCurrent() Lấy đối tượng Displayable hiện thời (sẽ đề
cập sau)
void setCurrent (Alert alert,
Displayable nextDisplayable)
void setCurrent (Displayable
nextDisplayable)
Tạo đối tượng alert (sẽ đề cập sau)
boolean isColor() Cho biết thiết bị có hỗ trợ màu hay không?
int numColors() Có bao nhiêu màu được hỗ trợ?
Bảng 3.2 Lớp Display
Một MIDlet sẽ có một và chỉ một đối tượng Display để điều khiển việc thể hiện dữ
liệu. Đối tượng Display không có phương thức khởi tạo mà được khởi tạo trực tiếp
từ phương thức static của lớp.
Ví dụ:
Display display=Display.getDisplay(this);
Tham số đầu vào là một MIDlet, ở đây chúng ta gọi hàm từ lớp kế thừa từ
MIDlet nên có thể truyền vào con trỏ this. Thực ra công dụng chính của Display là
cho phép hiển thị đối tượng nào lên màn hình hiện thời. Các đối tượng có thể hiển
thị lên màn hình là các đối tượng thuộc lớp Displayable (sẽ được giới thiệu sau), ví
dụ như form, TextBox, Canvas,Screen…
Ta xét ví dụ sau:
public class Vidu extends MIDlet
{
Form mainForm;
Vidu{
mainForm=new Form(…….);
}
29
SV
ne
t.vn
Java Mobile
public void startApp()
{
………
Display display=Display.getDisplay(this);
Display.setCurrent(mainFrom);
……….
}
………………………….
}
Ban đầu ta khởi tạo một form để thể hiện lên màn hình, sau khi ứng dụng
MIDlet được nạp vào bộ nhớ constructor được gọi để tạo form. Sau đó, phương
thức startApp() được gọi, trong phương thức này ta chọn Form mainForm để thể
hiện lên màn hình bằng lệnh setCurrent. Khi ứng dụng bị tạm ngưng (paused) và
phục hồi trở lại (resume) thì hàm startApp() cũng được gọi và form lại được thể
hiện trên màn hình. Đến đây chúng ta có thể hình dung được phần nào tác dụng của
đối tượng Display.
3.6. Lớp Displayable:
Như đã đề cập, một ứng dụng MIDlet chỉ có một đối tượng Display duy nhất và
đối tượng Display này dùng để thể hiện các đối tượng Displayable lên màn hình.
Như tên của lớp Displayable cho chúng ta thấy, đây là các đối tượng có khả năng
hiển thị thông tin lên màn hình thiết bị. Lớp Displayable bao gồm 2 lớp con là lớp
Screen và lớp Canvas. Cụ thể chúng được định nghĩa như sau:
abstract public class Displayable;
public abstract class Canvas extends Displayable;
public abstract class Screen extends Displayable;
30
SV
ne
t.vn
Java Mobile
Lớp Screen còn được chia thành những lớp con nhỏ hơn như: TextBox, List,
Form và Alert. Đây là những lớp giao diện cấp cao (vì phần lớn các công việc thể
hiện của các lớp này đã được cài đặt sẵn). Các đối tượng của lớp Canvas được gọi là
những đối tượng đồ họa cấp thấp, các lớp này cho phép chúng ta xử lý các giao tác
đồ họa ở tầng dưới, xử lý màu sắc và chủ yếu dùng trong quá trình viết games. Ở
những phần sau chúng ta sẽ tìm hiểu kỹ hơn về các lớp giao diện ở cấp thấp lẫn cấp
cao.
* Tạo một đối tượng Displayable:
Thông thường chúng ta không tạo trực tiếp một đối tượng thuộc lớp Displayable
mà sử dụng các lớp con của nó. Để viết các ứng dụng đồ họa ta thường kế thừa từ
lớp Canvas:
public class GameScreen extends Canvas
{
draw images, shapes, text …
}
Khi xây dựng các ứng dụng tiện ích (ít dùng đến các chức năng đồ họa) ta sẽ dùng
các lớp đồ họa cấp cao như Form, TextBox … hoặc kế thừa từ các lớp này.
Các hàm chính của lớp Displayable:
Phương thức: Mô tả:
void addCommand(Command cmd) Thêm một đối tượng Command vào đối
tượng Displayable
void removeCommand (Command
cmd)
Xóa bỏ một đối tượng Command từ đối
tượng Displayable
void setCommandListener
(CommandListener l)
Thêm CommandListener vào đối tượng
Displayble
31
SV
ne
t.vn
Java Mobile
boolean isShown() Kiểm tra đối tượng Displayable có được
thể hiện trên thiết bị hay không?
Bảng 3.3 Lớp Displayable
*Ghi chú: Các đối tượng Command và CommandListener sẽ được đề cập chi tiết ở
phần sau.
Tại thời điểm này chúng ta có thể hình dung một Command như một nút ấn điều
khiển trong ứng dụng của chúng ta, CommandListener có tác dụng chuyển các sự
kiện khi người dùng kích hoạt một Command đến lớp xử lý của ứng dụng. Để “bắt”
được các sự kiện được chuyển tới khi người dùng kích hoạt một Command, ứng
dụng của chúng ta phải cài đặt hàm commandAction. Ví dụ như sau:
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)
{
destroyApp(true);
notifyDestroyed();
}
}
3.7. Quản lý các sự kiện (event)
Ngày nay, việc xử lý sự kiện là một trong những vấn đề cơ bản nhất của một
chương trình. Có thể nói, trong thế giới phần mềm ngày nay không một chương
trình nào lại không có khả năng tương tác với người dùng, do đó việc quản lý các sự
kiện phát sinh là một vấn đề mà bất cứ phần mềm nào cũng phải thực hiện. Quá
trình xử lý các sự kiện phát sinh bao gồm 3 quá trình cơ bản:
• Phần cứng (thiết bị di động) phải cảm nhận được khi có một sự kiện phát
sinh: người dùng ấn một phím, một cable được cắm vào hay rút ra.
32
SV
ne
t.vn
Java Mobile
• Phần mềm trên thiết bị (hệ điều hành) phải nhận biết được có sự kiện phát
sinh
• Hệ điều hành chuyển thông tin về sự kiện cho ứng dụng, bắt đầu từ đây là
công việc của những lập trình viên J2ME. Tùy theo các thông tin về sự
kiện mà chúng ta phải đưa ra các giải pháp thích hợp
Trong phần này chúng ta sẽ chỉ nghiên cứu về các sự kiện được phát sinh ở
những ứng dụng sử dụng các chức năng đồ họa ở mức cao (Form, TextBox…), còn
các sự kiện phát sinh ở những ứng dụng sử dụng các thư viện đồ họa ở mức thấp
như các games sẽ được đề cập sau.
Thực chất để nhận được thông báo từ hệ điều hành về các sự kiện phát sinh lớp
ứng dụng chính của chúng ta phải cài đặt (implement) các “listener”. Trong J2ME
hỗ trợ sẵn cho chúng ta 2 listener là CommandListener và ItemStateListener. Lớp
CommandListener có hàm commandListener() và tương ứng lớp ItemStateListener
có hàm itemStateChange(), đây là 2 hàm chúng ta cần cài đặt để nhận biết các sự
kiện xảy ra. Trước khi đi sâu vào xử lý các sự kiện chúng ta sẽ tìm hiểu 2 tác nhân
chính phát sinh một sự kiện là Command và Item.
3.7.1. Command & CommandListener
Ta định nghĩa Command là một đối tượng giữ thông tin về một sự kiện (Event).
Nói một cách đơn giản nhất thì command như một nút ấn (button) trên ứng dụng di
động, khi ta chọn nút này thì sẽ phát sinh một sự kiện tương ứng.
33
SV
ne
t.vn
Java Mobile
Hình 3.1 Command Exit
Trong ví dụ trên ta thấy Command “Exit” tương ứng với một nút ấn trên điện
thoại. Việc xem một Command tương ứng với một nút ấn trên thiết bị là một quan
niệm nhằm đơn giản hóa vấn đề nhưng không hoàn toàn chính xác. Nếu chúng ta
xem xét các hạn chế về kích thước về màn hình và số lượng nút ấn có trên thiết bị
thì vấn đề sẽ trở nên phức tạp hơn, có những form số lượng command có thể nhiều
hơn số nút ấn chức năng trên thiết bị, lúc này các command được tổ chức theo dạng
menu. Trước tiên, ta sẽ tìm hiểu các công việc phải làm để thêm một command vào
ứng dụng:
• Tạo một command để lưu giữ thông tin về event
• Thêm command này vào Form, TextBox hay Alert… (các đối tượng
displayable)
• Thêm một listener vào các Form hay TextBox … trên.
Khi phát hiện một event được kích hoạt, bộ listener sẽ gọi hàm commandListener()
và truyền các thông tin về event làm thông số cho hàm. Sau đây là một đoạn code ví
dụ:
public class TestCommand extends MIDlet implements CommandListener
{
34
SV
ne
t.vn
Java Mobile
private Form fmMain; // Tạo một form
private Command cmExit; // Tạo một command để thoát khỏi ứng dụng
...
fmMain = new Form("Core J2ME"); // Khởi tạo form
cmExit = new Command("Exit", Command.EXIT, 1); // Khởi tạo command
...
fmMain.addCommand(cmExit); // Thêm command vào form
fmMain.setCommandListener(this); // Thêm bộ listener cho form
...
//hàm dùng để bắt các sự kiện
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)//nếu là command exit, thoát chương trình
{
destroyApp(true);
notifyDestroyed();
}
}
}
Qua ví dụ trên ta thấy việc tạo một command và xử lý nó tương đối đơn giản.
Điểm quan trọng cần chú ý là lớp ứng dụng của ta phải cài đặt một bộ listener
(trong ví dụ trên ta implements CommandListener) và phải cung cấp hàm
commandListener để xử lý các events.
Khi chúng ta tạo một Command có ba thông số cần cung cấp:
35
SV
ne
t.vn
Java Mobile
Label: Đoạn văn bản được xem như nhãn của command. Như trong hình 3.1, “Exit”
là nhãn của command. Như trong hình 3.2, ta thấy đây cũng là label của command
nhưng được thể hiện ở dạng khác: dạng menu.
Hình 3.2 Command Label
Type: Thật thuận tiện nếu ta có thể ánh xạ một command với một nút trên thiết bị
(ta gọi là “soft-button”). Giả sử ta có một command tên help và ánh xạ được với
HELP Button trên thiết bị thì thật trực quan và dễ dàng cho người dùng.
Thông số Type giúp chúng ta làm chuyện này: Ta chọn Command.HELP. Nếu thiết
bị không có nút help, thông số này không có ý nghĩa và command được đối xử như
các command thông thường. Tuy nhiên, ta cần lưu ý khi ta tặt type là
Command.HELP thì không có nghĩa khi ta chọn command này các hướng dẫn sẽ
được phát sinh mà ta cần phải làm việc này trong hàm commandAction(). Thông số
type chỉ giúp việc ánh xạ các nút soft-button được dễ dàng.
Hình 3.3 Ánh xạ soft-button
36
SV
ne
t.vn
Java Mobile
Các type được hỗ trợ:
Giá trị Mô tả
BACK Dùng để đi ngược lại màn hình trước đó.
CANCEL Dùng để hủy công việc đang thực hiện
EXIT Dùng để thoát chương trình
HELP Cung cấp thông tin trợ giúp
ITEM Dùng để ánh xạ một Command với một item trên màn hình. Giả
sử khi ta dùng giao diện List, khi chọn một item ta có thể gắn item
này với một command để phát sinh một sự kiện nào đó.
OK Xác nhận một yêu cầu nào đó hoặc thoát khỏi màn hình thông
báo.
SCREEN Thông thường thiết bị không có các soft button tương ứng với các
command dạng này. Việc thể hiện các command sẽ tùy vào từng
thiết bị (sẽ có các ví dụ)
STOP Dừng một công việc đang thực hiện.
Bảng 3.4 Các Command Type
Như đã đề cập, các type chỉ có ý nghĩa khi thiết bị có một nút tương ứng dành
riêng cho type này (như nút help của thiết bị hình 3.3).
Priority: Độ ưu tiên, dùng để sắp xếp các command từ trên xuống dưới hay trái sang
phải khi được thể hiện chung dạng menu. Hình 3.2 thể hiện command Upload có độ
ưu tiên cao hơn command Download. Giá trị này càng cao thì độ ưu tiên càng thấp.
Sau đây là các hàm chính của lớp Command và CommandListener (hai lớp này nằm
trong package javax.microedition.lcdui).
Lớp javax.microedition.lcdui.Command
Cú pháp Ý nghĩa
Command (String label, int
cmdType, int priority)
Hàm khởi tạo, các thông số đã được trình bày
bên trên
int getCommandType() Cho biết Type của Command
37
SV
ne
t.vn
Java Mobile
int getLabel() Cho biết Label của Command
int getPriority() Cho biết độ ưu tiên
Lớp javax.microedition.lcdui.CommandListener
void commandAction(Command
c, Displayable d)
Được gọi khi command c nằm trên đối tượng
Displayable d phát sinh một sự kiện
Bảng 3.5 Command và CommandListener
3.7.2. Item và ItemStateListener
Sự kiện (event) không chỉ được phát sinh thông qua kích hoạt commands mà
còn có thể được phát sinh thông qua các items. Một item là một bộ phận có thể gắn
kèm lên trên các form. ChoiceGroup, DateField, Gauge và TextField là các dạng
khác nhau của Item và mỗi dạng đều có thể phát sinh các sự kiện (chúng ta sẽ tìm
hiểu về các items này trong phần Đồ Họa Cấp Cao). Items chỉ có thể được sử dụng
như một thành phần của form, khác với Commands có thể được sử dụng trong
Form, TextBox, List và Canvas.
Khi chúng ta thêm một Item vào Form, để xử lý được các sự kiện phát sinh ta
phải cài đặt một Listener (ở đây là ItemStateListener). Khi có một thay đổi trên Item
(ví dụ như ta chọn một mục trong ChoiceGroup hay thay đổi dữ liệu của một
DateField) thì đối tượng listener sẽ được thông báo có một sự kiện phát sinh cùng
các thông tin về sự kiện này. Sự kiện này sẽ kích hoạt hàm itemStateChanged()
được chúng ta cài đặt.
Hiện tại MIDP hỗ trợ các loại Items sau: ChoiceGroup, DateField, Gauge,
ImageItem, StringItem và TextField. Ở đây có một ngoại lệ là hai loại StringItem và
ImageItem không hỗ trợ phát sinh sự kiện mặc dù chúng là lớp con của lớp Item.
Chúng ta cài đặt một listener trong lớp Form, khi một Item phát sinh sẽ kích hoạt
hàm itemStateChanged(), tuy nhiên không phải khi chúng ta thay đổi giá trị nhiều
items cùng lúc thì itemStateChanged() sẽ được gọi đủ bấy nhiêu lần. Ở đây có một
luật được đề ra:
38
SV
ne
t.vn
Java Mobile
• Nếu một Item bị thay đổi, hàm itemStateChanged() phải được gọi đối với
Item này trước khi những thay đổi trên những Item sau đó được nhận
biết.
• Nếu chính bản thân MIDlet thay đổi giá trị một Item (giả sử chúng ta dùng
mã lệnh để thay đổi chứ không phải do người dùng), hàm
itemStateChanged() không được gọi.
• Nếu thiết bị nhận biết được người dùng chuyển từ Item này sang Item
khác (chuyển focus) thì hàm itemStateChanged() phải được gọi trước khi
chuyển sang Item kế tiếp.
Sau đây là các hàm quan trọng khi sử dụng Item:
Lớp javax.microedition.lcdui.Item
Cú pháp Ý nghĩa
String getLabel() Lấy nhãn của Item
void setLabel(String label) Đặt nhãn cho label
Lớp javax.microedition.lcdui.ItemStateListener
void itemStateChanged(Item item) Được gọi khi giá trị item thay đổi
Bảng 3.6 Item và ItemStateListener
39
SV
ne
t.vn
Java Mobile
Chương 4: Giao diện đồ họa cấp cao
MIDP hỗ trợ thiết kế giao diện dưới hai cấp độ:
• Giao diện cấp cao (high-level interfaces): chủ yếu dùng cho các chương trình ứng
dụng. Ở cấp độ này, MIDP cung cấp sẵn các thành phần giao diện thường dùng
(như textbox, choicegroup, alert...) và hỗ trợ việc hiển thị các thành phần giao
diện này lên màn hình thiết bị. Người viết chương trình chỉ cần gọi các phương
thức hiển thị đã được cung cấp mà không cần quan tâm đến các phương thức đồ
hoạ đã được sử dụng bên dưới.
• Giao diện cấp thấp (low-level interfaces): chủ yếu sử dụng trong các chương
trình games. Các lớp đồ hoạ ở cấp độ này cung cấp các phương thức vẽ trực tiếp
các đối tượng đồ hoạ (như điểm, đường thẳng, đường tròn...)lên màn hình và bắt
sự kiện phím bấm.
Tất cả các lớp hỗ trợ đồ hoạ được đóng gói trong package javax.microedition.cldui.
Trong đó, lớp Screen và các lớp kế thừa từ nó là các thành phần giao diện cấp cao;
lớp Canvas thuộc phần giao diện cấp thấp.
Hình 4.1 Sơ đồ các lớp giao diện đồ hoạ
40
SV
ne
t.vn
Java Mobile
public class Display
public abstract class Displayable
public abstract class Screen extends Displayable
public abstract class TextBox extends Screen
public abstract class List extends Screen
public abstract class Item
public class ChoiceGroup extends Item implements Choice
public class DateField extends Item
public class TextField extends Item
public class Gauge extends Item
public class ImageItem extends Item
public class StringItem extends Item
pubilc abstract class Canvas extends Displayable
public class Command
public class Ticker
public class Graphics
public interface Choice
41
SV
ne
t.vn
Java Mobile
4.1. Screen:
Lớp Screen không được sử dụng trực tiếp như một đối tượng trong chương trình
mà các lớp con của nó (Textbox, List, Alert, Form) mới là các thành phần hiển thị
trên màn hình. Tại một thời điểm chỉ có duy nhất một đối tượng thuộc một trong
các lớp này hiển thị trên màn hình. Đây là điểm khác biệt khi so sánh với các lớp
con của lớp Item sau này.
Lớp Screen cũng định nghĩa sẵn một đối tượng Ticker kết buộc với nó. Đối tượng
này thể hiện một chuỗi ký tự tự động cuộn liên tục từ phải sang trái màn hình.
Các phương thức và chức năng tương ứng của lớp Screen:
Lớp Screen: javax.microedition.lcdui.Screen
Phương thức Chức năng
String getTitle () Lấy tiêu đề của Screen
void setTitle (String s) Gán tiêu đề cho Screen
Ticker getTicker () Lấy biến Ticker của Screen
void setTicker (Ticker ticker) Gán biến Ticker cho Screen
Bảng 4.1 Lớp Screen
42
SV
ne
t.vn
Java Mobile
4.2. Form:
Form là lớp thông dụng nhất trong các đối tượng Displayable. Nếu khi sử dụng
Texbox, List, Alert, ta chỉ có thể hiển thị một đối tượng duy nhất tại một thời điểm
thì khi sử dụng Form, chúng ta có thể hiển thị nhiều đối tượng có chức năng tương
tự tại cùng một thời điểm. Để làm được điều này, ta chỉ cần tạo một đối tượng thuộc
lớp Form và gắn vào đối tượng này một hay nhiều đối tượng thuộc lớp con của lớp
Item (TextField, DateField, ChoiceGroup, Gauge, ImageItem, StringItem). Lớp
Form cũng hỗ trợ sẵn chức năng cuộn màn hình nếu thiết bị không hiển thị hết tất cả
các Item trong một màn hình.
Lớp Form hỗ trợ sẵn các phương thức thêm, xoá, sửa các thành phần trong Form
một cách dễ dàng. Khi gắn một đối tượng thành phần - một đối tượng thuộc lớp con
của Item - vào Form, ta sẽ nhận được một giá trị trả về tương ứng với chỉ mục của
thành phần đó trong Form. Với chỉ mục này, ta có thể tham chiếu đến thành phần
này khi cần tra cứu hay thay đổi thông tin đối tượng.
Các phương thức và chức năng tương ứng của lớp Form:
Lớp Form: javax.microedition.lcdui.Form
Phương thức Chức năng
Form (String title) Khởi tạo một Form
Form (String title, Item[] items) Khởi tạo một Form và thêm các Item vào
Form
int append (Image image) Thêm một biến Image vào Form
int append (Item item) Thêm một biến Item vào Form
int append (String string) Thêm một biến String vào Form
void delete (int itemNum) Xoá một Item khi biết chỉ mục của nó
void insert (int itemNum, Item item) Chèn một Item vào vị trí chỉ mục cho trước
Item getItem (int ItemNum) Lấy một biến Item khi biết chỉ mục của nó
void set (int itemNum, Item item) Thay biến Item ở chỉ mục cho trước bằng
biến Item mới
43
SV
ne
t.vn
Java Mobile
void setItemStateListener(
ItemStateListener iListener)
Thêm biến Listener vào Form
int size () Lấy số Item trong Form
Bảng 4.2 Lớp Form
44
SV
ne
t.vn
Java Mobile
4.3. Item:
Một Item là một thành phần có thể thêm vào Form. Các lớp con của Item gồm:
ChoiceGroup, DateField, TextField, Gauge, ImageItem và StringItem.
Item thường được dùng chung với lớp ItemStateListener. Khi muốn bắt sự kiện
của 1 Item, ta chỉ cần kết buộc Item đó với 1 biến listener thuộc lớp
ItemStateListener. Biến listener này sẽ lắng nghe các sự kiện và tự gọi phương thức
itemStateChanged() khi Item kết buộc với nó có sự thay đổi. Trong phương thức
này, ta có thể viết xử lý cho các sự kiện cần bắt của Item.
Vd: tạo 1 DateField cho Form và gắn biến listener để bắt sự kiện:
private Form fmMain;
private DateField fdToday;
...
fmMain = new Form (“Core J2ME”);
dfToday = new DateField (“Today: ”, DateField.DATE);
...
public void itemStateChanged(Item item) {
if (item == dfToday)
//xử lý
}
Các phương thức và chức năng tương ứng của lớp Item:
Lớp Item: javax.microedition.lcdui.Item
Phương thức Chức năng
String getLabel () Lấy nhãn của Item
void setLabel (String label) Gán nhãn cho Item
Bảng 4.3 Lớp Item
45
SV
ne
t.vn
Java Mobile
4.3.1. DateField:
Dùng để hiển thị một đối tượng ngày giờ (java.util.Date) và cho phép người
dùng thay đổi giá trị ngày giờ này bằng các phím bấm của thiết bị di động. Giao
diện DateField dễ dùng, khi tạo mới một đối tượng DateField, ta có thể lựa chọn
cho phép người dùng chỉ thay đổi giá trị ngày tháng, giờ phút hay cả hai :
Hình 4.2 Giao diện đối tượng DateField
Các phương thức và chức năng tương ứng của lớp DateField:
Lớp DateField: javax.microedition.lcdui.Date
Phương thức Chức năng
DateField (String label, int mode) Khởi tạo một đối tượng DateField
DateField (String label, int mode,
TimeZone timeZone)
Khởi tạo một đối tượng DateField với
múi giờ cho trước
Date getDate () Lấy giá trị ngày tháng của đối tượng
void setDate (Date date) Gán giá trị ngày tháng của đối tượng
int getInputMode () Lấy thông tin kiểu nhập liệu
void setInputMode () Gán kiểu nhập liệu
Bảng 4.4 Lớp DateField
Có thể chọn 1 trong 3 kiểu nhập liệu cho đối tượng DateField:
• DATE: chỉ cho phép người dùng thay đổi giá trị ngày tháng
• TIME: chỉ cho phép người dùng thay đổi giá trị giờ phút
46
SV
ne
t.vn
Java Mobile
• DATE_TIME: cho phép người dùng thay đổi giá trị cả ngày tháng lẫn
giờ phút
VD:
//tạo 1 biến DateField cho phép người dùng nhập ngày tháng
DateField dfDate = new DateField(“Ngay thang”,DateField.DATE);
//gán ngày tháng hiện thời cho biến dfDate
dfDate.setDate(new Date());
//cho phép người dùng thay đổi thông tin ngày tháng và giờ phút
dfDate.setInputMode(DateField.DATE_TIME);
....
//lấy thông tin ngày tháng của biến dfDate (thường để lấy giá trị mới mà người dùng vừa nhập )
Date dNewDate=new Date;
dNewDate=dfDate.getDate();
47
SV
ne
t.vn
Java Mobile
4.3.2. Gauge:
Gauge dùng để biểu diễn tiến độ hoàn thành một việc nào đó (download, upload...)
hoặc cấp độ từ thấp đến cao (của âm lượng, độ khó...). Gauge đặc trưng bởi hai giá
trị: giá trị hiện hành và giá trị cực đại cho phép. Giá trị hiện hành này luôn được duy
trì giữa 0 và giá trị cực đại. Gauge gồm hai dạng:
• Chế độ tương tác (Interactive mode): Trong chế độ này, đối tượng
Gauge sẽ được vẽ dạng các thanh song song có chiều cao tăng dần
biểu thị các cấp độ từ thấp đến cao. Người sử dụng có thể điều chỉnh
giá trị hiện thời của Gauge bằng các phím bấm. VD: điều chỉnh âm
lượng cao thấp.
Hình 4.3 Giao diện đối tượng Gauge chế độ tương tác
• Chế độ không tương tác (Non-interactive mode): Đối tượng được biểu
diễn dạng các thanh song song có chiều cao bằng nhau, người dùng
không được phép thay đổi giá trị của nó. Người lập trình sẽ lập trình
cho đối tượng này tự động cập nhật giá trị theo thời gian.
48
SV
ne
t.vn
Java Mobile
Hình 4.4 Giao diện đối tượng Gauge chế độ không tương tác
Các phương thức và chức năng tương ứng của lớp Gauge:
Lớp Gauge: javax.microedition.lcdui.Gauge
Phương thức Chức năng
Gauge (String label, boolean interactive,
int maxValue, int initValue)
Khởi tạo một đối tượng Gauge
int getValue () Lấy giá trị hiện thời của Gauge
void setValue (int value) Gán giá trị cho đối tượng Gauge
int getMaxValue () Lấy giá trị cực đại cho phép của Gauge
void setMaxValue (int maxValue) Gán giá trị cực đại cho phép cho
Gauge
boolean isInteractive () Kiểm tra Gauge có thuộc chế độ tương
tác không
Bảng 4.5 Lớp Gauge
VD:
//tạo 1 biến Gauge cho phép người dùng điều chỉnh âm thanh (chế độ tương tác)
Gauge gVolume= new Gauge (“Volume”, true, 6, 2);
//gắn Gauge vào Form
fmMain.append(gVolume);
fmMain.setCommandListener(this);
49
SV
ne
t.vn
Java Mobile
//tạo 1 biến Gauge biểu diễn tiến trình Download (chế độ không tương tác):
Gauge gDownload = new Gauge(“Download Progress”, false, 20,1);
//gắn Gauge vào Form
fmMain.append(gDownload);
fmMain.setCommandListener(this);
//cập nhật giá trị liên tục cho Gauge bằng cách sử dụng 1 biến timer
//khoảng cách mỗi lần cập nhật là 1000 mili giây
Timer tTimer = new Timer();
DTTask ttTimerTask = new DTTask(); //class DTTask extends TimerTask
tTimer.scheduleAtFixedRate (ttTimerTask, 0, 1000);
//lớp DDTask được viết bên trong MIDlet
private class DTTask extends TimerTask{
public final void run () {
//nếu giá trị hiện tại của gDownload < giá trị cực đại thì tiếp tục tăng, không thì
dừng lại
if (gDownload.getValue() < gDownload.getMaxValue())
gDownload.setValue(gDownload.getValue()+1);
else
cancel(); //xoá bộ định thời
}
}
50
SV
ne
t.vn
Java Mobile
4.3.3. String Item:
Đối tượng StringItem dùng để hiển thị 1 đoạn văn bản lên màn hình. Người dùng
chỉ đựơc phép xem mà không được thay đổi nội dung đoạn văn bản này.
Các phương thức và chức năng tương ứng của lớp StringItem:
Lớp StringItem: javax.microedition.lcdui.StringItem
Phương thức Chức năng
StringItem (String label, String text) Khởi tạo một đối tượng StringItem
String getText () Lấy nội dung đoạn văn bản
void setText (String text) Gán nội dung đoạn văn bản cần hiển thị
Bảng 4.6 Lớp StringItem
Để lấy giá trị nhãn (label) hay thay đổi nội dung nhãn có thể dùng các phương thức
getLabel(), setLabel(String label) của lớp Item.
VD:
//tạo một đối tượng StringItem
StringItem siText = new StringItem(“User: ”, “John”);
//gắn vào form
fmMain.append(siText);
...
//sau đó muốn hiển thị 1 nội dung khác, chỉ cần thay đổi label và text của đối tượng,
//không cần tạo 1 đối tượng StringItem mới.
siText.setLabel(“UserID: ”);
siText.setText(“12345”);
51
SV
ne
t.vn
Java Mobile
Hình 4.5 Giao diện đối tượng StringItem
Đối tượng lớp String cũng có thể append() vào Form để hiển thị 1 đoạn văn bản
nhưng không có hai phần nhãn và nội dung riêng biệt như StringItem. Tuỳ yêu cầu
của chương trình mà người lập trình có thể lựa chọn đối tượng phù hợp để sử dụng.
52
SV
ne
t.vn
Java Mobile
4.3.4. TextField:
Lớp TextField được sử dụng khi ứng dụng cần người dùng nhập liệu. Không chỉ
nhập dữ liệu text mà còn có thể nhập số, password, địa chỉ... Để hỗ trợ cho người
lập trình, MIDP đã định nghĩa sẵn một số các ràng buộc (constraints) để đối tượng
tự động kiểm tra tính hợp lệ của dữ liệu nhập vào. Các ràng buộc này là các hằng
lớp của lớp TextField gồm:
o EMAILADDR: người dùng chỉ được phép nhập dữ liệu đúng chuẩn
của một địa chỉ email.
o NUMERIC: chỉ được phép nhập số (có thể là âm hay dương), nếu
muốn giới hạn các giá trị được phép nhập thì ứng dụng phải tự xử lý.
o PASSWORD: dữ liệu nhập vào sẽ đựơc hiển thị lên màn hình với
dạng các dấu *.
o PHONENUMBER: dữ liệu nhập phải đúng chuẩn của số điện thoại.
o URL: dữ liệu nhập phải có dạng 1 URL
và có thể được sử dụng khi kiểm tra ràng buộc cho đối tượng TextBox. Các ràng
buộc này được biểu diễn với dạng một số nguyên kiểu int, giá trị được đề cập trong
bảng sau:
Tên ràng buộc Giá trị Biểu diễn nhị phân
ANY 0 00000000 00000000 00000000
EMAILADDR 1 00000000 00000000 00000001
NUMERIC 2 00000000 00000000 00000010
PHONENUMBER 3 00000000 00000000 00000011
URL 4 00000000 00000000 00000100
PASSWORD 65536 (0x10000) 00000001 00000000 00000000
CONSTRAINT_MASK 65635 (0xFFFF) 00000000 11111111 11111111
Bảng 4.7 Các Ràng Buộc của TextField
Các giá trị của ràng buộc là các số nguyên liên tục nên các ràng buộc này phải sử
dụng độc lập, không được kết hợp với nhau vì có thể gây sai sót.
53
SV
ne
t.vn
Java Mobile
Vd: TextField.EMAILADDR | TextField.NUMERIC
= 00000000 00000000 00000001
OR 00000000 00000000 00000010
-----------------------------------------
= 00000000 00000000 00000011
= TextField.PHONENUMBER
Ngoại trừ PASSWORD có thể kết hợp với một trong các ràng buộc còn lại bằng
toán tử OR mà không gây nhầm lẫn cho chương trình.
Vd: TextField.ANY | TextField.PASSWORD
= 00000000 00000000 00000000
OR 00000001 00000000 00000000
-----------------------
Các file đính kèm theo tài liệu này:
- [LVIT009] - Nghiên cứu JAVA MOBILE va XD ứng dụng minh họa.pdf