1. Trang chủ
  2. » Luận Văn - Báo Cáo

LẬP TRÌNH ỨNG DỤNG MOBILE BẰNG JAVA

156 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Ứng Dụng Mobile Bằng Java
Tác giả Nguyễn Công Hùng
Người hướng dẫn Tiến Sĩ Nguyễn Văn Hiệp
Trường học Trường Đại học Bách Khoa TP.HCM
Chuyên ngành Khoa học máy tính
Thể loại Luận văn tốt nghiệp
Năm xuất bản 2009
Thành phố TP.HCM
Định dạng
Số trang 156
Dung lượng 2,6 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • 1.1. t v n đ (6)
  • 1.2. M c tiêu đ t ra cho đ t ài (7)
  • 1.3. N i dung (8)
  • 2.1. CÁC THÀNH PH N C A J2ME (9)
    • 2.1.1. T ng ph n c ng thi t b (Device Hardware Layer) (10)
    • 2.1.2. T ng máy o Java (Java Virtual Machine Layer) (10)
    • 2.1.3. T ng c u hình (Configuration Layer) (12)
    • 2.1.4. T ng hi n tr ng (Profile Layer) (14)
    • 2.1.5. M t s h n ch c a J2ME so v i các phiên b n khác(ch y u n m t ng (14)
  • 2.2. CH C N NG CÁC THÀNH PH N (15)
    • 2.2.1. Máy o Java (Kilobyte Virtual Machine - KVM) (15)
    • 2.2.2. CLDC (17)
      • 2.2.2.1. Yêu c u ph n c ng dành cho CLDC (18)
      • 2.2.2.2. Yêu c u ph n m m dành cho CLDC (19)
      • 2.2.2.3. S khác bi t gi a CLDC 1.0 và CLDC 1.1 (19)
      • 2.2.2.4. Danh sách các l p mà CLDC cung c p (19)
    • 2.2.3. MIDP (22)
      • 2.2.3.1. nh ngh a (22)
      • 2.2.3.2. Nh ng ch c n ng mà MIDP không h tr (22)
      • 2.2.3.3. Nh ng ch c n ng mà MIDP cung c p (23)
      • 2.2.3.4. Nh ng yêu c u dành cho MIDP (23)
      • 2.2.3.5. Các d ng profile (24)
      • 2.2.3.6. S khác nhau gi a MIDP 1.0 và MIDP 2.0 (24)
      • 2.2.3.7. Danh sách l p mà MIDP cung c p (25)
  • 3.1. NH NGH A (28)
  • 3.2. CÁC D NG MIDLET (28)
    • 3.2.1. ng d ng đ n (standalone application) (28)
    • 3.2.2. ng d ng n i m ng (networked application) (28)
  • 3.3. C U TRÚC M T B MIDLET (MIDlet suite) (28)
    • 3.3.1. C u trúc file Jar (28)
    • 3.3.2. File JAD (Java Application Descriptor File) (29)
      • 3.3.2.1. t t (29)
      • 3.3.2.2. Các ph ng th c trong MIDlet (31)
      • 3.3.2.3. Xây d ng m t ng d ng MIDlet (31)
      • 3.3.2.4. L p MIDlet (33)
  • 4.1. QU N LÝ VI C H I N TH V À B T S KI N (37)
    • 4.1.1. Qu n lý vi c hi n th (37)
      • 4.1.1.1. L p Display (37)
      • 4.1.1.2. L p Displayable (38)
    • 4.1.2. Qu n lý các s ki n (39)
      • 4.1.2.1. Command và CommandListener (40)
      • 4.1.2.2. Item và ItemStateListener (43)
  • 4.2. GIAO DI N H A C P CAO (44)
    • 4.2.1. Screen (44)
    • 4.2.2. Form (44)
    • 4.2.3. Item (45)
      • 4.2.3.1. DateField (46)
      • 4.2.3.2. Gauge (47)
      • 4.2.3.3. StringItem (49)
      • 4.2.3.4. TextField (49)
      • 4.2.3.5. ChoiceGroup (52)
      • 4.2.3.6. Image (55)
      • 4.2.3.7. ImageItem (56)
    • 4.2.4. TextBox (58)
    • 4.2.5. Alert (60)
    • 4.2.6. AlertType (62)
    • 4.2.7. List (63)
      • 4.2.7.1. Các d ng c a list (63)
      • 4.2.7.2. B t s ki n cho các đ i t ng List (64)
      • 4.2.7.3. So sánh gi a l p List và l p ChoiceGroup (64)
    • 4.2.8. Ticker (66)
  • 4.3. H A C P TH P (66)
    • 4.3.1. Canvas (67)
      • 4.3.1.1. H t a đ (67)
      • 4.3.1.2. V trên đ i t ng Canvas (68)
      • 4.3.1.3. B t s ki n trong các đ i t ng Canvas (70)
      • 4.3.1.4. Game action (72)
    • 4.3.2. Graphics (74)
      • 4.3.2.1. Color (75)
      • 4.3.2.2. Nét v (76)
      • 4.3.2.3. Font ch (78)
      • 4.3.2.4. V các đ i t ng hình nh (Image) (80)
      • 4.3.2.5. Các ph ng th c t nh ti n c a đ i t ng (81)
      • 4.3.2.6. Vùng xén (Clipping regions) (83)
  • 5.1. L u tr thông tin v i RMS (84)
    • 5.1.1. RecordStore (85)
    • 5.1.2. RecordEnumeration (93)
    • 5.1.3. S p x p các b ng RecordComparator (95)
    • 5.1.4. L c record v i RecordFilter (97)
    • 5.1.5. RecordListener (98)
  • 5.2. K t n i m ng v i Generic Connection Framework (GCF) (99)
    • 5.2.1. Gi i thi u GCF (99)
  • 6.1. Tìm hi u và trình bày qui trình k thu t đ xây d ng m t ng d ng mobile trên Jbuilder. 117 1. Cài đ t Jbuilder (119)
    • 6.1.2. Cài đ t SDK cho Nokia (123)
    • 6.1.3. Quá trình xây d ng 1 MIDlet (129)
      • 6.1.3.1. Quá trình đ u tiên: T o m i m t project (129)
      • 6.1.3.2. Quá trình th hai: T o m t l p MIDlet (133)
    • 6.1.4. Các b c đ xây d ng các file.Jar và file.Jad (139)
  • 6.2. Tìm hi u v à trình bày các yêu c u r àng bu c đ m t ng d ng mobile tr ên (143)
    • 6.2.1. Nh ng ràng bu c trên thi t b di đ ng (143)
      • 6.2.1.1. Ràng bu c v ph n c ng (143)
      • 6.2.1.2. Ràng bu c v ph n m m (144)
    • 6.2.2. Nh ng ràng bu c đ i v i ng d ng (144)
  • 7.1. Gi i thi u (145)
  • 7.2. Xây d ng m t MIDlet (145)
  • 7.3. Mô t ch ng tr ình (145)
  • 7.4. Các ch c n ng c a ch ng trình (146)
  • 7.5. Th c thi ch ng tr ình (147)
  • 8.1. K t qu (152)
  • 8.2. Nh ng h n ch (152)

Nội dung

T ng máy o Java Java Virtual Machine Layer .... File JAD Java Application Descriptor File : .... Các ph ng th c trong MIDlet ..... Command và CommandListener.. Bookmark not defined.. Boo

t v n đ

Máy tính để bàn (PC) vẫn là nền tảng cho các tác vụ hiệu năng cao, trong khi máy tính xách tay (laptop) đang nổi lên nhờ tính di động và sự linh hoạt trở thành lựa chọn ưu tiên của nhiều người Thiết bị di động ngày nay rất phong phú và phổ biến tại Việt Nam, đặc biệt là điện thoại di động, cho phép người dùng nghe nhạc, xem phim, chụp ảnh, chơi game và thậm chí xem TV chỉ bằng một thiết bị nhỏ gọn bên người Thiết bị di động không chỉ là kênh liên lạc mà còn mang lại thế giới giải trí và các chức năng tiện ích ngày càng phong phú Với sự phát triển nhanh của công nghệ, nhu cầu về các tính năng cao cấp đi kèm trên các dòng sản phẩm di động ngày càng tăng và thúc đẩy các nhà sản xuất liên tục nâng cấp mẫu mã và tích hợp nhiều chức năng mới Tuy nhiên, thị trường hiện nay quá đa dạng về thiết kế và công nghệ giữa các nhà sản xuất, khiến việc tạo ra trải nghiệm nhất quán trên mọi dòng sản phẩm di động trở nên thách thức Đây cũng là khó khăn đối với các nhà phát triển phần mềm khi chưa có một chuẩn hóa chung cho hệ sinh thái di động, dẫn đến sự phân mảnh và yêu cầu tối ưu hóa phần mềm cho nhiều kiểu thiết kế khác nhau.

Java được hình thành từ ý tưởng xây dựng một ngôn ngữ lập trình có thể chạy trên mọi môi trường, với khẩu hiệu “viết một lần, chạy trên mọi nền tảng” Ban đầu Java được biết đến với phiên bản J2SE (Java 2 Standard Edition) và triết lý “Write once, run anywhere” nhằm cho phép viết mã một lần và chạy trên nhiều hệ điều hành khác nhau Java được phát triển dựa trên ý tưởng một ngôn ngữ có trình biên dịch duy nhất và có thể chạy trên môi trường ảo Java gọi là Java Virtual Machine (JVM) Các nhà phát triển tiếp tục cho ra ngôn ngữ J2ME (Java 2 Micro Edition) nhằm phục vụ phát triển phần mềm cho các thiết bị di động có nguồn lực hạn chế Ngôn ngữ J2ME có cú pháp ngắn gọn, dễ học và phù hợp với các thiết bị có giới hạn về bộ nhớ và hiệu suất Ngày nay, các thiết bị di động đang phổ biến và J2ME đã 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.

J2ME đ c xem nh 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 có b nh , kh n ng hi n th và x lý h n ch

M c tiêu đ t ra cho đ t ài

 Tìm hi u các ràng bu c v ph n c ng c a các ch ng lo i thi t b di đ ng hi n nay

 Hi u chi ti t v J2ME, các ki n trúc nên t ng c a nó và nh ng ng d ng c a nó đ l p trình trên các thi t b di đ ng

 N m đ c các k thu t x lý form, âm thanh, hình nh, và l u tr trên đi n tho i di đ ng

 Tìm hi u qui trình k thu t đ xây d ng ng d ng mobile trên Jbuilder

 Nh ng ràng bu c đ m t ng d ng vi t trên Jbuilder có th ch y trên mobile

 ng d ng các k t qu đ t đ c đ xây d ng ch ng trình đ n gi n, có các ti n ích ph c v nhu c u c a ng i s d ng đi n tho i di đ ng.

 Áp d ng thành công trên m t s dòng máy đi n tho i di đ ng h tr Java c a các hãng nh Nokia, SonyEricsson, Samsung,…

Những mục tiêu được đặt ra trong nhóm xây dựng một quy trình luân vận hoàn chỉnh đã được trình bày rõ ràng, đồng thời quá trình xã hội hóa luân vận cho thấy đầy đủ những nội dung cần thiết để mọi người có thể tự viết các ứng dụng riêng cho điện thoại của mình.

N i dung

V i nh ng m c tiêu trên thì quy n lu n v n xin trình bày nh ng n i dung sau:

 Gi i thi u chung v ngôn ng J2ME: t ng configuration và profile

 L p trình trên thi t b di đ ng s d ng giao di n đ h a c p th p và c p cao.

 Vi c l u tr thông tin trên MIDlet xu ng b ng ghi và truy xu t chúng khi c n thi t

 Các b c c n thi t đ xây d ng và th c thi m t MIDlet.

 Nh ng ràng bu c đ m t ng d ng vi t trên Jbuilder ch y đ c trên Mobile

 Xây d ng ng d ng game caro đ demo

CH NG 2: T NG QUAN V J2ME

 Trình bài nh ng thành ph n chính đ c u thành nên J2ME

 Ch c n ng c a các thành ph n này.

CÁC THÀNH PH N C A J2ME

T ng ph n c ng thi t b (Device Hardware Layer)

Đây chính là đặc điểm của các thiết bị di động: chúng có cấu hình phần cứng và khả năng xử lý khác nhau, dẫn đến sự khác biệt về tốc độ xử lý và dung lượng bộ nhớ Các thiết bị di động khác nhau do đó có thể yêu cầu mức tài nguyên xử lý khác nhau để chạy các ứng dụng Mục tiêu của J2ME là cung cấp một chuẩn chung cho tất cả các loại thiết bị di động, giúp phát triển và triển khai các ứng dụng di động trên nhiều nền tảng mà vẫn tương thích với sự đa dạng của phần cứng và khả năng xử lý.

T ng máy o Java (Java Virtual Machine Layer)

Java được biên dịch từ mã nguồn thành bytecode, và bytecode này được JVM (Java Virtual Machine) tải lên và thực thi trên nền máy tính JVM biến bytecode thành mã máy phù hợp với từng hệ thống, cho phép Java chạy trên nhiều nền tảng khác nhau mà vẫn giữ được hiệu năng JVM cung cấp các chức năng quan trọng như bảo mật, quản lý bộ nhớ với garbage collection và điều phối thực thi các tiến trình, đồng thời tận dụng công nghệ tối ưu hóa như JIT để cải thiện hiệu suất chạy ứng dụng Java.

Trang này cung cấp một chuẩn hóa cho các thiết bị di động chạy J2ME sau khi đã biên dịch và có thể hoạt động trên mọi thiết bị di động nào có J2ME KVM Chính những hạn chế và yêu cầu về phần cứng, phần mềm của các thiết bị di động được nêu ra nhằm đáp ứng và tối ưu cho môi trường KVM Đây là những yêu cầu dành cho máy ảo KVM:

 Máy o Java ch c n 40 – 80 KB b nh

 Có th ch y v i b vi x lý 16 bit và xung nh p 25 MHz

Mã ngu n java ph i trãi qua 2 giai đo n nh hình bên d i.

Hình 3: Hai quá trình biên dch và thông dch c a mã ngu n java.

Java được giới thiệu lần đầu vào những năm 1995, ban đầu mục tiêu của Java là phát triển GUI, applets và các ứng dụng chạy trên trình duyệt Hai năm sau khi ra mắt, phiên bản Java 2 được giới thiệu dưới tên Java 2 Enterprise Edition (J2EE) nhằm hỗ trợ phát triển các ứng dụng có quy mô lớn, có thể xem như dành cho các máy chủ Phiên bản này cung cấp công cụ cho truy cập dữ liệu, quản lý thông tin và điều phối việc thực thi, hỗ trợ lập trình viên triển khai các ứng dụng doanh nghiệp phức tạp.

Java 2 Micro Edition (J2ME) là phiên bản Java được bổ sung cho dòng ngôn ngữ Java, mở ra khả năng phát triển ứng dụng cho các thiết bị có nguồn lực hạn chế và giới hạn xử lý, như TV set-top boxes và điện thoại di động J2ME cung cấp các công cụ và API nhắm tới tối ưu hóa bộ nhớ và hiệu suất, giúp các nhà phát triển triển khai ứng dụng di động và nhúng một cách hiệu quả trên các nền tảng Java Với J2ME, lập trình viên có thể xây dựng các ứng dụng nhúng cho các thiết bị giải trí và thông tin tại gia đình, mở rộng phạm vi ứng dụng Java trên nhiều loại thiết bị.

Hình 4: Các phiên b n khác nhau c a java.

Chúng ta có nhiều phiên bản Java và các máy ảo (JVM) được thiết kế để chạy trên các môi trường khác nhau nhằm tối ưu hóa hiệu suất và quản lý tài nguyên Hình 3 máy ảo được sử dụng phổ biến trong nhiều môi trường khác nhau cho thấy sự đa dạng của JVM HotSpot VM, do Sun phát triển, là một loại máy ảo Java có khả năng tối ưu hóa và thực thi các đoạn mã nóng (hotspots) ngay trong thời gian chạy nhờ công nghệ Just-In-Time (JIT) và tối ưu hóa liên tục, giúp nâng cao hiệu suất ở quy mô phiên bản Java hiện tại Compact Virtual Machine (CVM) và Kilobyte Virtual Machine (KVM) là những máy ảo nhẹ, được thiết kế để tối ưu hóa quá trình thực thi trong các hệ thống có tài nguyên hạn chế, nhằm đáp ứng yêu cầu tiết kiệm bộ nhớ và năng lượng trên các thiết bị nhúng và các môi trường hạn chế nguồn lực.

T ng c u hình (Configuration Layer)

CLDC (Connected Limited Device Configuration) là một phần của Java ME, định nghĩa một tập hợp giao diện ngôn ngữ và thư viện ngắn gọn để cho phép các chương trình Java chạy trên các thiết bị di động có nguồn lực hạn chế Sun Microsystems đã đưa ra khái niệm Configuration nhằm chuẩn hóa cách tổ chức môi trường thực thi Java trên nhiều loại thiết bị khác nhau Khái niệm này có mối liên hệ chặt chẽ với Java Virtual Machine (máy ảo Java), vì VM phải tương thích với các giới hạn và thư viện được định nghĩa trong Configuration để bảo đảm hoạt động ổn định trên thiết bị di động.

Trong Java, cấu hình (configuration) là tập hợp các thành phần và tính năng mà máy ảo Java phải hỗ trợ cho một cấu hình cụ thể Việc phân chia thành các cấu hình khác nhau dựa trên các yếu tố như khả năng quản lý bộ nhớ, khả năng xử lý, khả năng hiển thị và khả năng kết nối của các thiết bị Nhờ nhận diện và tối ưu các cấu hình này, nguồn tài nguyên được phân bổ hợp lý và hiệu suất hệ thống được cải thiện, đáp ứng tốt hơn nhu cầu của các thiết bị và ứng dụng khác nhau.

Các thiết bị có nguồn lực hạn chế có thể gặp tình trạng quá tải khi được cấp thêm hỗ trợ cho máy ảo, dẫn tới chậm hệ thống và tải thừa không cần thiết Với những thiết bị có khả năng cao hơn, ta có thể cấp thêm tài nguyên cho máy ảo để hỗ trợ công việc lập trình của các nhà phát triển và tăng hiệu quả kiểm thử Do đó, nhu cầu phân chia tài nguyên thành nhiều máy ảo và cấu hình (Configuration) phù hợp là yếu tố thiết yếu để tối ưu hóa hiệu suất và đảm bảo hệ thống hoạt động trơn tru.

Hi n nay Sun đã đ a ra hai lo i Configuration khác nhau:

 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)

