Cấu trúc cơ bản:

Một phần của tài liệu Nghiên cứu JM và xây dựng ứng dụng minh họa (Đặng Nguyễn Kim Anh vs Đào Anh Tuấn) - 1 pps (Trang 37 - 45)

Chúng ta gọi chung các chương trình J2ME là MIDlet. Các chương trình MIDlet này đều được kế thừa từ lớp MIDlet. Không giống như chương trình trên máy PC, các chương trình MIDlet không cần hàm main() để thực thi. Trước hết chúng ta sẽ

xem xét về “vòng đời” (lifecycle) của các ứng dụng MIDlet.

Một chương trình MIDlet khi được nạp vào thiết bị có những trạng thái sau:

– Paused: Một chương trình MIDlet sẽđược đưa vào trạng thái paused sau khi thực hiện phương thức khởi tạo (constructor) và trước khi được chương trình quản lý ứng dụng (application manager) trên thiết bị gọi thực thi. Trong quá trình hoạt động, chương trình MIDlet cũng có thể bị đưa trở lại trạng thái paused bởi thiết bị (khi cần trả lời cuộc gọi đến …) hoặc bởi chính chương trình MIDlet.

– Active: Chương trình MIDlet đang thực thi.

– Destroyed: Chương trình MIDlet đã giải phóng tất cả tài nguyên và đã được tắt bởi trình quản lý ứng dụng trên thiết bị.

3.2. Xây dng mt ng dng MIDlet:

Chúng ta xây dựng một ứng dụng MIDlet bằng cách kế thừa (extends) lớp MIDlet. Lớp này thực chất là một interface và chúng ta phải khai báo ba hàm sau

đây: startApp(), pauseApp() và destroyApp(). Đây là một ví dụ về một chương trình MIDlet đơn giản:

public class Shell extends MIDlet {

Java Mobile

// phương thức khởi tạo (constructor) không bắt buộc phải có

public Shell(){ … }

// Được application manager gọi trước khi thực thi MIDlet

public void startApp(){…}

// Được gọi trước khi tạm dừng MIDlet

public void pauseApp(){ …}

// Được gọi trước khi kết thúc chương trình

public void destroyApp(boolean unconditional){… } }

3.3. Lp MIDlet:

Nhưđã đề cập, mọi ứng dụng của ta đều kế thừa từ lớp MIDlet. Lơp này được khai báo như sau:

public abstract class MIDlet { …

protected abstract void startApp() throws MIDletStateChangeException; protected abstract void pauseApp();

protected abstract void destroyApp(boolean unconditional) throws

MIDletStateChangeException; }

Ba hàm được nêu ở trên là ba hàm bắt buộc chúng ta phải xây dựng khi tạo ứng dụng MIDlet. Lớp MIDlet được chứa trong package javax.microedition.midlet Sau đây là danh sách các hàm thường dùng trong lớp MIDlet:

Phương thức: Mô tả:

abstract void destroyApp

(boolean unconditional)

Hàm này được gọi khi có nhu cầu tắt MIDlet. Đây là nơi giải phóng các tài nguyên đã dùng.

Java Mobile

trước khi tạm dừng chương trình.

abstract void startApp() Được gọi khi MIDlet sắp được đưa vào trạng thái thực thi (active state).

final void notifyDestroyed() Báo cho application manager biết chương trình MIDlet đã giải phóng tài nguyên và cần được tắt. (sau khi gọi destroyApp)

final void notifyPause() Báo cho application manager biết chương trình MIDlet đã giải phóng tài nguyên và muốn vào trạng thái tạm dừng (sau khi gọi pauseApp)

final void resumeRequest() Báo cho application manager ta cần đưa MIDlet vào trạng thái hoạt động trở lại. (Sau đó application manager sẽ gọi startApp).

final String getAppProperty

(String key)

Lấy các thông số của chương trình (từ file jad và file manifest).

Bảng 3.1 Lớp MIDlet

Ở đây chúng tôi xin mô tả hai quá trình quan trọng nhất của một ứng dụng MIDlet là quá trình khởi nạp và quá trình thoát ứng dụng:

– Quá trình nạp:

• User chọn kích hoạt ứng dụng MIDlet

• Application manager khởi tạo các biến, gọi phương thức khởi tạo (constructor).

• Ứng dụng MIDlet sau khi được nạp vào bộ nhớ sẽđược đưa vào trạng thái paused (nhưng hàm pauseApp() sẽ không được gọi).

• Application manager gọi hàm startApp(). Thực chất hàm startApp() sẽ được gọi mỗi khi ứng dụng được đưa vào trạng thái thực thi (active); khi ta tạm ngưng ứng dụng và có nhu cầu kích hoạt trở lại hàm này cũng được gọi.

– Quá trình thoát:

Java Mobile

