Chương 1: Tổng quan về lập trình trên thiết bị di động Chương này sẽ nói sơ lược về thực tại các ứng dụng trên di động, các đặc điểm cũng như công nghệ, các công cụ lập trình khác nhau.
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Khúc Thanh Sơn
LẬP TRÌNH ỨNG DỤNG TRÊN THIẾT BỊ DI ĐỘNG
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công nghệ thông tin
HÀ NỘI – 2010
Trang 2
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Khúc Thanh Sơn
LẬP TRÌNH ỨNG DỤNG TRÊN THIẾT BỊ DI ĐỘNG
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công nghệ thông tin
Cán bộ hướng dẫn: ThS Đào Ngọc Phong Cán bộ đồng hướng dẫn: PGS TS Hồ Sĩ Đàm
HÀ NỘI – 2010
Trang 3Sau một thời gian tập trung nghiên cứu và thực hiện, em đã hoàn thành xong luận văn của mình Đây là kết quả của một quá trình lao động và học tập nghiêm túc dựa trên kiến thức mà em đã thu thập được dưới sự truyền dạy của quý thầy cô Em xin gửi lời tri ân sâu sắc nhất đến toàn thể quý thầy cô khoa Công nghệ thông tin – Đại học Công nghệ – Đại học Quốc Gia Hà Nội trong suốt thời gian qua
Hơn ai hết, em có thể ý thức rằng luận văn của mình khó có thể hoàn thành tốt nếu thiếu sự đôn đốc, hướng dẫn tận tình của thầy – Thạc sỹ Đào Ngọc Phong và thầy – PGS TS Hồ Sĩ Đàm Em xin gửi lời cám ơn chân thành nhất tới sự chỉ bảo của hai thầy
Em cũng xin cảm ơn các anh chị đi trước cùng toàn thể bạn bè vì sự động viên ủng hộ trong suốt thời gian nghiên cứu và thực hiện đề tài
Mặc dù đã nỗ lực hết mình để hoàn thành đề tài tốt nhất trong khả năng cho phép, nhưng do kiến thức của bản thân còn hạn hẹp và qui mô của khối lượng công việc mà thời gian có hạn nên những thiếu sót là không thể tránh khỏi Rất mong nhận được sự chỉ bảo cũng như góp ý chân thành của quý thầy cô, anh chị và các bạn
Khúc Thanh Sơn
Trang 4TÓM TẮT NỘI DUNG
Ngày nay, ngôn ngữ J2ME và lập trình trên thiết bị di động nói chung đang ngày càng phát triển rộng rãi đi kèm với sự bùng nổ về thị trường điện thoại di động Cùng với sự gia tăng về số lượng di động thì các tính năng dành cho di động cũng tăng theo tương ứng Hàng loạt các tính năng cao cấp được giới thiệu như chụp hình, nghe nhạc… và đặc biệt là sử dụng các chương trình không phải do nhà sản xuất điện thoại cung cấp Đây được coi là cuộc cách mạng trong lĩnh vực di động, nó biến chiếc điện thoại nhỏ bé thành một chiếc máy tính thu nhỏ, với những chủng loại điện thoại này ta
có thể đọc báo, tiểu thuyết, tra từ điển, bản đồ và nhất là mang cả thế giới giải trí đến bên cạnh, những bản nhạc hay, những game hay luôn luôn sẵn sàng để sử dụng Để góp phần cho sự phát triển đó ngoài yếu tố phần cứng thì nền tảng phần mềm là yếu tố quyết định vì các hãng sản xuất di động khác nhau thì sử dụng công nghệ khác nhau Làm sao để các thiết bị phần cứng khác nhau có thể sử dụng chung một nền tảng phần mềm? Đó chính là nền tảng J2ME Và đây cũng được coi là một trong những lợi thế rất lớn của J2ME
Trong đề tài của mình,em sẽ đi nghiên cứu về công nghệ J2ME và cách thức sử dụng J2ME để lập trình trên di động.Bản báo cáo khóa luận của em được trình bày theo 4 chương với nội dung cụ thể như sau:
1 Chương 1: Tổng quan về lập trình trên thiết bị di động
Chương này sẽ nói sơ lược về thực tại các ứng dụng trên di động, các đặc điểm cũng như công nghệ, các công cụ lập trình khác nhau
2 Chương 2: Giới thiệu về ngôn ngữ J2ME
Chương này sẽ nói về lịch sử hình thành, các phiên bản và các đặc điểm của ngôn ngữ J2ME
3 Chương 3: Công nghệ lập trình trên di động J2ME
Chương này sẽ giới thiệu về kiến trúc của J2ME, các lớp dùng trong J2ME
4 Chương 4: Xây dựng ứng dụng thử nghiệm trên di động
Chương này sẽ giới thiệu về ứng dụng sẽ làm, quá trình làm, cách cài đặt và sử dụng
Trang 5Mục lục
Bảng các chữ viết tắt và thuật ngữ được sử dụng 7
Danh sách hình vẽ 8
Danh sách các bảng 9
Chương 1 TỔNG QUAN VỀ LẬP TRÌNH TRÊN THIẾT BỊ DI ĐỘNG 10
1.1 Thực tế các ứng dụng trên thiết bị di động 10
1.2 Đặc điểm của lập trình ứng dụng trên thiết bị di động 11
1.3 Các công nghệ khác 11
Chương 2 GIỚI THIỆU VỀ J2ME 13
2.1 Lịch sử hình thành 13
2.2 Các phiên bản, đặc điểm 14
2.3 Các đặc điểm khác 15
2.4 Lý do chọn J2ME 16
Chương 3 CÔNG NGHỆ LẬP TRÌNH TRÊN DI ĐỘNG J2ME 18
3.1 Kiến trúc của J2ME 18
3.1.1 Configurations 18
3.1.2 Định nghĩa về Profile: 21
3.1.3 Máy ảo Java 22
3.2 Các lớp thông dụng trong J2ME 24
3.2.1 Cấu trúc cơ bản 24
3.2.2 Xây dựng một ứng dụng MIDlet 26
3.2.3 Lớp MIDlet 26
3.2.4 Lớp MIDletStateChangeException 28
3.2.5 Lớp Display 29
3.2.6 Lớp Displayable 30
3.2.7 Lớp Command và CommandListener 31
3.2.8 Lớp Item và ItemStateListener 34
3.3 Các lớp giao diện trong J2ME 36
3.3.1 Screen 37
3.3.2 Form 38
3.3.3 Item 39
3.3.4 StringItem 40
3.3.5 Image and ImageItem 40
3.3.6 Canvas 43
3.3.7 Graphics 45
Chương 4 XÂY DỰNG ỨNG DỤNG THỬ NGHIỆM TRÊN DI ĐỘNG 47
4.1 Giới thiệu về ứng dụng 47
4.2 Các chức năng chính 47
Trang 64.2.2 Xem slide 48
4.2.3 Trợ giúp 49
4.2.4 Liên hệ 49
4.2.5 Download 49
4.3 Cách thức làm chương trình 49
4.4.1 Yêu cầu phần mềm 52
4.4.2 Cài đặt phần mềm 53
4.4.2.1 Cài đặt JDK 53
4.4.2.2 Cài đặt Sun J2ME Wireless Toolkit 2.5 (WTK 2.5) 55
4.4.3 Chạy thử nghiệm chương trình 57
4.4.3.1 Cách tạo một Project trên Sun J2ME Wireless Toolkit 2.5 57
4.4.3.2.1 Giao diện khi khởi động xong chương trình 60
4.4.3.2.2 Giao diện Menu chính của chương trình 61
4.4.3.2.3 Giao diện Xem Album 62
4.4.3.2.4 Giao diện Xem Slide 63
4.4.3.2.5 Giao diện Trợ giúp 64
4.4.3.2.6 Giao diện Liên hệ 65
4.4.3.2.7 Giao diện Download 66
4.4.3.2.8 Giao diện khi tắt chương trình 67
4.4.4 Tạo file Jar dùng để lưu trữ và chia sẻ 68
KẾT LUẬN 69
Tài liệu tham khảo 70
Trang 7Bảng các chữ viết tắt và thuật ngữ được sử dụng
CLDC Connected Limited Device Configuration
Configuration Đặc tả quy định các thư viện gốc J2ME phải hỗ trợ cho một
dòng phần cứng J2EE Java 2 Enterprise Edition,dành cho các dự án lớn J2ME Java 2 Micro Edition,dành cho các thiết bị nhỏ J2SE Java 2 Standard Edition,dành cho PC thông thường
KVM K Virtual Machine-máy ảo cho môi trường CLDC MIDlet Tên gọi chung của các ứng dụng J2ME
MIDP Mobile Information Device Profile
Profile Các tập thư viện cấp cao định nghĩa trên nền Configuration
Trang 8Danh sách hình vẽ
Hình 1 Các đặc điểm của ngôn ngữ J2ME 15
Hình 2 Các thành phần của J2ME 18
Hình 3 Configurations và các thiết bị 20
Hình 4 So sánh Profile thông thường và Profile mở rộng 22
Hình 5 Cấu trúc chương trình J2ME 23
Hình 6 Cấu trúc chương trình MIDP 24
Hình 7 Mô hình vòng đời của một MIDlet 25
Hình 8 Command Exit 32
Hình 9 Ví dụ về cách khởi tạo của hàm Command 32
Hình 10 Sơ đồ các lớp giao diện của J2ME 37
Hình 11 Sơ đồ tổng quan giao diện chương trình 48
Hình 12 Màn hình bắt đầu cài đặt JDK 53
Hình 13 Quá trình JDK đang tiến hành cài đặt 54
Hình 14 Quá trình cài đặt kết thúc 54
Hình 15 Màn hình khi bắt đầu cài đặt WTK 2.5 55
Hình 16 Bước cài đặt WTK tiếp theo 55
Hình 17 Đường dẫn cài đặt WTK 2.5 56
Hình 18 Quá trình xử lý khi cài đặt WTK 2.5 56
Hình 19 Quá trình cài đặt WTK 2.5 kết thúc 57
Hình 20 Màn hình mở WTK 2.5 57
Hình 21 Giao diện ban đầu của WTK 58
Hình 22 Cửa sổ tạo New Project trong WTK 58
Hình 23 Cửa sổ cấu hình cho MIDlet 59
Hình 24 Giao diện khi Build và Run chương trình 59
Hình 25 Giao diện khi khởi động chương trình 60
Hình 26 Giao diện Menu chính của chương trình 61
Hình 27 Giao diện Xem Album 62
Hình 28 Giao diện Xem Slide 63
Hình 29 Giao diện Trợ giúp 64
Hình 30 Giao diện Liên hệ 65
Hình 31 Giao diện Download 66
Hình 32 Giao diện khi tắt chương trình 67
Hình 33 Cửa sổ WTK khi tạo file Jar 68
Hình 34 Cửa sổ Build file Jar của WTK 68
Hình 35 Hình ảnh thư mục bin chứ file Jar của Chương trình 68
Trang 9Danh sách các bảng
Bảng 1 So sánh thông số kỹ thuật của CDC và CLDC 20
Bảng 2 Các hàm thường dùng trong MIDlet 27
Bảng 3 Một số hàm quan trọng của lớp Display 29
Bảng 4 Các hàm chính của Displayable 31
Bảng 5 Các TYPE hỗ trợ của lớp Command 33
Bảng 6 Các hàm chính của lớp Command và CommandListener 34
Bảng 7 Các hàm quan trọng của lớp Item 35
Bảng 8 Các phương thức và chức năng tương ứng của lớp Screen 38
Bảng 9 Các phương thức và chức năng tương ứng của lớp Form 39
Bảng 10 Các phương thức và chức năng tương ứng của lớp Item 40
Bảng 11 Các phương thức và chức năng tương ứng của StringItem 40
Bảng 12 Các phương thức và chức năng của lớp Image 41
Bảng 13 Các phương thức và chức năng của lớp Image 42
Bảng 14 Các phương thức hỗ trợ vẽ của lớp Canvas: 44
Bảng 15 Các phương thức và chức năng của lớp Graphics: 46
Trang 10Chương 1 TỔNG QUAN VỀ LẬP TRÌNH TRÊN THIẾT BỊ DI ĐỘNG
1.1 Thực tế các ứng dụng trên thiết bị di động
Mạng điện thoại di động xuất hiện đầu tiên ở Việt Nam vào đầu những năm
1990 và theo thời gian số lượng thuê bao cũng như các nhà dịch vụ di động tại Việt Nam cũng tăng dần Cùng với sự phát triển về số lượng thuê bao di động là sự đa dạng hóa 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 nữa 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 thiết bị 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 là mảnh đất màu mỡ và hứa hẹn đem lại lợi nhuận rất cao
Về chương trình ứng dụng, tính khả thi và thực tế ngày càng được đề cao Với thực trạng Việt Nam hiện nay, số người sở hữu máy tính cá nhân, đặc biệt là sở hữu laptop chưa nhiều nhưng số người có điện thoại di dộng là rất nhiều.Vì thế việc phát triển các ứng dụng di động sẽ là một hướng phát triển màu mỡ, nhằm tạo sự tiện lợi cho người sử dụng, cũng như là tiết kiệm chi phí và thời gian
Hiện nay có rất nhiều các ứng dụng trên di động ta đang sử dụng hàng ngày như game,phần mềm chạy nhạc, phần mềm quản lý ảnh, quản lý bản đồ, chát, tin nhắn…và
đa số các ứng dụng đều chạy trên nền Java và được lập trình bằng ngôn ngữ J2ME, một ngôn ngữ rất mạnh về lập trình ứng dụng cho thiết bị di động Nếu máy điện thoại
có kết nối GPRS, thì ta còn có thể down về rất nhiều các tiện ích cũng như các ứng dụng mà trong máy không có sẵn như là tải nhạc, tải hình cũng như là các game…Qua
đó ta có thể thấy tầm quan trọng của các ứng dụng trên thiết bị di động, nếu thiếu chúng các thiết bị di động sẽ thiếu đi rất nhiều tính năng và cũng sẽ giảm đi hiệu quả làm việc!
Trang 111 2 Đặc điểm của lập trình ứng dụng trên thiết bị di động
Ngôn ngữ sử dụng chủ yếu để lập trình các ứng dụng trên thiết bị di động là J2ME Ngôn ngữ J2ME có 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 hệ điện thoại cũ 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à một 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
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 thì việc lập trình J2ME trở nên rất dễ dàng J2ME còn được các tổ chức mã nguồn mở ủng hộ mạnh mẽ và phát triển nhanh chóng
1.3 Các công nghệ khác
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à C++ trên hệ điều hành Symbian và J2ME Các ứng dụng viết trên nền Symbian có ưu thế là truy cập trực tiếp tài nguyên của điện thoại cũng như là hỗ trợ hệ thống tập tin, thư mục, như máy tính cá nhân vì được hỗ trợ 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
Ngoài ra còn có 1 công nghệ khác đó là lập trình trên Android."Android là một
hệ điều hành dành cho di động sử dụng Linux Kernel",nhưng nó giống 1 "nền tảng" hơn vì ngoài các chức năng của một hệ điều hành, Google đã trang bị cho Android những "vũ khí tối tân nhất" mà theo quan điểm của những người sáng tạo ra Android
đã từng khẳng định "đó sẽ là một nền tảng vừa mạnh mẽ vừa linh hoạt"
Năm 2005, Google mua lại công ty Android, một công ty nhỏ có trụ sở tại California, Mỹ Sau khi chuyển sang cho Google, nhóm phát triển do Rubin làm Leader bắt đầu phát triển một nền tảng (Platform) dựa trên Linux Kernel dành riêng
Trang 12cho di động, một nền tảng đủ mạnh mẽ và mềm dẻo để cạnh tranh với các nền tảng di động khác Đồng thời, Google cũng bắt đầu lên kế hoạch cho các đối tác để chế tạo phần cứng và viết các phần mềm trên nển tảng mới của mình
Như đã trình bày ở phần trên, J2ME có lẽ công nghệ lập trình cho di động gọn nhẹ và tiện dụng nhất, nên hiện nay hầu hết các nhà lập trình hay các công ty về di động đều sử dụng công nghệ J2ME là chủ yếu!
Trang 13Chương 2 GIỚI THIỆU VỀ J2ME
2.1 Lịch sử hình thành
Java là một công nghệ được hãng Sun Microsystems xây dựng đầu tiên với cái tên Oak và hiện nay đang phát triển vượt bậc với sự đóng góp của hàng vạn lập trình viên trên thế giới Ban đầu, Oak được kỹ sư James Gosling và các cộng sự xây dựng với mục đích lập trình cho các mặt hàng điện dân dụng với mục tiêu nhỏ gọn và tương thích được với nhiều loại thiết bị phần cứng khác nhau Sau đó Oak được sử dụng trong nhiều dự án như dự án Xanh (Blue Project), dự án Phim theo yêu cầu (Video on demand Project) Sau một chuyến du lịch tới đảo Java của Indonesia, nhóm phát triển Oak đã đổi tên Oak thành Java
Java mà tiền thân là Oak được xây dựng chủ yếu dựa trên bộ công cụ phát triển (Java Development Kit - JDK) như là bộ thư viện chuẩn trong đó chứa trình biên dịch, trình thông dịch, trình đóng gói, tài liệu,… Đây chính là nền tảng cho việc phát triển các ứng dụng Java
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ỉ có một phiên bản duy nhất, ngay nay được biết đến với cái tên J2SE (Java 2 Standard Edition), với phương châm “viết một lần, dùng trên mọi môi trường” (“Write one,run anywhere”) Java hình thành trên ý tưởng xây dựng một ngôn ngữ mà lập trình viên viết một lần duy nhất nhưng ứng dụng có thể chạy trên bất kỳ 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
Trang 14ảo Java có thể 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ờ 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 vào năm 1995, ngày nay mục tiêu của Java nhắm đến cũng thay đổi khá nhiều Java hiện nay không chỉ nhắm đến máy tính để bàn đơn thuần, hai năm sau ngày đầu 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 đến việc phát triển các ứng dụng có quy 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,thiết bị di động…
2.2 Các phiên bản, đặc điểm
J2SE (Java 2 Platform, Standart Edition): Phiên bản chuẩn gồm bộ
công cụ thông dụng dùng để chạy trên các máy PC hoặc các mạng máy tính
nhỏ
J2EE (Java 2 Platform, Enterprise Edition): Phiên bản dành cho các
máy chủ với bộ nhớ lớn Bao gồm các kiến trúc nâng cao như Web, EJB,
Transaction,… dùng để xây dựng các ứng dụng có quy mô lớn
J2ME (Java 2 Platform, Micro Edition): Bao gồm môi trường và thư
viện Java dùng để phát triển các ứng dụng trên các thiết bị có bộ nhớ nhỏ như
điện thoại di động, PDA, các đồ gia dụng,…
Trang 152.3 Các đặc điểm khác
J2ME được phát triển từ kiến trúc JavaCard, EmbededJava và PersonalJava của phiên bản Java 1.1 Đến sự ra đời của phiên bản Java 2 thì Sun quyết định thay thế PersonalJava bằng một phiên bản mới có tên Java 2 Micro Edition, viết tắt là J2ME J2ME được sử dụng cho các thiết bị nhỏ gọn với dung lượng bộ nhớ bé và khả năng
xử lý thấp
Mục tiêu của Java là cho phép người lập trình viết các ứng dụng độc lập với thiết bị di động, không cần quan tâm đến phần cứng thật sự Để làm được
như thế, J2ME được xây dựng bằng các tầng khác nhau để che giấu đi việc
tương tác trực tiếp với phần cứng của thiết bị Các tầng của J2ME được xây
dựng trên CLDC (Connected Limited Device Configuration):
Trang 16Tầng Phần cứng thiết bị (Device Hardware Layer): Đây là thiết bị di
động thật sự với bộ nhớ và tốc độ xử lý cụ thể Các thiết bị di động khác nhau
có thể có bộ vi xử lý và các tập lệnh rất khác nhau Mục tiêu của J2ME là cung cấp cho lập trình viên khả năng giao tiếp giống nhau với tất cả các loại thiết bị di động khác nhau
Tầng máy ảo Java (Java Virtual Machine Layer): Đây là tầng đóng vai
trò thông ngôn giữa chương trình và thiết bị Nó sẽ thông dịch các mã bytecode (mã có được sau khi biên dịch mã nguồn chương trình) thành mã máy của các thiết bị di động Tầng này bao gồm KVM (K Virtual Machine) là bộ biên dịch mã bytecode thành mã máy Nó cung cấp một sự chuẩn hóa cho các thiết bị di động để ứng dụng J2ME sau khi biên dịch có thể chạy được trên bất kỳ thiết bị di động nào hỗ trợ KVM
Tầng cấu hình (Configuration Layer): Tầng này cung cấp các hàm API cơ bản là nhân của J2ME Lập trình viên có thể sử dụng các lớp và các phương thức của các API này tuy nhiên nó không thực sự phong phú bằng tập API của tầng hiện trạng
Tầng hiện trạng (Profile Layer): Tầng này cung cấp các hàm API hữu dụng hơn cho việc lập trình Mục đích của tầng này xây dựng nên lớp cấu hình và cung cấp nhiều thư viện ứng dụng hơn
Trang 17ngà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 đô
la doanh thu Một thực tế đặc ra cho các nhà phát triển 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ị hiện nay trên thị trường rất đa dạng và mang nhiều đặc điểm cũng như cấu hình khác nhau Trên thực tế đó, việc 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 với 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 đã 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
Một số thiết bị hỗ trợ J2ME chúng ta hay gặp như:
-Các lọai thẻ cá nhân như Java Card
-Máy điện thoại di động
-Máy PDA (Personal Digital Assistant - thiết bị trợ giúp cá nhân)
-Các hộp điều khiển dành cho tivi, thiết bị giải trí gia dụng …
Trang 18Chương 3 CÔNG NGHỆ LẬP TRÌNH TRÊN DI ĐỘNG J2ME
3.1 Kiến trúc của J2ME
Hình 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 các 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ị 12000pixels cho đến những PDA là 20000pixels) Để đá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 các thành phần nhỏ hơn Chúng ta sẽ tìm hiểu 2 khái niệm Configurations và Profiles
3.1.1 Configurations
Định nghĩa về Configuration (Cấu hình): là đặc tả định nghĩa một môi trường phần mềm cho một dòng các thiết bị được phân loại bởi tập hợp các đặc tính, ví dụ như:
Trang 19ra có thể mang tính độc lập thiết bị cao nhất có thể Ví dụ như một lập trình viên viết chương trình game cho điện thoại Samsung thì có thể sửa đổi chương trình của mình một cách tối thiểu nhất để có thể chạy trên điện thọai Nokia Hiện nay Sun đã đưa ra 2 dạng Configuration:
CLDC (Connected Limited Device Configuration-Cấu hình thiết bị kết nối giới hạn): được thiết kế để nhắm vào thị trường các thiết bị cấp thấp (low-end), các thiết bị này thông thường là máy điện thọai di động và PDA với khoảng 512 KB bộ nhớ Vì tài nguyên bộ nhớ hạn chế nên CLDC được gắn với Java không dây (Java Wireless ), dạng như cho phép người sử dụng mua và tải về các ứng dụng Java, ví dụ như là MIDlet
CDC- Connected Device Configuration (Cấu hình thiết bị kết nối): CDC được đưa ra nhắm đến các thiết bị có tính năng mạnh hơn dòng thiết bị thuộc CLDC nhưng vẫn yếu hơn các hệ thống máy để bàn sử dụng J2SE Những thiết bị này có nhiều bộ nhớ hơn (thông thường là trên 2MB) và có bộ xử lý mạnh hơn Các sản phẩm này có thể kể đến như các máy PDA cấp cao, điện thoại web, các thiết bị gia dụng trong gia đình …
Cả 2 dạng Cấu hình kể trên đều chứa máy ảo Java (Java Virtual Machine) và tập hợp các lớp (class) Java cơ bản để cung cấp một môi trường cho các ứng dụng J2ME Tuy nhiên, bạn chú ý rằng đối với các thiết bị cấp thấp, do hạn chế về tài
nguyên như bộ nhớ và bộ xử lý nên không thể yêu cầu máy ảo hổ trợ tất cả các tính năng như với máy ảo của J2SE, ví dụ, các thiết bị thuộc CLDC không có phần cứng
Trang 20yêu cầu các phép tính toán dấu phẩy động, nên máy ảo thuộc CLDC không được yêu cầu hỗ trợ kiểu float và double
Trang 21-Mobile Information Device Profile (MIDP): profile này sẽ bổ sung các tính năng như hỗ trợ kết nối, các thành phần hỗ trợ giao diện người dùng … vào CLDC Profile này được thiết kế chủ yếu để nhắm vào điện thọai di động với đặc tính là màn hình hiển thị hạn chế, dung lượng chứa có hạn Do đó MIDP sẽ cung cấp một giao diện người dùng đơn giản và các tính năng mạng đơn giản dựa trên HTTP Có thể nói MIDP là Profile nổi tiếng nhất bởi vì nó là kiến thức cơ bản cho lập trình Java trên các máy di động (Wireless Java)
-PDA Profile: tương tự MIDP, nhưng với thị trường là các máy PDA với màn hình và bộ nhớ lớn hơn
-Foundation Profile: cho phép mở rộng các tính năng của CDC với phần lớn các thư viện của bộ Core Java2 1.3 Ngoài ra còn có Personal Basis Profile, Personal
Profile, RMI Profile, Game Profile
Trang 22
Hình 4 So sánh Profile thông thường và Profile mở rộng
3.1.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ý điều phối các tiến trình Chúng ta có thể nói chính máy ảo 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 một máy ảo Java truyền thống: Máy ảo chỉ cần 40-80kb bộ nhớ
Chỉ đòi hỏi 20-40kb bộ nhớ động (heap)
Trang 23Đến đây chúng ta có thể hình dung phần nào kiến trúc tổng thể của một chương trình J2ME như sau:
Hình 5 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
Trang 24
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 6 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 KVM, bên trên là CLDC và trên cùng là MIDP Profile Lúc này khái niệm “Viết một lần, chạy bất cứ 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 được trên 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 Java trở thành một 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ả thiết
Trang 25
Hình 7 Mô hình vòng đời của một 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ề 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ể trở lại trạng thái Paused bởi thiết bị (khi trả lời cuộc gọi đến hoặc bởi chính chương trình MIDlet)
-Active:chương trình đ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ý trên ứng dụng trên thiết bị
Trang 263.2.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à 1 interface và chúng ta phải khai báo 3 hàm sau đây :startApp(), pauseApp(), và destroyApp() Dưới đây là 1 ví dụ về 1 chương trình MIDlet đơn giản:
public class midletTest extends MIDlet{
//phương thức khởi tạo(Constructor),không bắt buộc phải có
public midletTest() {…};
//đượ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() {….};
Protected abstract void startApp() throws MIDletStateChangeException;
Protected abstract void pauseApp();
Protected abstract void destroyApp(boolean unconditional) throws
Trang 27Hà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 đang dùng
abstract void
pauseApp() Hàm này được gọi để giải phóng tài nguyên
abstract void startApp() Được gọi khi MIDlet sắp đưa vào trạng thái thực
thi(active state) Final void
Trang 28Hai quá trình quan trọng nhất của một ứng dụng MIDlet là quá trình 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 các phương thức khởi tạo
Ứ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 pausedApp chưa đượ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 trở lại
-Quá trình thoát:
User chọn thoát chương trình
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.2.4 Lớp MIDletStateChangeException
Khi tìm hiểu đến package javax.microedition.midlet, chúng ta còn phải quan tâm đến 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 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
Trang 29Trong 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
3.2.5 Lớp Display
Ứng dụng của chúng ta chắc chắn sẽ có nhu cầu xuất dữ liệu ra màn hình.Việc này trong ứ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
Một số hàm quan trọng của lớp Display:
Static Display getDisplay(MIDlet m) Lấy đối trượng Display của MIDlet Displayable getCurrent() Lấy đối tượng Displayable hiện thời Void setCurrent(Alert alert,
Displayable nextDisplayable)
Void setCurrent(Displayable
nextDisplayable)
Tạo đối tượng alert
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 Một số hàm quan trọng của lớp Display
Mỗi MIDlet sẽ chỉ 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);
Trang 30Tham số 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 ví dụ như form, Textbox, Canvas, Screen…
3.2.6 Lớp Displayable
Như đã đề cập, mỗi MIDlet sẽ chỉ có một đối tượng Display duy nhất và đối tượng Display 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;
- Tạo một đối tượng Displayable:
Thông thường chúng ta không trực tiếp tạo ra đối tượng thuộc lớp Displayable mà sử dụng 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 Testgame extends Canvas{
Draw image, text, shapes…
}
Trang 31removeCommand(Command
cmd)
Xóa bỏ một đối tượng Command vào đối tượng
Displayable Void setCommandListener(
CommandListener l)
Thêm CommandListener vào đối tượng
Displayable
Boolean isShown() Kiểm tra đối tượng Displayable có được thể hiện
trên thiết bị hay không
Bảng 4 Các hàm chính của Displayable
3.2.7 Lớp Command và CommandListener
Để nhận 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 là commandListener() và tương ứng lớp ItemStateLisener có hàm là
itemStateListener(), đây là 2 hàm chúng ta cần cài đặt để nhận biết 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 hai tác nhân chính phát sinh một sự kiện là Command và Item
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
Trang 32đề sẽ trở nên phức tạp hơn, có nhứng form số lượng command có thể nhiều hơn nút bấm chức năng trên thiết bị, lúc này các command sẽ được tổ chức theo dạng menu Trước tiên chúng ta tìm hiểu phải làm thêm một command vào ứng dụng:
Tạo một command để lưu 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 thông tin về event làm thông số cho hàm
Khi khởi tạo một command ta cần 3 thông số, ví dụ:
Hình 9 Ví dụ về cách khởi tạo của hàm Command
Trang 33
- Label: Đoạn văn bản được xem như nhãn của Command
- Type: Thật thuận thiệ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 việc 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 đặt type là Command.HELP thì không có nghĩa là 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
Các Type hỗ trợ:
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
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 nút soft-button tương ứng với
command dạng này.Việc thể hiện command tùy vào từng thiết bị STOP Dừng một công việc đang thực hiện
Bảng 5 Các TYPE hỗ trợ của lớp Command
Trang 34- Prority :Độ ư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 Giá trị này càng cao thì độ ưu tiên càng thấp
Sau đây là hàm chính của lớp Command và CommandListener ( hai lớp này nằm trong package javax.microedition.lcdui)
int getLabel() Cho biết label của Command
int getPrority() Cho biết độ ưu tiên
javax.microedition.lcdui.CommandListener void commandAction(Command
và mỗi dạng đều có thể phát sinh các sự kiện.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 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ụ
Trang 35tượ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 Item 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ì sẽ gọi đầy đủ bấy nhiêu lần Ở đây có một luật được đề ra:
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:
Javax.microedition.lcdui.Item
String getLabel() Lấy nhãn của Item
void setLabel(String label) Đặt nhãn của label
javax.microedition.lcdui.ItemStateListener void itemStateChanged(Item item) Được gọi khi giá trị của item thay đổi
Bảng 7 Các hàm quan trọng của lớp Item