Việc phân chia này mang tính tương đối và phụ thuộc vào ngữ cảnh, khi công nghệ hiện nay đang phát triển rất nhanh Sự phát triển liên tục này khiến khái niệm và phân loại các loại cấu hình (configuration) trở nên linh hoạt và đôi khi khó xác định Vì vậy, ranh giới giữa các loại cấu hình này càng trở nên không rõ ràng, đặt ra thách thức cho việc xác định đúng loại và tối ưu hóa các cấu hình phù hợp với từng tình huống.

Việc triển khai Java Virtual Machine (JVM) và tập hợp các lớp Java cần thiết nhằm cung cấp một môi trường cho các thiết bị J2ME Tuy nhiên, đối với các thiết bị có cấu hình hạn chế về bộ nhớ và sức mạnh xử lý, JVM không thể hỗ trợ đầy đủ các tính năng như máy ảo của J2SE; ví dụ, các thiết bị CLDC thường thiếu khả năng thực hiện các phép tính toán phức tạp, nên máy ảo CLDC không được yêu cầu hỗ trợ các kiểu dữ liệu float và double.

T ng hi n tr ng (Profile Layer)

T ng hi n tr ng hay MIDP (Hi n tr ng thi t b thông tin di đ ng-Mobile Information Device Profile) cung c p t p các API h u d ng h n cho l p trình viên

Hiện nay mục đích chính của hệ sinh thái di động là xây dựng trên nền tảng cấu hình và cung cấp nhiều API cho người dùng di động MIDP định nghĩa một tập API đặc thù cho các thiết bị di động, nhưng vẫn có thể có các profile và API khác ngoài MIDP được sử dụng cho người dùng di động Ví dụ, có thể có profile PDA định nghĩa các lớp và phương thức để truy cập các chức năng của PDA như lịch, danh bạ và sổ địa chỉ Cũng có thể có một profile định nghĩa các API cho việc tương tác với các thiết bị Bluetooth Thực tế, các profile và tập API đang được xây dựng và cập nhật Chuẩn PDA được định nghĩa qua JSR-75 và chuẩn Bluetooth API qua JSR-82, với JSR là viết tắt của Java Specification Request.

M t s h n ch c a J2ME so v i các phiên b n khác(ch y u n m t ng

Không hỗ trợ dữ liệu float: Việc xử lý số thực float đòi hỏi nhiều tài nguyên xử lý, và các thiết bị di động nói chung không có cấu hình phần cứng đặc biệt cho xử lý float Vì vậy trong J2ME chúng ta không khai báo biến float, không có mảng float, và các hàm cũng không nhận tham số hay trả về giá trị 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 handle,….tr c khi đ i t ng b

“phá h y” Tuy nhiên trong J2ME ,đ c i ti n vi c th c thi và gi m toàn b các yêu c u, CLDL lo i b h n đ i t ng finalize, đi u này có ngha là không có ph ng th c Object.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) C ng do nguyên nhân h n ch tài nguyê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, CLDC không h tr b t k java.lang.Error nào

 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 J2ME và J2ME, 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 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 vẫn có một sự khác biệt so với J2SE và J2EE ở chỗ quá trình Class Verify (kiểm tra hợp lệ) là yếu tố then chốt đảm bảo an toàn của Java Các lớp trước khi được nạp đều trải qua quá trình kiểm tra này nhằm bảo đảm tính hợp lệ và nguyên vẹn Đây là cơ chế quan trọng đảm bảo an ninh (security) cho môi trường Java Trong J2SE và J2EE, quá trình này thường chiếm một phần nhỏ tài nguyên và có thể lên đến khoảng 50 KB Còn ở J2ME, quá trình kiểm tra được chia thành hai giai đoạn.

Tiền kiểm tra (pre-verification) là bước chuẩn bị trước khi dữ liệu được nhập vào hệ thống Trong quá trình này, một phần mềm sẽ tự động bổ sung các tham số cần thiết vào file class Quá trình tiền kiểm tra giúp rút ngắn thời gian xử lý và giảm tải cho hệ thống ở giai đoạn kiểm tra thứ hai Sau khi hoàn tất tiền kiểm tra, file class sẽ tăng dung lượng khoảng 5%.

Kiểm tra trên thiết bị (In-device verification) là quá trình kiểm tra các file class khi được nạp lên thiết bị Công cụ kiểm tra trên thiết bị thực thi một loạt kiểm tra để xác nhận tính hợp lệ và an toàn của đoạn mã và các thành phần đóng gói Nếu phát hiện lỗi, hệ thống sẽ sinh báo cáo chi tiết và đề xuất biện pháp xử lý, đôi khi có thể tự động áp dụng các biện pháp tương ứng Quá trình này đòi hỏi ít bộ nhớ và tài nguyên hơn so với các phương án kiểm tra tương đương trong J2SE và J2EE.

CH C N NG CÁC THÀNH PH N

Máy o Java (Kilobyte Virtual Machine - KVM)

Vai trò của máy ảo Java (JVM) và KVM là biên dịch bytecode do trình biên dịch Java sinh ra thành mã máy tương thích với nền tảng mục tiêu; Chính KVM chuẩn hóa đầu ra của các chương trình Java cho các thiết bị di động khác nhau, mỗi thiết bị có CPU và tập lệnh riêng Nếu không có KVM, các ứng dụng Java phải được biên dịch thành tập lệnh cho từng loại thiết bị di động, khiến lập trình viên phải xây dựng nhiều đích cho mỗi thiết bị Vì vậy quá trình phát triển trở nên phức tạp và tốn công thực hiện; KVM giúp đơn giản hóa triển khai, tối ưu hoá quy trình phát triển và đảm bảo tính tương thích trên nhiều kiểu thiết bị Hình minh họa dưới đây mô tả tiến trình xây dựng MIDlet hoàn chỉnh và vai trò của KVM.