• Hàm destroyApp() được gọi, hàm này phải bảo đảm việc giải phóng tài nguyên.

• Hàm notifyDestroyed() được gọi để báo cho application manager ứng dụng

đã giải phóng hết tài nguyên và sẵn sàng bị tắt.

3.4. Lp MIDletStateChangeException:

Khi tìm hiểu về package javax.microedition.midlet, còn một lớp quan trọng chúng ta phải chú ý đến là lớp MIDletStateChangeException. Ứng dụng MIDlet có hai hàm có khả năng tạo ra (throw) Exception này là hàm destroyApp() và hàm startApp().

Như chúng ta đã biết, trước khi ứng dụng được đưa vào trạng thái active thì hàm startApp() sẽđược gọi. Nếu trong quá trình gọi hàm này dẫn đến phát sinh lỗi (thiết bị hết tài nguyên, tài nguyên cần dùng đang bị ứng dụng khác chiếm…) thì MIDletStateChangeException sẽ được tạo ra. Trong quá trình thoát, hàm destroyApp() cũng có thể phát sinh exception này, ví dụ như khi chúng ta thoát mà chương trình đang nhận dữ liệu hết sức quan trọng từ network ta có thể phát sinh exception để dừng việc thoát.

Ta xem xét hàm destroyApp(boolean condition):

Tham số condition ở đây có một ý nghĩa khá thú vị, nếu tham số này là true dù chúng ta có phát sinh exception MIDletStateChangeException thì ứng dụng vẫn thoát; chỉ khi nào tham số này là false thì exception MIDletStateChangeException mới có khả năng hủy việc thoát chương trình.

3.5. Display

Ứng dụng của chúng ta chắc chắn có nhu cầu xuất dữ liệu ra màn hình. Việc này trong một ứng dụng MIDlet do một đối tượng thuộc lớp display đảm nhiệm. Lớp này nằm trong package javax.microedition.lcdui, package này chứa hầu như tất cả các lớp phục vụ cho việc phát triển giao diện của ứng dụng.

Java Mobile

Phương thức: Mô tả:

static Display getDisplay(MIDlet m) Lấy đối tượng Display của MIDlet

Displayable getCurrent() Lấy đối tượng Displayable hiện thời (sẽđề

cập sau) void setCurrent (Alert alert,

Displayable nextDisplayable) void setCurrent (Displayable nextDisplayable)

Tạo đối tượng alert (sẽđề cập sau)

boolean isColor() Cho biết thiết bị có hỗ trợ màu hay không? int numColors() Có bao nhiêu màu được hỗ trợ?

Bảng 3.2 Lớp Display

Một MIDlet sẽ có một và chỉ một đối tượng Display để điều khiển việc thể hiện dữ

liệu. Đối tượng Display không có phương thức khởi tạo mà được khởi tạo trực tiếp từ phương thức static của lớp.

Ví dụ:

Display display=Display.getDisplay(this);

Tham số đầu vào là một MIDlet, ở đây chúng ta gọi hàm từ lớp kế thừa từ

MIDlet nên có thể truyền vào con trỏ this. Thực ra công dụng chính của Display là cho phép hiển thị đối tượng nào lên màn hình hiện thời. Các đối tượng có thể hiển thị lên màn hình là các đối tượng thuộc lớp Displayable (sẽđược giới thiệu sau), ví dụ như form, TextBox, Canvas,Screen…

Ta xét ví dụ sau:

public class Vidu extends MIDlet {

Form mainForm; Vidu{

mainForm=new Form(…….); }

Java Mobile

public void startApp() { ……… Display display=Display.getDisplay(this); Display.setCurrent(mainFrom); ………. } ………. }

Ban đầu ta khởi tạo một form để thể hiện lên màn hình, sau khi ứng dụng MIDlet được nạp vào bộ nhớ constructor được gọi để tạo form. Sau đó, phương thức startApp() được gọi, trong phương thức này ta chọn Form mainForm để thể

hiện lên màn hình bằng lệnh setCurrent. Khi ứng dụng bị tạm ngưng (paused) và phục hồi trở lại (resume) thì hàm startApp() cũng được gọi và form lại được thể

hiện trên màn hình. Đến đây chúng ta có thể hình dung được phần nào tác dụng của

đối tượng Display.

3.6. Lp Displayable:

Nhưđã đề cập, một ứng dụng MIDlet chỉ có một đối tượng Display duy nhất và

đối tượng Display này dùng để thể hiện các đối tượng Displayable lên màn hình. Như tên của lớp Displayable cho chúng ta thấy, đây là các đối tượng có khả năng hiển thị thông tin lên màn hình thiết bị. Lớp Displayable bao gồm 2 lớp con là lớp Screen và lớp Canvas. Cụ thể chúng được định nghĩa như sau:

abstract public class Displayable;

