Trong bài trước bạn đã biết cách sử dụng bộ công cụ Wireless Toolkit để tạo một dự án project mới, đó là ứng dụng Hello World. Tuy nhiên các bạn
vẫn chưa tìm hiểu về mã nguồn của chương trình đầu tiên này. Trong bài
này chúng ta sẽ cùng phân tích cấu trúc đơn giản nhất của một ứng dụng
Java trên điện thoại di động cũng như giải thích một số khái niệm cơ bản
về công nghệ lập trình J2ME này.
Chắc bạn cũng còn nhớ là trong bài trước bạn đã sử dụng chương trình WireLess Toolkit để tạo một dự án, biên dịch và chạy chúng. Các bạn có thể xem lại bài trước một lần nữa trước khi chúng ta bắt đầu vọc mã nguồn của ứng dụng Hello World. Tuy nhiên đầu tiên ta cần tìm hiểu những khái niệm cơ bản trước đã.
Giới thiệu về J2ME
Khi nghe nói về Java, các bạn hay gặp những thuật ngữ như J2SE, J2EE và J2ME.
- J2SE viết
tắt của Java 2 Standard Edition, là bản Java dùng để viết các chương
trình chạy trên desktop.
- Còn J2EE là Java 2 Enterprise Edition, một
phiên bản chuyên dùng để viết các ứng dụng web cũng như các dịch vụ web
chạy trên các hệ thống máy chủ.
- Thế còn J2ME là gì? J2ME (Java 2 Micro
Edition) là công nghệ cũng như nền tảng để viết các ứng dụng chạy trên
các thiết bị nhỏ như điện thoại di động hay các máy trợ giúp cá nhân
PDA. Với nền tảng J2ME, các bạn sẽ có được một tập các giao diện lập
trình ứng dụng (API) được thiết kế đặc thù cho các thiết bị nhỏ. Vì các
thiết bị nhỏ có khả năng xử lý cũng như bộ nhớ rất hạn chế nên các thiết
bị này không thể chạy các máy ảo Java (Java Virtual Machine) của J2SE
được. Và vì lý do này nên một phiên bản máy ảo Java nhỏ gọn được định
nghĩa ra để có thể chạy được trên các thiết bị di động này.
Một cách ngắn gọn dễ hiểu thì bạn có thể coi J2ME bao gồm một máy ảo Java thu gọn và một tập các thư viện lập trình thiết kế riêng cho các thiết bị di động.
Một cách ngắn gọn dễ hiểu thì bạn có thể coi J2ME bao gồm một máy ảo Java thu gọn và một tập các thư viện lập trình thiết kế riêng cho các thiết bị di động.
Các bạn cũng chú ý là các bạn không cần cài đặt J2ME lên chiếc điện thoại của bạn, bởi vì các nhà sản xuất đã cài đặt sẵn cho bạn rồi. Nếu điện thoại của bạn có ghi là hỗ trợ Java thì có nghĩa là nhà sản xuất đã tích hợp sẵn J2ME vào điện thoại. Hầu hết các đời điện thoại có giá trên 2 triệu đều có hỗ trợ J2ME. Mặc dù để lập trình thì bạn chỉ cần môi trường giả lập thông qua bộ công cụ Wireless Toolkit mà ta đã biết, các bạn cũng nên có một chiếc điện thoại để thử các sản phẩm của bạn xem chúng chạy ra sao trên điện thoại thật. Trong các bài sau tôi sẽ trình bày cách cài đặt các chương trình chúng ta viết vào điện thoại thật như thế nào.
J2ME
được chia thành 3 thành phần là Cấu hình (Configuration), Profile và
các thư viện tuỳ chọn bổ sung. Cấu hình chứa máy ảo Java thu gọn và một
số hàm thư viện nền tảng. Profile bổ sung thêm một tập các thư viện nữa
nhằm phục vụ cho một số dòng thiết bị di động. Còn các thư viện bổ sung
cung cấp thêm các chức năng mở rộng, ví dụ như khả năng nhắn SMS hoặc
điều khiển bluetooth.
Có lẽ Cấu Hình và Profile nổi tiếng nhất chính là CLDC (Connected
Limited Device Configuration) và MIDP (Mobile Information Device
Profile). CLDC nghĩa là Cấu hình của các thiết bị nhỏ có kết nối, ví dụ
như các điện thoại có từ 128KB đến 512KB bộ nhớ cho các ứng dụng Java.
Vì khả năng của các thiết bị này rất hạn chế nên máy ảo Java chạy trên
nó rất nhỏ và được gọi là KVM (viết tắt của Kilobyte Virtual Machine).
Một Cấu Hình khác dành cho các thiết bị có ít nhất 2MB bộ nhớ được gọi
là CDC (Connected Device Configuration), thường có trong các máy trợ
giúp số cá nhân PDA.
Profile MIDP bổ sung cho Cấu Hình CLDC bởi vì nó cung cấp thư viện được thiết kế đặc biệt để có thể chạy được trên các thiết bị rất nhỏ với tài nguyên CPU và bộ nhớ rất hạn chế. Ví dụ là MIDP có gói javax.microedition.lcdui cho phép chúng ta lập trình giao diện người dùng (GUI) trên thiết bị có màn hình rất nhỏ. Với các thiết bị mạnh hơn và màn hình lớn hơn như PDA thì các profile thường gặp trên đó có tên là Foundation và Personal. Trong loạt bài viết này tôi sẽ không trình bày về CDC và Foundation/Personal mà chỉ tập trung vào CLDC và MIDP, là nền tảng trong các điện thoại di động hiện nay.
CLDC có 2 phiên bản là 1.0 và 1.1, trong đó phiên bản 1.0 là phổ biến nhất trong các điện thoại hỗ trợ Java. MIDP cũng có 2 phiên bản là 1.0 và 2.0. Hầu hết các máy điện thoại đời mới hiện nay trên thị trường đã hỗ trợ MIDP 2.0.
Profile MIDP bổ sung cho Cấu Hình CLDC bởi vì nó cung cấp thư viện được thiết kế đặc biệt để có thể chạy được trên các thiết bị rất nhỏ với tài nguyên CPU và bộ nhớ rất hạn chế. Ví dụ là MIDP có gói javax.microedition.lcdui cho phép chúng ta lập trình giao diện người dùng (GUI) trên thiết bị có màn hình rất nhỏ. Với các thiết bị mạnh hơn và màn hình lớn hơn như PDA thì các profile thường gặp trên đó có tên là Foundation và Personal. Trong loạt bài viết này tôi sẽ không trình bày về CDC và Foundation/Personal mà chỉ tập trung vào CLDC và MIDP, là nền tảng trong các điện thoại di động hiện nay.
CLDC có 2 phiên bản là 1.0 và 1.1, trong đó phiên bản 1.0 là phổ biến nhất trong các điện thoại hỗ trợ Java. MIDP cũng có 2 phiên bản là 1.0 và 2.0. Hầu hết các máy điện thoại đời mới hiện nay trên thị trường đã hỗ trợ MIDP 2.0.
Tìm hiểu về mã nguồn ứng dụng Hello World
Như vậy là bạn đã nắm được những khái niệm cơ bản nhất về nền tảng J2ME trên các thiết bị di động. Với những kiến thức nền tảng này chúng ta sẽ tiếp tục bằng cách phân tích mã nguồn ứng dụng Hello World.
/**
* @(#)HelloQuangIT.java
*
*
* @author
* @version 1.00 2012/2/11
*/
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloQuangIT extends MIDlet implements CommandListener {
private Form mMainForm;
public HelloQuangIT() {
mMainForm = new Form("By Quang IT");
mMainForm.append(new StringItem(null, "Hello World!"));
mMainForm.addCommand(new Command("Thoát", Command.EXIT, 0));
mMainForm.setCommandListener(this);
}
public void startApp() {
Display.getDisplay(this).setCurrent(mMainForm);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
notifyDestroyed();
}
}
Để hiểu được ví dụ này, các bạn cần có một ít kiến thức về ngôn ngữ lập trình hướng đối tượng nói chung và Java nói riêng. Nếu các bạn chưa từng lập trình, các bạn nên tìm xem một vài chương đầu của bất kỳ cuốn sách lập trình Java nào.
Đầu tiên ứng dụng của chúng ta “import” hãy tham khảo 2 gói chính của J2ME cho việc lập trình ứng dụng cho điện thoại, đó là 2 gói javax.microedition.lcdui (bao gồm các lớp định nghĩa các thành phần giao diện đồ hoạ) và javax.microedition.midlet (bao gồm lớp MIDlet). Kế đến ta định nghĩa lớp ứng dụng tên HelloQuangIT bằng cách mở rộng lớp MIDlet và sử dụng giao tiếp CommandListener để nhận sự kiện về các lệnh do người dùng điều kiển thông qua các phím bấm.
Ứng dụng của chúng ta cần một biểu mẫu (form) để thể hiện giao diện trên màn hình, vì vậy ứng dụng của chúng ta khai báo một biến có kiểu là Form với tên là mMainForm và biểu mẫu này sẽ dùng để chứa chuỗi ký tự “Hello World!”.
Kế đến chúng ta định nghĩa phương thức khởi tạo (constructor) và trong đó ta tạo mới một đối tượng biểu mẫu, sau đó tạo mới đối tượng StringItem và thêm đối tượng StringItem này vào đối tượng Form. Kế đến ta định nghĩa một lệnh với kiểu là Command dùng cho việc kết thúc chương trình. Một lệnh được đặt vào trong biểu mẫu thông qua phương thức addCommand(). Sau đó ta chỉ định chính lớp này sẽ là lớp xử lý các lệnh thông qua phương thức setCommandListener().
Mỗi ứng dụng viết cho điện thoại bằng MIDP đều phải kế thừa lớp trừu tượng MIDlet và phải định nghĩa đủ 3 phương thức là startApp(), pauseApp() và destroyApp(). Chắc các bạn cũng đoán ra được, startApp() được gọi khi khởi tạo ứng dụng, pauseApp() được gọi khi ứng dụng cần được tạm dừng, ví dụ như khi cần nhận một cuộc gọi đến. Còn phương thức destroyApp() được gọi khi thoát ứng dụng, thường là thông qua một lệnh thoát (Exit). Trong ví dụ Hello World này thì ta chỉ sử dụng phương thức startApp() để lấy đối tượng Display (màn hình) và đặt biểu mẫu mMainForm thành biểu mẫu hiện hành cho màn hình điện thoại. Vì phương thức này được gọi nên chúng ta sẽ thấy được chuỗi Hello World hiện trên màn hình điện thoại. Các bạn cũng chú ý là mặc dù ta không cần xử lý gì cho 2 phương thức còn lại là pauseApp() và destroyApp() nhưng ta vẫn phải khai báo thành phương thức rỗng vì đây là yêu cầu bắc buộc của một ứng dụng MIDlet.
Phương thức cuối cùng, commandAction() sẽ được gọi khi có lệnh nhấn từ người dùng. Ở đây ta chỉ đơn giản gọi phương thức notifyDestroyed() để kết thúc ứng dụng.
Tóm tắt
Như vậy các bạn đã nắm được những kiến thức cơ bản nhất về J2ME, và vì đây là những kiến thức nền tảng nhất nên các bạn sẽ còn tiếp tục sử dụng nó trong các bài sau. Các bạn cũng hiểu qua được mã nguồn ứng dụng HelloWorld của chúng ta và thử thay đổi một số chữ từ Anh sang Việt và chạy kiểm tra bản sửa đổi này. Trong bài sau chúng ta sẽ học cấu trúc tổng quát của một ứng dụng MIDlet bất kỳ và làm quen thêm một số thuật ngữ mới nữa. Hẹn gặp lại các bạn trong bài tới.
Theo javavietnam.org
0 comments:
Post a Comment