Hình 5: Ti n trình xây d ng m t MIDlet

 Xây d ng ng d ng trên IDE (Intergrated Development Environment - Môi tr ng phát tri n tích h p) ây là nh ng công vi c c a l p trình viên trên:

 B c đ u tiên là l p trình viên ph i t o mã ngu n Java, có th có nhi u t p tin (*.java) (v n đ này đ c trình bày trong ch ng 6)

 B biên dch Java (Java Compiler): Biên d ch mã ngu n thành mã bytecode

Ngôn ngữ Java được biên dịch từ mã nguồn thành mã bytecode Mã bytecode này sau đó được JVM (máy ảo Java) dịch sang mã máy để thực thi trên thiết bị Các tệp chứa mã bytecode được lưu trữ với đuôi class, và mỗi lớp Java sẽ tạo ra một tệp class riêng biệt.

 B ti n ki m tra (Preverifier): Ki m tra tính h p l c a mã bytecode

Trong J2ME, một yêu cầu bảo mật cốt lõi là bảo đảm mã bytecode chuyển đổi sang KVM hợp lệ và không truy cập vào các lớp hoặc môi trường ngoài giới hạn Vì vậy mọi lớp tải lên hệ thống phải trải qua kiểm tra trước khi có thể tải xuống và chạy trên thiết bị, nhằm ngăn chặn việc cài đặt mã độc và các hành vi xâm nhập Việc kiểm tra mã được xem là một phần của môi trường phát triển, giúp KVM hoạt động an toàn hơn và giảm thiểu rủi ro cho thiết bị người dùng.

B biên d ch và b ti n ki m tra java

B ti n ki m tra s gán nhãn l p b ng m t thu c tính (attribute) đ c bi t ch r ng l p đó đã đ c ti n ki m tra Thu c tính này t ng thêm kho ng 5% kích th c c a l p và s đ c ki m tra b i b ki m tra trên thi t b di đ ng.

L u ý: N u không có quá trình ti n ki m tra này thì thi t b di đ ng s t ch i ng d ng.

 Các hình nh c a ng d ng Hi n t i ch h tr t p tin *.png

 Các t p tin d li u có th đ c yêu c u b i ng d ng

 M t t p tin kê khai (manifest.mf) cung c p mô t v ng d ng cho b qu n lý ng d ng (application manager) trên thi t b di đ ng.

Sau khi đã gửi và kiểm tra mã lệnh trên trình giả lập (simulator), mã lệnh đã sẵn sàng được kiểm tra trên điện thoại di động và sau đó được phân phối cho người dùng bằng cách tải xuống ứng dụng ở định dạng tệp tin *.jar và cài đặt trên thiết bị di động — xem phần phân tích.

 B ti n ki m tra: B ti n ki m tra ki m tra t t c các l p đ u có m t thu c tính h p l đã đ c thêm vào b i b ti n ki m tra trên tr m phát tri n ng d ng

N u ti n trình ti n ki m tra th t b i thì ng d ng s không đ c download v thi t b di đ ng.

Quản lý ứng dụng trên thiết bị di động là quá trình điều phối và tối ưu hóa hoạt động của các ứng dụng, đồng thời quản lý việc lưu trữ mã nguồn và dữ liệu liên quan trên thiết bị để đảm bảo hiệu suất và an toàn Quản lý ứng dụng cũng kiểm soát trạng thái của ứng dụng trong quá trình thực thi và có thể tạm ngừng hoặc đóng ứng dụng khi có cuộc gọi đến hoặc tin nhắn đến, nhằm duy trì nguồn lực hệ thống và cải thiện trải nghiệm người dùng.

 Ng i dùng th c thi ng d ng, b qu n lý ng d ng s chuy n ng d ng cho KVM đ ch y trên thi t b di đ ng.

 KVM s d ch mã bytecode sang ngôn ng máy c a thi t b di đ ng đ ch y.

CLDC

CLDC (Connected Limited Device Configuration) là một cấu hình nhẹ dành cho các thiết bị có tài nguyên hạn chế, chạy trên nền tảng KVM và là tập hợp các API lõi của J2ME Mục tiêu của CLDC là cung cấp một nền tảng tối giản để chạy ứng dụng Java trên thiết bị di động, thông qua các API và các lớp profile liên quan nhằm tối ưu hóa khả năng thực thi Các API của CLDC được thiết kế để hoạt động hiệu quả trong môi trường di động và được phát triển phối hợp với 18 đối tác từ nhiều công ty khác nhau.

JCP (Java Community Process) Nhóm này giúp b o đ m r ng các API đ c đ nh ngh a s h u d ng và thi t th c cho c nhà phát tri n l n nhà s n xu t thi t b di đ ng

2.2.2.1 Yêu c u ph n c ng dành cho CLDC:

Khi đưa ra yêu cầu liên quan đến các thành phần và xem xét các chi tiết xử lý cùng với các phần mềm hiện có trên thiết bị di động, việc này vô cùng quan trọng để đảm bảo khả năng tương thích trên thị trường Mục tiêu là phục vụ đa dạng các thiết bị hiện có trên thị trường, vì vậy CLDC đưa ra các yêu cầu tối thiểu và không đặt ra yêu cầu cho các thành phần khác Yêu cầu tối thiểu để sử dụng CLDC như sau:

Dung lượng 128 kilobyte dành cho việc chạy JVM và các thư viện của CDLC Không phân biệt loại bộ nhớ lưu trữ (ROM, Flash, v.v.), nội dung trên thiết bị được bảo lưu lâu dài ngay cả khi nguồn điện bị ngắt Bản ghi này thường được gọi là bộ nhớ không mất dữ liệu khi ngắt nguồn (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 còn đ c g i là heap)

2.2.2.2 Yêu c u ph n m m dành cho CLDC:

 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 nh :

 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.2.2.3 S khác bi t gi a CLDC 1.0 và CLDC 1.1

Các đ c t c a JCP đ c gán các s JSR (Java Specification Request) Quy đ nh CLDC phiên b n 1.0 đ c gán s JSR – 30 và phiên b n 1.1 đ c gán s JSR – 139 D i đây là s khác bi t chính c a 2 phiên b n:

 Ki u s th c đ c h tr , 2 class Float và Double đ c đ a thêm vào trong CDLC 1.1 và đ ng th i c ng kèm theo nh ng ph ng th c h tr cho 2 class này

 Thi t k l i nh ng class Calendar/Date/TimeZone so v i J2SE.

 Nh ng thread hi n t i đã có ph ng th c Thread.getName() và chúng ta có th ng t chúng b i ph ng th c Thread.interrup()(2).

 Vi c b t l i đã tr nên d hi u h n, có đ a thêm vào m t l p m i đó là NoClassDefFoundError

Trong quá trình làm việc với các thư viện Java, có nhiều thay đổi không quá quan trọng nhưng đáng chú ý khi thêm các trường và phương thức mới như Boolean.TRUE và Boolean.FALSE, String.intern(), Date.toString(), và Random.nextInt(int n) Những cập nhật này ảnh hưởng tới cách kiểm tra giá trị boolean, tối ưu hoá xử lý chuỗi, đại diện ngày tháng và sinh số ngẫu nhiên, đồng thời giúp mã nguồn trở nên nhất quán và hiệu quả hơn trong các ứng dụng.

 Vùng nh nh nh t đ c nâng lên t 160 – 192 kilobyte, ch y u là do thêm vào ki u s th c.(4)

2.2.2.4 Danh sách các l p mà CLDC cung c p

Bên d i đây là các l p n m trong CLDC:

MIDP

2.2.3.1 nh ngh a: ây là t ng n m k trên t ng CLDC, đ nh ngha dành riêng cho các thi t b di đ ng và là thành ph n chính trong J2ME CLDC ch cung c p các API đ n gi n, gi v n u mà Sun không cung c p MIDP thì ng i l p trình s ph i xây d ng l i t t c các giao di n MIDP cung c p các ch c n ng c b n cho h u h t các dòng thi t b di đ ng ph bi n nh t nh các máy đi n tho i di đ ng và các máy PDA Tuy nhiên, vì ph i xây d ng th vi n cho m t thi t b r t h n ch v tài nguyên nên MIDP c ng có nh ng gi i h n c a nó

2.2.3.2 Nh ng ch c n ng mà MIDP không h tr :

Phép tính dấu phẩy động (floating point) không được hỗ trợ ở nhiều hệ thống vì nó đòi hỏi lượng tài nguyên CPU rất lớn; việc thực hiện các phép tính này có thể làm tăng tải và gây tắc nghẽn nguồn lực trên các lõi xử lý, ảnh hưởng tới hiệu suất tổng thể Đặc biệt trên các thiết bị di động hoặc nền tảng giới hạn, việc phân bổ CPU cho các phép tính floating point có thể không khả thi hoặc không được tối ưu Vì vậy, các giải pháp tối ưu hóa thường thay thế bằng các phương pháp số học đơn giản hơn, hoặc chuyển sang số học cố định (fixed-point) và các kỹ thuật ước lượng nhằm tiết kiệm tài nguyên và đảm bảo hoạt động ổn định.

 Không h tr b n p class - Class Loader

 H tr t khóa finalize() nh trong J2SE: Vi c “d n d p“ tài nguyên tr c khi nó b xóa đ c đ y v phía các l p trình viên

 Không h tr nhi u cho thao tác b t l i

 Ph n l n các th vi n API cho Swing và AWT không th s d ng đ c trong MIDP

J2ME không hỗ trợ đầy đủ các tính năng quản lý file và thư mục, khiến việc lưu trữ và tổ chức dữ liệu trên các thiết bị Java 2 Micro Edition gặp khó khăn và đòi hỏi các giải pháp bổ sung Tuy nhiên, điều này không có nghĩa bạn phải mất dữ liệu mỗi khi tắt máy; Sun Microsystems đã cung cấp một công nghệ khác mang tên Record Management System (RMS), cho phép quản lý và lưu trữ dữ liệu một cách hiệu quả trên các thiết bị J2ME.

2.2.3.3 Nh ng ch c n ng mà MIDP cung c p

Trong Java, các lớp và kiểu dữ liệu phổ biến được phân loại và thể hiện qua các ví dụ thực tế thuộc gói java.util Những lớp quen thuộc như Stack, Vector và Hashtable là một phần của bộ sưu tập cổ điển (legacy collections) và vẫn được dùng trong một số ngữ cảnh nhất định Enumeration thể hiện cách duyệt phần tử theo kiểu cũ trước khi có các cơ chế duyệt hiện đại với Iterator và các API mới của Collection Hiểu rõ sự khác biệt về hiệu suất, cách quản lý bộ nhớ và khả năng đồng bộ hóa của các lớp này giúp lập trình viên nhận diện khi nào nên dùng các API hiện đại như ArrayList, HashMap và Iterator để tối ưu hóa mã nguồn và tương thích với Java ở các phiên bản sau này.

 H tr đ i t ng Display: úng nh tên g i m t ch ng trình MIDP s h tr duy nh t m t đ i t ng Display là đ i t ng qu n lý vi c hi n th d li u trên màn hình đi n tho i

 H tr Form và các giao di n ng i dùng

 Cung c p tính n ng Record Management System (RMS) cho vi c l u tr d li u

 Ngoài ra vào tháng 11 n m 2003 Sun đã tung ra MIDP 2.0 v i hàng lo t tính n ng khác đ c cung c p thêm so v i b n 1.0 Nh ng c i ti n n i b t so v i MIDP 1.0

2.2.3.4 Nh ng yêu c u dành cho MIDP

 Màn hình ít nh t ph i có 96 x 54 pixels.

 Có ít nh t 128 kilobytes b nh non-volatile đ ch y các thành ph n c a MIDP.

 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).

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 và chuy n d li u đó cho máy o Java.

Trong thiết kế hệ điều hành, nó phải hỗ trợ việc thao tác và ghi dữ liệu vào bộ nhớ non-volatile, nhằm đảm bảo dữ liệu được lưu trữ bền vững Không đòi hỏi hệ điều hành phải định nghĩa một hệ thống file riêng, nhưng nó phải cho phép ghi dữ liệu ở dạng persistent để dữ liệu không bị mất khi mất nguồn điện hoặc khi tắt máy.

 Ph i h tr truy xu t m ng, đ c bi t ph i có tính n ng đ c và ghi d li u thông qua m ng không dây.