public abstract class Canvas extends Displayable; public abstract class Screen extends Displayable;

Java Mobile

Lớp Screen còn được chia thành những lớp con nhỏ hơn như: TextBox, List, Form và Alert. Đây là những lớp giao diện cấp cao (vì phần lớn các công việc thể

hiện của các lớp này đã được cài đặt sẵn). Các đối tượng của lớp Canvas được gọi là những đối tượng đồ họa cấp thấp, các lớp này cho phép chúng ta xử lý các giao tác

đồ họa ở tầng dưới, xử lý màu sắc và chủ yếu dùng trong quá trình viết games. Ở

những phần sau chúng ta sẽ tìm hiểu kỹ hơn về các lớp giao diện ở cấp thấp lẫn cấp cao.

* Tạo một đối tượng Displayable:

Thông thường chúng ta không tạo trực tiếp một đối tượng thuộc lớp Displayable mà sử dụng các lớp con của nó. Để viết các ứng dụng đồ họa ta thường kế thừa từ

lớp Canvas:

public class GameScreen extends Canvas {

draw images, shapes, text … }

Khi xây dựng các ứng dụng tiện ích (ít dùng đến các chức năng đồ họa) ta sẽ dùng các lớp đồ họa cấp cao như Form, TextBox … hoặc kế thừa từ các lớp này.

Các hàm chính của lớp Displayable:

Phương thức: Mô tả:

void addCommand(Command cmd) Thêm một đối tượng Command vào đối tượng Displayable

void removeCommand (Command cmd)

Xóa bỏ một đối tượng Command từ đối tượng Displayable

void setCommandListener

(CommandListener l)

Thêm CommandListener vào đối tượng Displayble

Java Mobile

boolean isShown() Kiểm tra đối tượng Displayable có được thể hiện trên thiết bị hay không?

Bảng 3.3 Lớp Displayable

*Ghi chú: Các đối tượng Command và CommandListener sẽđược đề cập chi tiết ở

phần sau.

Tại thời điểm này chúng ta có thể hình dung một Command như một nút ấn điều khiển trong ứng dụng của chúng ta, CommandListener có tác dụng chuyển các sự

kiện khi người dùng kích hoạt một Command đến lớp xử lý của ứng dụng. Để “bắt”

được các sự kiện được chuyển tới khi người dùng kích hoạt một Command, ứng dụng của chúng ta phải cài đặt hàm commandAction. Ví dụ như sau:

public void commandAction(Command c, Displayable s) { if (c == cmExit) { destroyApp(true); notifyDestroyed(); } } 3.7. Qun lý các s kin (event)

Ngày nay, việc xử lý sự kiện là một trong những vấn đề cơ bản nhất của một chương trình. Có thể nói, trong thế giới phần mềm ngày nay không một chương trình nào lại không có khả năng tương tác với người dùng, do đó việc quản lý các sự

kiện phát sinh là một vấn đề mà bất cứ phần mềm nào cũng phải thực hiện. Quá trình xử lý các sự kiện phát sinh bao gồm 3 quá trình cơ bản:

• Phần cứng (thiết bị di động) phải cảm nhận được khi có một sự kiện phát sinh: người dùng ấn một phím, một cable được cắm vào hay rút ra.

Java Mobile

• Phần mềm trên thiết bị (hệđiều hành) phải nhận biết được có sự kiện phát sinh

• Hệđiều hành chuyển thông tin về sự kiện cho ứng dụng, bắt đầu từđây là công việc của những lập trình viên J2ME. Tùy theo các thông tin về sự

kiện mà chúng ta phải đưa ra các giải pháp thích hợp

Trong phần này chúng ta sẽ chỉ nghiên cứu về các sự kiện được phát sinh ở

những ứng dụng sử dụng các chức năng đồ họa ở mức cao (Form, TextBox…), còn các sự kiện phát sinh ở những ứng dụng sử dụng các thư viện đồ họa ở mức thấp như các games sẽđược đề cập sau.

Thực chất để nhận được thông báo từ hệđiều hành về các sự kiện phát sinh lớp

ứng dụng chính của chúng ta phải cài đặt (implement) các “listener”. Trong J2ME hỗ trợ sẵn cho chúng ta 2 listener là CommandListener và ItemStateListener. Lớp CommandListener có hàm commandListener() và tương ứng lớp ItemStateListener có hàm itemStateChange(), đây là 2 hàm chúng ta cần cài đặt để nhận biết các sự

kiện xảy ra. Trước khi đi sâu vào xử lý các sự kiện chúng ta sẽ tìm hiểu 2 tác nhân chính phát sinh một sự kiện là Command và Item.

Một phần của tài liệu Nghiên cứu JM và xây dựng ứng dụng minh họa (Đặng Nguyễn Kim Anh vs Đào Anh Tuấn) - 1 pps (Trang 37 - 45)