File JAD (Java Application Descriptor File):

Một phần của tài liệu LẬP TRÌNH ỨNG DỤNG MOBILE BẰNG JAVA (Trang 29)

3.3.2.1. Đặt tả

Những thông tin trong file jad sẽ cung cấp thông tin về các MIDlet trong file JAR. Từ thông tin này, bộ quản lý ứng dụng trên thiết bị mới quyết định ứng dụng này có thích hợp để chạy ứng dụng hay không. Bên cạnh đó, nó còn cung cấp các tham số dùng cho MIDlet để tránh thay đổi file JAR (file JAR chứa mã ứng dụng nên cần tránh bị thay đổi).

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.

Thuộc tính Mục đích Bắt buộc

MIDlet-Name Tên của bộ MIDlet Có

MIDlet-Version Số phiên bản Có

MIDlet-Vendor Cho biết người tạo MIDlet Suite Có

MIDlet-<n> 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.

MIDlet-Jar- URL

Địa chỉ URL của file Jar. Có

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

MIDlet-Data- Size

Kích thước tối thiểu tính bằng byte để ghi các dữ liệu của chương trình (persistent data).

Không

MIDlet- Description

Mô tả MIDlet (dạng text). Không

MIDlet-Delete- Confirm

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

MIDlet-Install- Notify

URL nhận thông báo về quá trình cài đặt. Không

Đây là 4 thuộc tính bắt buộc giống nhau ở file Jad và file mainfest (nằm trong file jar) :

 MIDlet – Name.

 MIDlet – Version.

 MIDlet – Vendor.

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 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. Sau đây là danh sách các hàm thường được dùng trong lớp MIDlet:

Bảng 4:Các phương thức trong MIDlet.

Phương thức Diễn tả String getAppProperty(String

key)

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 dụng gọi phương thưc này để làm một số công việc như lưu và giải phóng tài nguyên trước khi ứng dụng được đóng.

abstract void pauseApp() Quản lý ứng dụng sẽ gọi phương thức này trên

MIDlet khi người chơi game tạm dừng game lại.

abstract void startApp() Quản lý ứng dụng sẽ gọi lại phương thức này

khi người chơi muốn chơi lại từ đầu.

abstract void notifyDestroyed() Khi người chơi quyết định thoát game, thi

phương thức này được gọi để báo cho quản lý ứng dụng biết.

abstract void notifyPaused() Phương thức này được gọi để nói cho quản lý ứng dụng rằng người chơi muốn dừng MIDlet.

abstract void resumeRequest() Gọi phương thức này để nói cho quản lý ứng

dụng biết rằng MIDlet muốn khởi động lại.

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 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(), destroyApp(). Đây là một ví dụ về một chương trình MIDlet đơn giản:

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-

Description"));

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

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-Version: 1.0.1

MIDlet-Vendor: My Corporation Inc. MIDlet-1: ShowProps, , showProperties MicroEdition-Profile: MIDP-1.0

MicroEdition-Configuration: CLDC-1.0

MIDlet-Description: A simple property list example MIDlet-Data-Size: 1500

Nội dung của tập tin showProperties.jad: MIDlet-Name: Show Properties MIDlet MIDlet-Version: 1.0.1

MIDlet-Vendor: My Corporation Inc. MIDlet-Jar-URL: file://showProperties.jar MIDlet-Jar-Size: 1132

MIDlet-1: ShowProps, , showProperties JadFile-Version: 1.5

MIDlet-Data-Size: 500

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.

3.3.2.4. Lớp MIDlet:

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

Hình 8: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 Active thì 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 điều này đã đặt MIDlet vào trạng thái Paused. Một MIDlet có thể đặt chính nó vào trạng thái Paused bằng lời 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.

 Trình quản lý ứng dụng có thể kết thúc việc thực thi của MIDlet bằng lời gọi destroyApp(), tại thời điểm đó MIDlet bị phá hủy và chờ cho đến khi dọn dẹp rác xong. Một MIDlet có thể bị phá hủy bằng lời gọi hàm notifyDestroyed(). Startup Shutdown Paused Running Your MIDlet Quản lý ứng dụng

gọi các hàm pauseApp() destroyApp() Constructor called

CHƯƠNG 4: GIAO DIỆN ĐỒ HỌA

 Nội dung trình bày:

 Quản lý việc hiển thị và bắt sự kiện trong J2ME.  Giao diện đồ họa cấp cao.

 Giao diện đồ họa cấp thấp.

MIDP hỗ trợ thiết kế giao diện dưới hai cấp độ:

 Giao diện cấp cao (high-level interfaces): chủ yếu dùng cho các chương trình ứng dụng. Ở cấp độ này, MIDP cung cấp sẵn các thành phàp cho các thành phần giao diện thường dùng như textbox, choicegroup, alert… và hỗ trợ việc hiển thị các thành phần giao diện này lên màn hình thiết bị. Người viết chương trình chỉ cần gọi các phương thức đồ họa đã được sử dụng bên dưới.

 Giao diện cấp thấp (low-level interfaces): chủ yếu sử dụng trong các chương trình games. Các lớp đồ họa ở cấp thấp này cung cấp các phương thức vẽ trực tiếp các đối tượng đồ họa (như điểm, đường thẳng, đường tròn…) lên màn hình và bắt sự kiện bấm phím.

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.

Bảng 5:Các đối tượng trong giao diện đồ họa.

Lớp Miêu tả

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

PNG).

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.

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.

Graphics Cung cấp một công cụ đồ họa 2D.

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.

4.1. QUẢN LÝ VIỆC HIỂN THỊ VÀ BẮT SỰ KIỆN.

4.1.1. Quản lý việc hiển thị.

4.1.1.1. Lớp Display.

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 {

Form mainForm; Vidu()

{

mainForm = new Form (//………); }

public void startApp() {

Display display = Display.getDisplay(this); Display.setCurrent(mainForm);

} }

4.1.1.2. Lớp Displayable.

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

abstract public class Displayable;

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

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.

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

(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ạ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 họat 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 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(); } } 4.1.2. 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 đề cơ bản nhất của một chương trình. Có thể nói, trong thế giới thực 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 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ệ đ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 chỉ nghiên cứu về các sự kiện 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ư 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 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.

4.1.2.1. Command và CommandListener.

Ta định nghĩa Command là một đối tượng giữ thông tin về một sự kiện. 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.

Trong ví dụ trên ta thấy Command “Exit” tương ứng với một nút ấn trên điện thoại. Việc xem một Command tương ứng với một nút ấn trên thiết bị là một quan niệm nhằm đơn giản hóa vấn đề nhưng không hoàn toàn chính xác. Nếu chúng ta xem xét những hạn chế về kích thước của màn hình và số lượng command có thể nhiều hơn số nút ấn chức năng trên thiết bị, lúc này các command được tổ chức theo dạng menu. Trước tiên, ta sẽ tìm hiểu các công việc phải làm để thêm một command vào ứng dụng:

 Tạo một command để lưu 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 form

private Form frmMain;.

//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(); } } }

Qua ví dụ trên ta thấy việc tạo một command và xử lý nó tương đối đơn giản. Điểm quan trọng cần chú ý là lớp ứng dụng của ta phải cài đặt một bộ listener (trong ví dụ trên ta implements từ CommandListener) và phải cung cấp hàm commandListener để xử lý các events.

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

Một phần của tài liệu LẬP TRÌNH ỨNG DỤNG MOBILE BẰNG JAVA (Trang 29)

Tải bản đầy đủ (PDF)

(156 trang)