MIDP (Mobile Information Device Profile) định nghĩa các API cho các thành phần giao diện người dùng, nhập liệu và xử lý sự kiện, luồng dữ liệu, 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 CLDC Ngoài ra, còn có một số Profile tiêu biểu khác.

 PDA Profile: t ng ng MIDP, nh ng v i th tr ng là các máy PDA v i màn hình và b nh l n h n.

 Foundation Profile: cho phép m r ng các tính n ng c a CDC v i ph n l n các th vi n c a b Core Java 2 1.3.

 Ngoài ra còn có Personal Basis Profile, Personal Profile, RIM Profile,

L u ý: 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.

2.2.3.6 S khác nhau gi a MIDP 1.0 và MIDP 2.0

B ng 1: S c i ti n c a MIDP 2.0 so v i MIDP 1.0

M ng  H tr giao th c HTTPS, download qua m ng an toàn h n

Kiểm soát kết nối giữa thiết bị di động và máy chủ là yếu tố thiết yếu để bảo mật; ví dụ, các ứng dụng sẽ không thể kết nối tới máy chủ nếu không được sự cho phép của người dùng hoặc chủ sở hữu Ở lĩnh vực âm thanh, cần có thêm các API hỗ trợ multimedia Một trong những thành phần nổi bật của MIDP 2.0 là tập các API media của nó, được coi là một tập con cung cấp hỗ trợ âm thanh của Mobile Media API (MMAPI).

UI (Giao di n)  M r ng các tính n ng c a Form và Item

 C i ti n vi c b trí các công c

 Có th xây d ng các đi u khi n riêng

Game API trên MIDP 2.0 không chỉ dành cho lập trình viên game mà còn cho các nhà phát triển muốn khai thác các tính năng cao cấp Trong MIDP 1.0, các lập trình viên phải tự viết mã để quản lý hành động của nhân vật và đồ họa, khiến mã nguồn lớn và khó bảo trì Game API MIDP 2.0 tối ưu hóa bằng cách chia màn hình thành các lớp (layers), cho phép quản lý độc lập các thành phần như nền, đường đua và xe ô tô Ví dụ trong một game đua xe, màn hình có thể gồm một layer nền, một layer đường đua và một layer cho xe, xe có thể xuất hiện và di chuyển trên các layer khác mà vẫn được đồng bộ nhờ hệ thống quản lý layer của Game API.

V i Game API nhà phát tri n còn đ c cung c p các tính n ng nh qu n lý các thao tác bàn phím

Hình ảnh là một trong những nội dung chính trong hướng dẫn dành cho nhà phát triển MIDP, mô tả cách biểu diễn hình ảnh dưới dạng mảng số nguyên và cho phép MIDlet thao tác với dữ liệu hình ảnh một cách trực tiếp.

2.2.3.7 Danh sách l p mà MIDP cung c p.

 Danh sách các l p ti n ích

 Danh sách các l p giao di n.

 javax.microedition.lcdui.Choice (interface)

 javax.microedition.lcdui.CommandListener (interface)

 javax.microedition.lcdui.ItemStateListener (interface)

 Danh sách các l p ng d ng

 Danh sách các l p v vi c qu n lý record

 javax.microedition.rms.RecordComparator (interface)

 javax.microedition.rms.RecordFilter (interface)

 javax.microedition.rms.RecordListener (interface)

 javax.microedition.io.Connection (interface)

 javax.microedition.io.ContentConnection (interface)

 javax.microedition.io.Datagram (interface)

 javax.microedition.io.DatagramConnection (interface)

 javax.microedition.io.HttpConnection (interface)

 javax.microedition.io.InputConnection (interface)

 javax.microedition.io.OutputConnection (interface)

 javax.microedition.io.StreamConnection (interface)

 javax.microedition.io.StreamConnectionNotifier (interface)

NH NGH A

Các ng d ng MIDP đ c g i là các MIDlet.

CÁC D NG MIDLET

ng d ng đ n (standalone application)

ây là ng d ng đ c n p hoàn toàn vào thi t b và có th ch y b t k lúc nào thi t b đ c m , không yêu c u tài nguyên bên ngoài Lo i này bao g m:

 Các ng d ng PDA và ng d ng organizer nh s đ a ch , danh sách công vi c và lch h n.

 Các công c đ n gi n nh máy làm tính (calculator)

ng d ng n i m ng (networked application)

Kiến trúc hệ thống được chia thành tối đa hai thành phần: một thành phần là client được triển khai trên thiết bị di động, và thành phần còn lại là máy chủ Thành phần client này ít được sử dụng nếu không có kết nối tới ít nhất một máy chủ trong hệ thống Máy chủ được triển khai trong môi trường J2EE và cung cấp dịch vụ qua Web hoặc các giao thức Internet khác.

C U TRÚC M T B MIDLET (MIDlet suite)

C u trúc file Jar

Ngoài các file class và resource, trong file jar còn có một tệp tin được gọi là manifest, đây là tệp mô tả nội dung và cách vận hành của jar Trong manifest, ta định nghĩa các thuộc tính của file jar và có tới sáu thuộc tính bắt buộc để cấu hình đúng cho quá trình chạy Các thuộc tính điển hình gồm Manifest-Version để xác định phiên bản của manifest, Main-Class để chỉ định lớp chính khi chạy ứng dụng Java, và Class-Path để nêu rõ đường dẫn tới thư viện phụ thuộc.

B ng 2: Các thu c tính trong t p tin JAR

MIDlet-Name Tên c a b MIDlet 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), và tên l p s đ c n p khi th c thi MIDlet này

Tên profile c n thi t đ ch y MIDlet này th ng là MIDP1.0 ho c MIDP2.0

Configuration c n đ ch y MIDlet (th ng Có là CLDC 1.0)

MIDlet-Icon File icon (.pgn) c a b MIDlet Không MIDlet-

URL a ch trang web nhà phát tri n MIDlet Không

L u ý: 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.

File JAD (Java Application Descriptor File)

Thông tin trong file JAD mô tả chi tiết các MIDlet được đóng gói trong file JAR và cho phép quản lý việc triển khai, kiểm tra tính tương thích và đảm bảo MIDlet có thể chạy trên thiết bị Dựa vào những dữ liệu này, người quản trị có thể xác định liệu các MIDlet có phù hợp để phát hành hoặc vận hành trên hệ thống hay không Bên cạnh đó, JAD còn cung cấp các tham số cấu hình cho MIDlet nhằm hạn chế việc thay đổi file JAR, giúp bảo vệ mã nguồn và đảm bảo sự toàn vẹn của ứng dụng khi phát triển và phân phối.

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

B ng 3: Các thu c tính trong t p tin JAD

MIDlet-Name Tên c a b MIDlet 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), và tên l p s đ c n p khi th c thi MIDlet này

URL a ch URL c a file Jar Có

MIDlet-Jar-Size Kích th c file Jar tính b ng byte Có

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)

Mô t MIDlet (d ng text) Không

Thông báo nh c nh khi xóa MIDlet Không

URL nh n thông báo v quá trình cài đ t Không ây là 4 thu c tính b t bu c gi ng nhau file Jad và file mainfest (n m trong file jar) :

L u ý: * N u các thu c tính này không gi ng nhau thì ng d ng s b t ch i.

* V i các thu c tính còn l i, n u file Jad và file mainfest khác nhau thì thu c tính trong file Jad s đ c u tiên h n.

3.3.2.2 Các ph ng th c trong MIDlet

Các chương trình MIDlet được khởi tạo và chạy theo vòng đời riêng của nền tảng Java ME, khác với chương trình trên máy tính để bàn vốn cần hàm main() để thực thi; do đó MIDlet không yêu cầu hàm main() Vòng đời MIDlet chủ yếu gồm các phương thức quan trọng như startApp() để khởi động và tiếp tục chạy, pauseApp() để tạm dừng khi cần thiết và destroyApp(boolean) để dọn dẹp và kết thúc ứng dụng, có thể gọi notifyDestroyed() khi quá trình kết thúc hoàn tất Dưới đây là danh sách các hàm thông dụng được dùng trong lập MIDlet.

B ng 4:Các ph ng th c trong MIDlet

L y giá tr c a các thu c tính có tên là key (ki u String) trong t p tin JAR ho c JAD. abstract void destroyApp(boolean unconditional)

Quản lý người dùng gọi phương thức pauseApp() để thực hiện các công việc thiết yếu như lưu dữ liệu và giải phóng tài nguyên khi người dùng đóng ứng dụng Phương thức này giúp bảo toàn trạng thái của ứng dụng, tối ưu hóa quản lý tài nguyên và ngăn ngừa rò rỉ bộ nhớ Việc triển khai pauseApp() đảm bảo quá trình tạm dừng diễn ra an toàn và đồng bộ với vòng đời người dùng, mang lại trải nghiệm người dùng ổn định và sẵn sàng khởi động lại khi người dùng quay lại.

Trong vòng đời MIDlet của Java ME, các trạng thái và hành động của ứng dụng được quản lý qua bốn phương thức chính: startApp(), notifyDestroyed(), notifyPaused() và resumeRequest() Phương thức startApp() được triển khai để khởi động MIDlet và thiết lập trạng thái ban đầu khi người dùng mở game; notifyDestroyed() được gọi để thông báo cho trình quản lý nếu MIDlet kết thúc, giúp hệ thống giải phóng tài nguyên và đóng ứng dụng đúng quy tắc; notifyPaused() được kích hoạt khi MIDlet bị tạm dừng, cho phép hệ thống đăng ký trạng thái hiện tại và tối ưu hóa bộ nhớ; còn resumeRequest() được dùng để yêu cầu MIDlet tiếp tục từ trạng thái đã tạm dừng khi người dùng quay lại Hiểu rõ các phương thức này giúp tối ưu vòng đời MIDlet và cải thiện trải nghiệm người dùng.

3.3.2.3 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

In Java ME, a MIDlet is defined by extending the MIDlet class and implementing its three lifecycle methods—startApp(), pauseApp(), and destroyApp()—which govern the application's startup, pause, and termination behavior A minimal MIDlet demonstrates this lifecycle by showing the necessary import and class declaration, for example: import javax.microedition.midlet.*; public class ShowProperties extends MIDlet { }.

//Constructor là ph ng th c kh i t o (không b t bu c ph i có). public showProperties() { //…………}

// c apllication manager g i tr c khi th c thi MIDlet. public void startApp() throws MIDletStateChangeException

System.out.println("Vendor: " + getAppProperty("MIDlet-Vendor")); System.out.println("Description: " + getAppProperty("MIDlet-

System.out.println("JadFile Version: " + getAppProperty("JadFile-

System.out.println("MIDlet-Data-Size: " + getAppProperty("MIDlet- Data-Size"));

// c g i khi t m ng ng MIDlet. public void pauseApp(){ //…………}

// c g i tr c khi k t thúc ch ng trình public void destroyApp(boolean unconditional){ //………….}

Ví d ta có m t b MIDlet v i 2 t p tin sau:

N i dung c a t p tin MANIFEST.MF n m trong t p tin showProperties.jar:

MIDlet-Name: Show Properties MIDlet

MIDlet-Vendor: My Corporation Inc

MIDlet-Description: A simple property list example

MIDlet-Name: Show Properties MIDlet

MIDlet-Vendor: My Corporation Inc

MIDlet-Jar-URL: file://showProperties.jar

Khi ch y ch ng trình ví d trên thì ta s đ c.

Hình 7: Hi n th k t qu vi c truy xu t các thông tin trong t p tin Jar.

Nh đã đ c p, m i ng d ng trên di đ ng c a ta đ u có th k th a t l p MIDlet ây là m t l p tr u t ng (abstract) và đ 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

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.Hình bên d i s minh h a vòng đ i c a m t MIDlet.

Chúng ta s xem qua vòng đ i c a m t ng d ng MIDlet.

 Khi MIDlet đ c kích ho t m t đ i t nng đ c t o ra, hàm kh i t o đ c ch y và MIDlet r i vào tr ng thái Paused

 K ti p MIDlet di vào tr ng thái Active và trình qu n lý ng d ng s g i hàm startApp()

Trong khi MIDlet đang hoạt động, trình quản lý ứng dụng có thể trì hoãn bất kỳ chương trình nào đang thực thi bằng cách gọi hàm pauseApp() Chính cơ chế này đã đưa MIDlet vào trạng thái Paused Một MIDlet có thể tự đặt mình vào trạng thái Paused bằng cách gọi notifyPaused().

 Trong khi MIDlet đang tr ng thái d ng, thì trình qu n lý ng d ng có th g i startApp() đ đ t nó vào tr ng thái Active

Trong vòng đời MIDlet, trình quản lý ứng dụng có thể kết thúc một MIDlet bằng cách gọi destroyApp(), khi đó MIDlet bị hủy bỏ và sẽ không tiếp tục thực thi cho đến khi quá trình garbage collection (dọn dẹp bộ nhớ) hoàn tất Một MIDlet cũng có thể bị phá hủy bằng cách gọi notifyDestroyed(), thông báo cho hệ thống quản lý MIDlet rằng nó đã xong và có thể bị loại bỏ Cả hai cơ chế destroyApp() và notifyDestroyed() giúp quản lý tài nguyên hiệu quả và đảm bảo MIDlet kết thúc an toàn.

Qu n lý ng d ng g i các hàm pauseApp() destroyApp()

 Qu n lý vi c hi n th và b t s ki n trong J2ME.

MIDP h tr thi t k giao di n d i hai c p đ :

Giao diện cấp cao (high-level interfaces) là tập các thành phần được dùng cho các chương trình di động chạy trên MIDP Cấp này cung cấp sẵn các thành phần giao diện người dùng (widgets) như TextBox, ChoiceGroup và Alert, đồng thời hỗ trợ hiển thị chúng lên màn hình một cách trực quan và nhất quán Việc dùng các widget chuẩn giúp lập trình viên xây dựng giao diện người dùng nhanh chóng, giảm thiểu công đoạn thiết kế từ đầu và tập trung vào chức năng chính của ứng dụng di động.

Giao diện cấp thấp (low-level interfaces) được sử dụng trong các chương trình game và đóng vai trò nền tảng cho việc xử lý đồ họa cũng như sự kiện người dùng Các lớp giao diện cấp thấp cung cấp các phương thức để vẽ và cập nhật các đối tượng lên màn hình, bao gồm hỗ trợ hiển thị các hình cơ bản như điểm, đường thẳng và hình tròn, đồng thời bắt và xử lý các sự kiện nhấn phím từ bàn phím để điều khiển trò chơi.

T t c các l p h tr đ h a đ 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 9: S đ các l p trong giao di n đ h a.

B ng 5:Các đ i t ng trong giao di n đ h a.

Choice Cung c p m t giao di n đ qu n lý vi c l a ch n các m c. CommandListener Cho phép ta t o ra m t kh n ng nghe cho các s ki n m c cao

ItemStateListener Cho phép t o ra m t s ki n khi các Item có s thay đ i. Display Qu n lý vi c hi n th và các thi t b nh p c a h th ng. Font Ch a đ ng các đ i t ng font.

Image Cung c p l p cho vi c qu n lý hình nh (hình nh d ng

AlertType Cung c p m t l p tr giúp đ đ nh ngh a các ki u c nh báo mà chúng ta có th t o ra nh là: alarm, confirmation, error, info, warning

Displayable Cung c p m t l p trù t ng cho đ i t ng đ c hi n th Command Là m t l p tr u t ng ch m t hành đ ng trên giao di n. Screen Cung c p m t l p c s cho nh ng thành ph n đ h a m c cao.

Alert Cung c p m t màn hình c nh báo cho ng i dùng

List Hi n th m t đ i t ng ch a đ ng danh sách đ l a ch n. TextBox Cung c p m t đ i t ng dùng đ hi u ch nh text.

Form Cung c p m t màn hình đ c xem nh là m t b ch a m t ho c nhi u Item.

Item Cung c p m t l p c b n cho nh ng thành ph n mà chúng ta có th đánh d u trên Form

ChoiceGroup Cung c p m t thành ph n cho vi c th hi n danh sách đ c ch n.

DateField Cung c p m t thành ph n đ l y ngày mà ng i dùng nh p vào

Gauge Là m t thanh đ h a đ hi n th quá trình th c thi.

ImageItem Cung c p m t Item mà c ng có th là Image

StringItem Cung c p m t đ i t ng Item đ hi n th m t String

TextField Cung c p m t Item đ c s d ng đ hi u ch nh m t text. Ticker Cung c p m t Item đ cu n m t chu i text.

Canvas Cung c p m t l p c b n đ t o ra m t đ i t ng đ h a c p th p.

QU N LÝ VI C H I N TH V À B T S KI N

Qu n lý vi c hi n th

L p này đ m nhi m vi c cung c p giao di n cho ng i dùng nh p d li u vào và nhu c u xu t d li u ra màn hình Các đ t tr ng c a l p Display:

 L p này n m trong package javax.microedition.lcdui, l p này ch a h u h t 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

 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 l p MIDlet nên có th truy n vào con tr this

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….

Ví d : public class Vidu extends MIDlet

Display display = Display.getDisplay(this);

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;

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á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.

B ng 6: Các ph ng th c chính c a l p Displayable

Thêm m t đ i t ng Command vào đ i t ng Displayable Void removeCommand

Xóa b m t đ i t ng Command t đ i t ng DisplayableVoid setCommandListener Thêm CommandListener vào đ i t ng

(CommandListener l) Displayble boolean isShown() Ki m tra đ i t ng Displayable có đ c th hi n trên thi t b hay không?

Từ thời điểm này, ta có thể hình dung một Command như một nút điều khiển trong ngữ cảnh của ứng dụng CommandListener đóng vai trò nhận diện và chuyển các sự kiện người dùng kích hoạt Command tới trình xử lý tương ứng, từ đó điều phối và thực thi các hành động xử lý của hệ thống.

“b t” đ c các s ki n đ c chuy n t i khi ng i dùng kích h at 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==cmdExit) { destroyApp(true); notifyDestroyed();

Qu n lý các s ki n

Ngày nay, việc xử lý sự kiện là một trong những vấn đề quan trọng của mọi chương trình, vì hầu hết các ứng dụng đều có giao diện 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à điều bắt buộc để phần mềm hoạt động ổn định và mượt mà Quá trình xử lý sự kiện gồm ba bước cơ bản: nhận sự kiện từ người dùng hoặc hệ thống, phân phối và định tuyến sự kiện tới các handler thích hợp, và thực thi các hàm xử lý để cập nhật trạng thái và giao diện của ứng dụng.

 Ph n c ng ph i đ 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

 Ph n m m trên thi t b ph i nh n bi t có s ki n phát sinh.

Hướng dẫn vận hành và xử lý thông tin cùng với các sự kiện dành cho người dùng là nhiệm vụ của nhóm lập trình viên J2ME Tùy thuộc vào nội dung và tính chất của từng sự kiện, chúng ta sẽ đưa ra các giải pháp thích hợp nhằm tối ưu hóa trải nghiệm người dùng và đảm bảo tính nhất quán của dữ liệu trên nền tảng di động J2ME Các giải pháp được đề xuất sẽ phù hợp, hiệu quả và dễ tích hợp vào hệ thống hiện có.

Trong phần này chúng ta nghiên cứu các sự kiện phát sinh khi người dùng tương tác với các điều khiển giao diện cấp cao như Form và TextBox, cũng như các sự kiện liên quan đến hoạt động của các thành phần hiển thị và logic xử lý trong ứng dụng Các sự kiện này được liệt kê, mô tả ngắn gọn và gợi ý cách xử lý trong mã nguồn nhằm tối ưu hóa trải nghiệm người dùng và hiệu năng hệ thống Bạn sẽ tìm thấy các ví dụ điển hình minh họa cách xử lý sự kiện ở các tình huống thực tế và cách kết nối chúng với các thành phần khác của dự án Phần sau sẽ trình bày chi tiết từng sự kiện và các mẫu mã tham khảo để áp dụng ngay vào dự án của bạn.

Để xử lý sự kiện trong J2ME, ta cần cài đặt các listener để nhận diện các sự kiện phát sinh từ giao diện người dùng Trong J2ME có hai listener chính là CommandListener và ItemStateListener; CommandListener được thực thi qua hàm commandAction và ItemStateListener qua hàm itemStateChanged, đây là hai hàm quan trọng giúp nhận diện và xử lý các sự kiện xảy ra Trước khi đi sâu vào từng loại sự kiện, ta sẽ làm rõ hai tác nhân chính gây ra sự kiện là Command và Item.

Command là một khái niệm đại diện cho một hành động và sự kiện liên quan đến xử lý thông tin trong giao diện người dùng Nói một cách đơn giản, Command giống như một nút bấm (button) trên giao diện người dùng; khi người dùng nhấn nút đó, một sự kiện tương ứng được phát sinh và được xử lý để thực thi hành động mong muốn.

Ví dụ này cho thấy lệnh “Exit” thường liên kết với một nút trên thanh điều khiển, nhưng việc xem một lệnh gắn với nút ấy không phải lúc nào cũng phản ánh đúng cách lệnh được thực thi trong thực tế Khi kích thước màn hình giới hạn và số lượng lệnh hiển thị có thể bị thu gọn vào menu hoặc thanh công cụ, nhiều hành động sẽ được sắp xếp thành các tùy chọn menu và người dùng dễ hiểu nhầm phạm vi chức năng của từng nút Do đó, để đảm bảo người dùng nhận diện đúng chức năng, trước tiên cần phân tích các thao tác cần làm để thêm một command vào giao diện người dùng hoặc menu, từ đó tối ưu hóa nhãn và vị trí của lệnh sao cho chúng trực quan và nhất quán với hành vi mong muốn.

 T o m t command đ l u tr thông tin v event.

 Thêm command này vào Form, TextBox hay Alert…(nói chung là 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 s ki n đ c kích ho t, b listener s g i hàm commandListener() và truy n các thông tin v s ki n làm thông s cho hàm

Ví d public class TestCommand extends MIDlet implements CommandListener {

//t o m t command đ thoát kh i ng d ng. private Command cmdExit;

//kh i t o form. frmMain = new Form(“Core J2ME”);

// Kh i t o command. cmdexit = new Command(“Exit”, Command.Exit, 1); frmMain.addCommand(cmdExit); // Thêm command váo form frmMain.setCommandListener(this); // Thêm b listener cho form.

//Hàm dùng đ b t s ki n. public void commandAction(Command c, Displayable s) { if(c == cmdExit) // n u là command exit thì thoát ch ng trình { destroyApp(true); notifyDestroyed();

Ví dụ trên cho thấy cách tạo một command và xử lý nó một cách có hệ thống Ta cần chú ý thiết lập luồng xử lý và cài đặt một listener để lắng nghe các sự kiện; trong ví dụ này ta đã triển khai CommandListener và cung cấp hàm xử lý lệnh để xử lý các sự kiện liên quan đến lệnh.

Khi ta t o m t command có ba đ i s c n cung c p:

Ví d : cmdHelp = new Command(“Help”, Command.HELP, 1);

 Label: o n v n b n đ c xem nh nhãn c a command

Loại (type) cho phép hiển thị một lệnh gắn với nút mềm (soft-button) trên màn hình thiết bị Ví dụ, ta có một lệnh tên là help và nó được ánh xạ với nút HELP trên giao diện, giúp hiển thị trực quan và thuận tiện cho người dùng Thông số type thực hiện việc này bằng cách chọn Command.HELP Nếu màn hình không có nút help, thông số này không có ý nghĩa và lệnh sẽ được xử lý như các lệnh thông thường Tuy nhiên, cần lưu ý khi thiết lập type là Command.HELP vì việc chọn lệnh này không đồng nghĩa với hành động sẽ được thực thi trong hàm commandAction(); loại type này chỉ hỗ trợ ánh xạ và hiển thị các nút soft-button một cách dễ dàng cho người dùng.

B ng 7: Các ki u Type c a Command

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 thoát khỏi màn hình thông báo khi cần thiết Màn hình thông báo hiện không có các nút mềm (soft buttons) được gán với các lệnh điều khiển Việc hiển thị các lệnh sẽ phụ thuộc vào từng loại thiết bị, và có thể có các ví dụ minh họa cho từng trường hợp cụ thể.

STOP D ng m t công vi c đang th c hi n.

Trong lập trình MIDP, Priority của Command được dùng để xác định thứ tự hiển thị các lệnh trên giao diện người dùng khi chúng được hiển thị chung trong một menu Giá trị ưu tiên càng cao thì mức ưu tiên càng thấp, vì vậy các lệnh có ưu tiên thấp sẽ được hiển thị trước các lệnh có ưu tiên cao, và cách sắp xếp có thể là từ trái sang phải hoặc từ trên xuống dưới tùy thiết bị Đây là các thành phần chính liên quan đến lệnh Command và CommandListener, hai lớp nằm trong package javax.microedition.lcdui.

Các sự kiện không chỉ phát sinh từ kích hoạt commands mà còn từ các items; mỗi item là một thành phần có thể gắn lên form và có thể kích hoạt sự kiện khi người dùng tương tác Ví dụ, các item như ChoiceGroup, DateField, Gauge và TextField là các dạng khác nhau của Item, mỗi dạng có thể sinh ra các sự kiện riêng Chúng ta sẽ tìm hiểu các items này ở phần nâng cao Các item có thể không hiển thị như một thành phần của form, khác với các commands được sử dụng trong Form, TextBox, List và Canvas.

Khi thêm m mục item vào Form, hệ thống sẽ phát sinh các sự kiện và chúng ta cần gắn một Listener tên là ItemStateListener để xử lý chúng Mỗi khi có sự thay đổi trên một Item — ví dụ người dùng chọn một mục trong ChoiceGroup hoặc thay đổi dữ liệu của DateField — Listener sẽ nhận được thông tin về sự kiện và các dữ liệu liên quan Sự kiện này sẽ kích hoạt phương thức itemStateChanged() đã được cài đặt sẵn để xử lý phản hồi tương ứng.

Trong MIDP, các loại Item được hỗ trợ gồm ChoiceGroup, DateField, Gauge, ImageItem, StringItem và TextField; có một lưu ý: StringItem và ImageItem không sinh ra sự kiện khi người dùng tương tác dù chúng là lá con của lớp Item Chúng ta có thể gán một listener cho Form và khi một Item kích hoạt sự kiện, phương thức itemStateChanged() sẽ được gọi, tuy nhiên khi thay đổi giá trị của nhiều Item cùng lúc, itemStateChanged() có thể bị gọi nhiều lần Vì vậy cần có chiến lược xử lý sự kiện để giảm thiểu số lần gọi và tránh xử lý trùng lặp, từ đó tối ưu hiệu suất và đảm bảo phản hồi người dùng một cách ổn định.

 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 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.

B ng 8:Các hàm trong đ i t ng Item.

String getLabel() L y nhãn c a Item. void setLabel(String label) t nhãn cho label void itemStateChanged(Item item) c g i khi giá tr item thay đ i.

GIAO DI N H A C P CAO

Screen

Screen không được dùng trực tiếp với một đối tượng trong chương trình; nó đóng vai trò là container chứa các thành phần hiển thị trên màn hình như Textbox, List, Alert và Form Mỗi thành phần này chịu trách nhiệm trình bày dữ liệu và tương tác với người dùng trên giao diện Đây là điểm khác biệt khi so sánh với các lớp con của lớp Item ở phần sau, bởi Screen tập trung vào việc tổ chức và điều phối các thành phần hiển thị, còn các lớp con của Item sẽ đi sâu vào các đặc tính và hành vi riêng biệt của từng thành phần.

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

B ng 9:Các ph ng th c và ch c n ng c a l p Screen.

Void setTitle(String) 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.

Form

Form là một loại Displayable phổ biến trong các đối tượng giao diện Java ME, cho phép ghép nhiều trường dữ liệu vào một màn hình duy nhất Khi sử dụng TextBox, List hoặc Alert, người dùng có thể chỉ thấy một item tại một thời điểm, trong khi Form cho phép hiển thị nhiều item cùng lúc và có thể tổ chức chúng thành một form thống nhất Để làm điều này, ta tạo một Form và gắn vào đó các item như TextField, DateField, ChoiceGroup, Gauge, ImageItem, StringItem Form hỗ trợ quản lý các chức năng của màn hình và sẽ hiển thị đầy đủ các item; khi thiết bị không thể hiện hết mọi item trên một màn hình, Form cung cấp cơ chế cuộn hoặc phân trang để người dùng truy cập tất cả các item.

 Các ph ng th c c a l p Form

Trong bài viết này, chúng ta sẽ lập trình các phương thức để thêm, xóa và sửa các thành phần (Item) trong Form của một ứng dụng Java ME bằng lớp javax.microedition.lcdui.Form Khi thêm một thành phần vào Form, ta nhận được một tham chiếu đến đối tượng thành phần và có thể sử dụng tham chiếu đó để truy vấn, cập nhật dữ liệu hoặc thay đổi thuộc tính của thành phần trong Form Nhờ cơ chế tham chiếu này, ta có thể tra cứu thông tin, điều chỉnh nội dung hiển thị, thay đổi nhãn hoặc trạng thái của thành phần khi người dùng thao tác Dưới đây là bảng tổng hợp các phương thức và chức năng có sẵn của lớp Form, những phương thức này thuộc API javax.microedition.lcdui.Form.

B ng 10:Các ph ng th c và ch c n ng t ng ng c a l p Form

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 là một lớp quản lý danh sách biến với các phương thức được thiết kế để thêm, xóa, chèn và truy xuất dữ liệu ở nhiều kiểu khác nhau Cụ thể, append(Image image) thêm một biến Image vào Form; append(Item item) thêm một biến Item vào Form; và append(String string) thêm một biến String vào Form delete(int itemNum) xóa một Item tại vị trí chỉ định; insert(int itemNum, Item item) chèn một Item vào vị trí được xác định; getItem(int itemNum) lấy một Item tại vị trí chỉ định; và set(int itemNum, Item item) thay thế Item ở vị trí đó bằng Item mới Những thao tác này cho phép quản lý dữ liệu trong Form một cách linh hoạt và có tổ chức.

Void setItemStateListener(ItemStateListe ner iListener)

Thêm bi n Listener vào Form int size() L y s Item trong Form.

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:

Các lớp ChoiceGroup, DateField, TextField, Gauge, ImageItem và StringItem là những thành phần giao diện người dùng thường được dùng chung với ItemStateListener Khi muốn bắt sự kiện từ một Item, ta cần gắn một đối tượng ItemStateListener cho Item đó và sẽ nhận được sự kiện ItemStateChanged() khi Item có sự thay đổi Trong khuôn khổ phương thức xử lý này, ta có thể viết logic để xử lý các sự kiện của từng Item và cập nhật trạng thái hoặc thực thi các hành động phù hợp.

Ví d : T o 1 DateField cho Form và g n bi n listener đ b t s ki n: private DateField dfToday; frmMain = new Form(“Core J2ME”); dfToday = new DateField(“Today: ”, DateField.DATE); public void itemStateChanged(Item item)

B ng 11:Các ph ng th c và ch c n ng t ng ng c a l p Item.

Void setLabel(String label) Gán nhãn cho Item

Ta có thể hiển thị một đối tượng ngày giờ (java.util.Date) và cho phép người dùng chỉnh sửa giá trị ngày giờ này bằng các phím bàn phím Sử dụng giao diện DateField, khi khởi tạo DateField ta có thể cấu hình để người dùng được chỉnh sửa giá trị ngày tháng, giờ phút và thậm chí giây.

B ng 12: Các ph ng th c và ch c n ng t ng ng c a l p DateField

DateField (String label, int mode) Kh i t o m t đ i t ng DateField.

DateField (String label, int mode,

Kh i t o m t đ i t ng DataField v i múi gi cho tr c.

Date getDate () L y giá tr ngày tháng c a đ i t ng. int getInputMode () Gán giá tr ngày tháng cho đ i t ng. Void setDate (Date date) L y thông tin ki u nh p li u.

Void setInputMode (int mode) Gán ki u nh p li u.

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.

 DATE_TIME: cho phép thay đ i giá tr c ngày, tháng, gi , phút

Ví d : //T o 1 bi n DateField cho phép ng i dùng nh p ngày tháng

DateField dfDate = new DateField(“Ngày tháng ”, 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 nh p).

Date dNewDate = new Date(); dNewDate = dfDate.getDate();

Gauge được dùng để đo lường tiến độ hoàn thành một tác vụ nào đó (như download, upload) hoặc để thể hiện độ khó của tác vụ đó Gauge hiển thị hai giá trị: giá trị hiện hành và giá trị được cho phép Giá trị hiện hành được duy trì ở mức 0 và giá trị được cho phép xác định ngưỡng tối đa Gauge gồm hai đường: một đường thể hiện giá trị hiện tại và một đường thể hiện ngưỡng cho phép.

Chế độ tương tác (Interactive mode) của Gauge cho phép các thanh song song có chiều cao tăng dần hiển thị các cấp độ từ thấp đến cao và phản hồi ngay khi người dùng điều chỉnh giá trị Người dùng có thể điều chỉnh giá trị hiển thị của Gauge bằng các phím thao tác, ví dụ tăng hoặc giảm âm lượng hoặc thay đổi ngưỡng hiển thị, giúp quan sát mức độ một cách trực quan và nhanh chóng.

Trong chế độ không tương tác (Non-interactive mode), các thanh song song có chiều cao bằng nhau được hiển thị và người dùng không được phép chỉnh sửa giá trị của chúng 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.

B ng 13: Các ph ng th c c a l p Gauge

Gauge (String label, boolean interactive, int maxValue, int initialValue)

Kh i t o m t đ i t ng Gauge. int getMaxValue () L y giá tr c c đ i cho phép c a Gauge.

Gán giá tr c c đ i cho phép cho 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. boolean isInteractive () Ki m tra xem Gauge có thu c ch đ t ng tác không

Ví d : // T o m t bi n Gauge cho phép ng i dùng đi u ch nh âm thanh (dùng ch đ t ng tác).

Gauge gVolume = new Gauge(“Volume”, true, 6, 2);

// G n Gauge vào Form frmMain.append(gVolume); frmMain.setCommandListener(this);

// T o m t bi n Gauge bi u di n ti n trình Download (dùng ch đ không t ng tác)

Gauge gDownload = new Gauge(“Download Process”, false, 20, 1);

// G n Gauge vào Form frmMain.append(gDownload); frmMain.setCommandListener(this);

// C p nh t l i giá tr 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

DTTask ttTimeTast = new DTTask(); // class DTTask extends TimerTask tTime.sheduleAtFixedRate(ttTimerTask, 0, 1000);

// L p DDTask đ c vi t trong MIDlet. private class DDTask extends TimerTask

// n u giá tr hi n t i 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();// Xóa toàn b }

4.2.3.3 StringItem: 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

B ng 14: Các ph ng th c và ch c n ng t ng ng c a l p StringItem

StringItem là lớp đại diện cho một mục văn bản có nhãn (label) và nội dung (text) Nó được khởi tạo bằng constructor StringItem(String label, String text), cho phép thiết lập ngay nhãn và nội dung khi tạo đối tượng Phương thức getText() trả về nội dung văn bản đang được lưu trong đối tượng, trong khi setText(String text) cho phép gán nội dung văn bản mới cho đối tượng Bên cạnh đó, getLabel() trả về nhãn liên kết với đối tượng và setLabel(String label) cho phép thay đổi nhãn Nhờ các phương thức này, StringItem dễ dàng quản lý và cập nhật cả nhãn lẫn nội dung văn bản, phù hợp cho các tình huống hiển thị nội dung động trong giao diện người dùng hoặc danh sách phần tử.

StringItem siText = new StringItem(“User: ”, “John”);

// G n vào Form frmMain.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”);

L u ý: 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 thành ph n nhãn và n i dung riêng bi t nh

StringItem Tùy theo 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.

TextField được sử dụng khi người dùng nhập liệu trong các ứng dụng di động Không chỉ cho phép nhập dữ liệu dạng văn bản mà còn hỗ trợ các trường như số, mật khẩu và địa chỉ, đáp ứng đầy đủ nhu cầu của lập trình viên MIDP đã định nghĩa một tập hợp ràng buộc (constraints) nhằm kiểm tra tính hợp lệ của dữ liệu nhập vào và đảm bảo an toàn, đúng định dạng Các ràng buộc này cho thấy các loại kiểm tra mà TextField có thể áp dụng, từ độ dài tối đa, bộ ký tự cho phép đến mẫu (pattern) xác thực, giúp ngăn lỗi và tăng tính ổn định của ứng dụng.

 EMAILADDR: ng i dùng ch đ c phép nh p d li u đúng chu n c a m t đ a ch email.

 NUMERIC: ch cho 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ý.

 PASSWORD: d li u nh p vào s đ c hi n th lên màn hình có d ng d u *.

 PHONENUMBER: d li u nh p ph i đúng chu n c a s đi n tho i.

Và có th đ c s l p 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:

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.

Ví d : TextField.EMAILADDR | TextField.NUMERIC

Ngo i tr PASSWORD có th k p 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

Ví d : TextField.ANY | TextField.PASSWORD

MIDP cung cấp các giá trị CONSTRAINT_MASK để kiểm tra ràng buộc đã được áp dụng Bạn xác định ràng buộc nào đang được sử dụng bằng cách ghép giá trị ràng buộc với CONSTRAINT_MASK thông qua toán tử AND, sau đó so sánh với giá trị mong muốn để xác nhận trạng thái ràng buộc Quá trình này liên quan đến TextField và các ràng buộc gắn với nó, giúp đảm bảo dữ liệu nhập từ TextField tuân thủ các quy tắc kiểm tra ràng buộc một cách hiệu quả.

Sau đó l y giá tr này so sánh v i các ràng bu c đ bi t đ i t ng TextField đó đã đ c áp ràng bu c nào

B ng 15: Các ph ng th c và ch c n ng t ng ng c a l p TextField

TextField (String label, String text, int maxSize, int constraints)

TextField có khả năng giới hạn nhập liệu bằng maxSize - số ký tự tối đa cho phép người dùng nhập vào Các giá trị constraints đại diện cho các ràng buộc khi người dùng nhập dữ liệu, giúp kiểm soát nội dung và kích thước nhập vào Hàm int getConstraints() cho biết các ràng buộc hiện có của TextField; void setConstraints(int constraints) cho phép gán các ràng buộc mới cho TextField Để chèn dữ liệu vào TextField tại một vị trí cụ thể, bạn có thể dùng void insert(char[] data, int offset, int length, int position), trong đó data là mảng ký tự cần chèn, offset và length xác định phần dữ liệu được chèn, và position chỉ vị trí chèn trên TextField.

To manipulate the text inside a TextField, use insert(String src, int position) to insert the string src at the specified position Use delete(int offset, int length) to remove a segment of characters starting at offset with the given length The current caret position can be queried with getCaretPosition(), which returns the index of the caret in the field Retrieve the field content as a character array by calling getChars(char[] data), which fills the provided array and returns the number of characters written Finally, update the field from a character array with setChars(char[] data, int offset, int length), which writes data into the field starting at offset for the given length These TextField API methods provide fine-grained programmatic control over text content and cursor position, enabling precise text handling and responsive UI behavior.

Gán giá tr cho TextField b ng length ký t có v trí b t đ u offset trong m ng data. void setString (java.lang.String text) Gán giá tr text cho TextField.

String getString() L y giá tr TextField. int getMaxSize () L y kích th c t i đa c a TextField. int setMaxSize (int maxSize) Gán kích th c t i đa cho TextField. int size () L y kích th c th t c a TextField.

Ví d : // T o các đ i t ng TextField đ nh p đ a ch mail, s đi n tho i.

TextField tfAddr = new TextField(“Addr: ”, ””, 20, TextField.EMAILADDR);

TextField tfPhone = new TextField(“Phone: ”, “”, 10,

// g n vào Form frmMain.append(tfAddr); frmMain.append(tfPhone);

Choice được sử dụng để hiển thị một danh sách các tùy chọn cho người dùng lựa chọn ChoiceGroup không thực thi giao diện Choice và cũng giống như List Trong khi List được dùng trong Screen, thì ChoiceGroup được dùng trong một Item của Form và gồm hai dòng.

 Cho phép ch n nhi u kh n ng (Multiple): Th hi n danh sách các kh n ng lên màn hình d ng checkbox và cho phép ng i đánh d u check lên các l a ch n.

Chỉ được phép chọn một kỹ năng (Exclusive): Hiển thị danh sách các kỹ năng lên màn hình kèm theo các radio button và cho phép người dùng chọn duy nhất một kỹ năng Tính năng này giúp giao diện người dùng trực quan, ngăn nhầm lẫn giữa các lựa chọn và đảm bảo dữ liệu thu thập được thống nhất khi mỗi người dùng chỉ xác nhận một lựa chọn.

B ng 16:Các ph ng th c và ch c n ng t ng ng c a l p ChoiceGroup

ChoiceGroup (String label, int choiceType)

Kh i t o đ i t ng ChoiceGroup 2 ki u type là choiceType choiceType là m t trong hai giá tr Choice.EXCLUSIVE và Choice.MULTIPLE

V i choiceType là EXCLUSIVE thì ph n t đ u tiên là m c đ nh đ c ch n.

ChoiceGroup (String label, int choiceType, String[] stringElements, Image[] imageElements)

Kh i t o đ i t ng ChoiceGroup, cho tr c kh n ng l a chon và bi u t ng c a t ng vùng ch n. int append (String stringPart,

Thêm m t ph n t vào cu i ChoiceGroup. void delete (int Xóa m t ph n t v trí elementNum elementNum)

L y bi u t ng v trí elementNum int getSelectedFlags

L y thông tin k t qu l a ch n vào m ng. int getSelectedIndex () L y v trí c a ph n t đ c ch n.

L y giá tr c a ph n t v trí elementNum void insert (int elementNum,

Chèn m t ph n t m i vào v trí elementNum boolean isSelected (int elementNum)

Ki m tra ph n t v trí elementNum có đ c ch n không. void set (int elementNum, java.lang.String stringPart,

Gán giá tr và bi u t ng cho v trí elementNum void setSelectedFlags

Gán k t qu l a ch n cho đ i t ng ChoiceGroup void setSelectedIndex (int elementNum, boolean selected)

MULTIPLE gán giá tr đ c ch n hay không đ c ch n cho choicegroup v trí elementNum

EXCLUSIVE gán giá tr cho ph n t v trí elementNum là đ c ch n mà không c n quan tâm đ n giát tr selected int public int size () L y s ph n t c a ChoiceGroup.

 B t s ki n cho đ i t ng ChoiceGroup, có th dùng hai cách đ b t s ki n cho đ i t ng ChoiceGroup:

ItemStateListener is used in forms containing a ChoiceGroup to react to user selections After a Form attaches a setItemStateListener() to the ChoiceGroup, whenever the user picks any item, the itemStateChanged() method is invoked to handle the event This approach is suitable for implementing response logic on selection changes, such as updating the display, enabling or disabling controls, or triggering subsequent actions based on the chosen option Developers typically use ItemStateListener to build a responsive, event-driven UI in Java ME forms, ensuring that itemStateChanged() processing includes validation and state updates, and guarding against null selections.

ChoiceGroup d ng ch cho phép ch n m t kh n ng ho c m t s tr ng h p đ c bi t.

 CommandListener: Khi g n đ i t ng ChoiceGroup vào Form thì t o thêm m t Command (tên là OK ch ng h n) Khi ng i dùng ch n xong thì nh n ch n Command này và ch ng trình s g i ph ng th c commandAction() đ x lý

Cách này có th s d ng đ b t s ki n cho c hai lo i ChoiceGroup c ng nh các đ i t ng Item khác.

Ví d 1: // T o m t đ i t ng ChoiceGroup ch đ c ch n m t kh n ng:

ChoiceGroup cgExclusive = new ChoiceGroup(“Email Options”,

// L n l c thêm các ph n t cho đ i t ng, không kèm bi u t ng.

CgExclusive.append(“Forward”, null); int iReplyIndex = cgExlusive.append(“Reply”, null); cgexclusive.append(“Delete”, null);

// Gán “Reply” là ph n t đ c ch n. cgexclusive.setSeletedIndex(iReplyIndex, true);

// G n vào Form frmMain.append(cgExclusive);

// B t s ki n. public void itemStateChanged(Item item)

Ví d 2: // T o 1 đ i t ng ChoiceGroup cho phép ch n nhi u kh n ng:

ChoiceGroup cgMultiple = new ChoiceGroup(“Multiple Choice”,

// L n l t thêm các ph n t cho đ i t ng, không thèm bi u t ng. cgMultiple.append(“Auto Indent”, null); cgMultiple.append(“Replace Tabs”, null); cgMultiple.append(“Warp Text”, null);

Command cmOK = new Command (“OK”, Command.Screen, 1);

// G n vào Form int iChoiceGroupIndex = frmMain.append(cgMultiple); frmMain.addCommand(cmOK); frmMain.setCommandListener(this);

// x lý s ki n. public void commandAction (Command c, Displayable d)

Là m t đ i t ng ch a d li u nh đ h a, g m hai d ng:

 C đ nh (Immutable): th ng đ c n p t resource c a ng d ng, t file hay chuy n t d ng Image có th thay đ i (Mutable) sang D ng hình nh này ch y u đ c dùng làm bi u t ng cho các thành ph n đ h a khác nh ChoiceGroup, Form, List, Alert… M t khi đã t o đ i t ng ki u Immutable Image thì không th thay đ i hình nh đ c n a.

TextBox

TextBox là thành phần được sử dụng nhiều nhất trong các màn hình (Screens) của MIDlet TextBox được biết đến như TextField và cho phép người dùng nhập vào một chuỗi ký tự TextBox được dùng khi MIDlet cần người dùng nhập dữ liệu, chẳng hạn mã zipcode, tên, địa chỉ hoặc password.

S so sánh gi a TextBox và TextField

 C hai cùng s d ng chung các ki u ràng bu c c a l p TextField nh là: TextField.ANY, TextField.EMAILADDR, TextField.NUMERIC, TextField.PASSWORD, TextField.PHONENUMBER, TextField.URL

 S ký t nh p vào có th nh h n hay b ng s ký t t i đa c a đ i t ng đ c gán khi kh i t o Ch c n ng cu n màn hình s đ c h tr n u màn hình không hi n th đ h t n i dung

B ng 20: So sánh gi a TextField và TextBox

Hi n th trên màn hình

TextField là m t thành ph n c a Form, ngh a là có th hi n th các thành ph n giao di n khác cùng lúc v i TextField

TextBox là m t th c th duy nh t đ c hi n th u trên màn hình t i m t th i đi m

Ch có m t Command và dùng CommandListener đ l ng nghe và b t s ki n

B ng bên d i đây s mô t các ph ng th c và ch c n ng t ng ng c a l p TextBox

B ng 21:Ph ng th c và ch c n ng c a l p TextBox.

TextBox (String title, String text, int maxSize, int constraints)

T o m t đ i t ng TextBox v i maxSize s ký t t i đa cho phép nh p và constrant là các qui đnh khi nh p li u void delete (int offset, int length)

TextBox là thành phần cho phép người dùng nhập và chỉnh sửa văn bản, và các phương thức như getCaretPosition(), getChars(), getConstraints() và getMaxSize() cung cấp cơ chế xử lý chuỗi hiệu quả Xóa ký tự bắt đầu từ một offset với chiều dài đã cho, lấy vị trí con trỏ hiện tại bằng getCaretPosition(), sao chép toàn bộ ký tự từ TextBox vào một mảng dữ liệu thông qua getChars(char[] data), xác định các ràng buộc nhập liệu với getConstraints(), và tra cứu kích thước tối đa TextBox có thể chứa qua getMaxSize() Hiểu rõ những phương thức này giúp phát triển giao diện người dùng linh hoạt và tối ưu hóa xử lý văn bản trong ứng dụng.

String getString () L y giá tr c a TextBox void insert (char[] data, int offset, int length, int position)

Chèn các length ký t t v trí offset trong chu i data vào Textbox t v trí position void insert (String src, int position)

Chèn chu i scr vào textbox b t đ u t v trí position void setChars (char[] data, int offset, int length)

Gán giá tr cho TextBox b ng length ký t t v trí offset trong chu i data void setConstraints (int constraints)

Để quản lý TextBox hiệu quả, có thể gán các ràng buộc và nội dung bằng các phương thức sau: int setMaxSize(int maxSize) để thiết lập kích thước tối đa cho TextBox, void setString(String text) để gán giá trị văn bản cho TextBox, và int size() để lấy số ký tự đã nhập trong TextBox Phương thức size() cho biết độ dài chuỗi hiện tại, setMaxSize giới hạn số ký tự người dùng có thể nhập, còn setString cho phép cập nhật nội dung hiển thị một cách nhanh chóng.

TextBox tbName = new TextBox(“Please enter your name: ”, null, 20,

Command cmdSave = new Command(“Save”, Command.SCREEN, 1); tbName.addCommand(cmdSave);

//L ng nghe s ki n tbName.SetCommandListener(this);

// B t s ki n public void commandAction(Command c, Displayable d)

Alert

Alert là hộp thoại hiển thị thông báo cho người dùng và có thể đi kèm hình ảnh hoặc không Mỗi Alert gồm ba thành phần chính: tiêu đề, nội dung thông báo và hình ảnh đính kèm, giúp thông tin được trình bày rõ ràng và dễ tiếp nhận.

 Không gi i h n th i gian hi n th : Alert hi n th trên màn hình cho đ n khi ng i dùng t t.

 Gi i h n th i gian hi n th : Alert ch hi n th trên màn hình trong th i gian nh t đ nh và t đ ng t t khi h t h n.

 Các ph ng th c trong Alert.

D i đây là các ph ng th c và ch c n ng t ng ng c a các ph ng th c này, các ph ng th c này n m trong l p javax.microedition.cldui.Alert.

B ng 22: Các ph ng th c và ch c n ng t ng ng c a l p Alert.

Alert(String) T o m t đ i t ng Alert v i ki u m c đ nh c a thi t b Alert (String title, String strText, Image iImage,

T o đ i t ng Alert v i tiêu đ title, n i dung strText, hình iImage và lo i atType cho tr c

Image getImage () L yđ i t ng Image c a Alert void setImage () Gán đ i t ng Image cho Alert

String getString () L y n i dung thông báo c a Alert void setString (String str) Gán n i dung thông báo cho Alert int getDefaultTimeout() L y th i gian Alert đ c phép hi n th

(timeout) m cđnh c a thi t b int getTimeout () L y th i gian Alert đ c phép hi n th void setTimeout (int miliseconds)

Gán giá tr th i gian Alert đ c phép hi n

Để biết thời gian hiển thị của một Alert, dùng getDefaultTimeout() để kiểm tra giá trị trả về Nếu giá trị này là Alert.FOREVER thì thời gian hiển thị được xem là vô thời hạn (không tự động đóng) Ngược lại, thời gian hiển thị sẽ được tính bằng mili giây và áp dụng cho từng Alert, với các loại như Modal có cách tính thời gian khác nhau tùy thiết kế.

 Có hai cách đ hi n th Alert lên màn hình:

 Dùng ph ng th c Display.setCurrent (Alert, Displayable) : Khi Modal Alert b ng i dùng t t hay Timed Alert h t th i h n hi n th thì đ i t ng

Displayable s đ c hi n th lên màn hình

Form fmMain =new Form (“Form Main”); Alert alTest = new Alert

(“Alert”); alTest.setTimeout(Alert.FOREVER); display.setCurrent(alTest, fmMain);

 Dùng ph ng th c Display.setCurrent (Alert): đ i t ng Displayable đang đ c hi n th tr c khi g i ph ng th c này s đ c g i hi n th l i sau khi đ i t ng Alert h t h n.

Alert alTest = new Alert (“Alert”); alTest.setTimeout (Alert.FOREVER); display.setCurrent (alTest);

L u ý: o L p Alert là l p con c a Screen, Screen là l p con c a Displayable nh ng đ i t ng Alert không đ c phép g i tr c ti p m t s hàm sau c a l p Displayable:

setCommandListener(CommandListener) nghĩa là khi gán một CommandListener cho đối tượng Alert, hộp thoại Alert sẽ không được phép thêm nút lệnh và các sự kiện liên quan sẽ không được xử lý Cài đặt này làm cho Alert không có chức năng thông báo hoặc phản hồi đến người dùng khi thao tác trên hộp thoại Nếu cố gắng gọi các phương thức này trên một Alert đã được thiết lập với listener, chương trình sẽ ném IllegalStateException.

AlertType

AlertType là l p đ nh ngh a s n các lo i Alert cho thi t b , h tr âm thanh t ng ng khi Alert hi n th G m 5 lo i:

 C nh báo (warning) Âm thanh c a Alert có th đ c ch i b ng m t trong hai cách:

 N u đ i t ng Alert đ c gán lo i Alert tr c thì âm thanh t ng ng c a lo i Alert này s đ c phát khi đ i t ng hi n th lên màn hình

Ví d : Alert alWarning = new Alert (“Alert”, “Message”, null, AlertType.WARNING); hay

Alert alTest =new Alert (“Alert”, “Message”, null, null); alTest.setType(AlertType.WARNING);

Phát âm thanh cảnh báo trực tiếp mà không hiển thị thông báo trên màn hình có thể thực hiện bằng phương thức AlertType..playSound(Display); cách này hữu ích khi cần thông báo cho người dùng về một sự kiện mà không cần hiển thị nội dung lên giao diện Các sự kiện khác nhau có thể được gán âm thanh thông báo riêng biệt, giúp người dùng nhận diện sự kiện một cách nhanh chóng chỉ bằng âm thanh.

Ví d : AlertType.CONFIRMATION.playSound(fmMain);

Hay AlertType.ALARM.playSound(fmMain);

B ng 23: Các lo i AlertTypeđ c đ nh ngha tr c

ALARM Báo gi ho c nh c nh

CONFIRMATION Thông báo hoàn t t 1 công vi c nào đó

L p AlertType ch h tr m t ph ng th c duy nh t là boolean playSound (Display display) đ g i th c hi n ch c n ng play sound c a đ i t ng AlertType.

Ví d : //t o m t đ i t ng Alert có kèm hình nh và âm thanh d ng thông báo khi hi n th

Image img = Image.createImage(“/coffee.png”);

Alert alAlert= new Alert (“Hello”, “It’s time for coffee”, img, AlertType.INFO); //gán ki u Modal Alert alAlert.setTimeout(Alert.FOREVER);

//g i hi n th Alert display.setCurrent(alAlert, fmMain);

List

List dùng đ hi n th các danh sách các kh n ng cho ng i dùng l a ch n List g m 3 d ng.

 Multiple: cho phép ng i dùng l a ch n nhi u kh n ng , t ng t Multiple ChoiceGroup

 Exclusive: cho phép ng i dùng l a ch n duy nh t m t kh n ng, t ng t Exclusive ChoiceGroup

 Implicit: ch hi n th danh sách các kh n ng l a ch n d ng menu.

4.2.7.2 B t s ki n cho các đ i t ng List. b t s ki n cho đ i t ng List, ph i gán đ i t ng tr ng thái l ng nghe, ngh a là s d ng ph ng th c setCommandListener() cho đ i t ng List này Sau đó, b t s ki n và x lý s ki n trong ph ng th c commandAction().

Trong hệ thống có hai loại danh sách: Exclusive và multi-list Để ghi lại trạng thái chọn của người dùng trên các danh sách này, ta gắn một command (ví dụ: command Save) vào từng item để lưu trạng thái sau khi người dùng chọn Khi người dùng nhấn command Save và hoàn tất các tùy chọn, sự kiện sẽ được kích hoạt và được xử lý trong phương thức commandAction().

 Implicit List g i s ki n m i khi ng i dùng l a ch n m t ph n t trong List Khi đó, n u đã gán listener cho đ i t ng thì s ki n phát sinh s g i ph ng th c commandAction().

4.2.7.3 So sánh gi a l p List và l p ChoiceGroup:

 C hai cùng k th a t interface Choice

 C hai đ u cho phép t o đ i t ng h tr m t l a ch n duy nh t (radio button) ho c nhi u l a ch n (checkbox).

 Có th thêm các đ i t ng command khác hi n th cùng lúc trên màn hình đ h tr vi c b t s ki n.

B ng 24: S khác nhau gi a List và ChoiceGroup

Hi n th Là m t ph n c a Form, ngh a là ta có th hi n nó cùng v i nh ng ph n t giao di n khác.

List là m t th c th duy nh t hi n th trên màn hình t i m t th i đi m.

Phân lo i  MULTIPLE (là d ng check box)

 MULTIPLE (là d ng check box)

B t s ki n  ItemStateListener: g i ph ng th c itemStateChange() khi ng i dùng ch n vào m t ph n t b t k

 CommandListener: g n m t command đ l ng nghe và g i ph ng th c commandAction() khi có s ki n phát sinh.

Ch có m t cách dùng duy nh t là dùng CommandListener và g i hàm commandAction() khi có s ki n phát sinh.

B ng 25: Các ph ng th c và ch c n ng c a l p List

List (String title, int listType) T o m t list r ng v i listType thu c 1 trong 3 d ng: Choice.IMPLICIT, Choice.EXPLICIT, Choice.MULTIPLE List (String title, int listType, String[] stringElements, Image[] imageElements)

T o m t đ i t ng List cho tr c ph n t và bi u t ng d i d ng m ng stringElements và imageElements int append (String stringPart, Image imagePart)

Thêm m t ph n t vào cu i danh sách.

Void delete (int elementNum) Xóa m t ph n t v i v trí elementNum void insert (int elementNum, String stringPart, Image imagePart)

Chèn m t ph n t vào v trí elementNum void set (int elementNum, String stringPart, Image imagePart)

Thay đ i giá tr v trí elementNum

Image getImage (int elementNum) L y bi u t ng c a ph n t v trí elementNum

Trong API này, bạn có thể lấy giá trị của phần tử tại vị trí elementNum bằng getString(elementNum) Hàm boolean isSelected(int elementNum) cho biết phần tử tại vị trí đó có đang được chọn hay không Hàm int getSelectedIndex() trả về vị trí của phần tử được chọn hiện tại Bạn cũng có thể cập nhật trạng thái được chọn bằng cách gọi setSelectedIndex(elementNum, selected).

 MULTIPLE: gán giá tr đ c ch n hay không (selected) cho ph n t v trí elementNum

 EXCLUSIVE, IMPLICIT: gán giá tr cho v trí elementNum là đ c ch n (không ph thu c vào giá tr selected) int getSelectedFlags (boolean[] selectedArray_return)

L u thông tin k t qu l a ch n vào m ng. void setSelectedFlags (boolean[] selectedArray)

Gán k t qu l a ch n cho đ i t ng List. int size () L y s ph n t c a List.

Ticker

Ticker là cơ chế hiển thị chuỗi ký tự liên tục trên màn hình của ứng dụng Ticker có thể được gắn vào bất kỳ đối tượng màn hình nào mà không phát sinh cảnh báo (Alert) Vị trí hiển thị của chuỗi ký tự có thể ở trên hoặc dưới màn hình, và cần tham khảo các đặc tính liên quan đến MIDP để triển khai đúng cách.

B ng 26:Các ph ng th c và ch c n ng c a l p Ticker

Ticker(String strText) T o m t đ i t ng Ticker v i n i dung chu i cu n strText cho tr c.

String getString() L y chu i ký t c a Ticker. void setString(String strText)

Gán chu i ký t cho Ticker.

H A C P TH P

L u tr thông tin v i RMS

K t n i m ng v i Generic Connection Framework (GCF)

Tìm hi u và trình bày qui trình k thu t đ xây d ng m t ng d ng mobile trên Jbuilder 117 1 Cài đ t Jbuilder

Tìm hi u v à trình bày các yêu c u r àng bu c đ m t ng d ng mobile tr ên

Ngày đăng: 22/10/2022, 03:56

TỪ KHÓA LIÊN QUAN

w