MIDlet là gì?
Mobile Information Device Profile (MIDP) là tập các hàm API dành cho thiết bị thông
tin di động. MIDlet là ứng dụng MIDP. Thuật ngữ MIDlet và MID application được sử
dụng như nhau. Các MIDlets hình thành nên các khối xây dựng của môi trường thực thi
Java 2 Platform, Micro Edition (J2ME).
MIDlet được thiết kế để chạy và được điều khiển bởi trình quản lý ứng dụng trong máy
ảo K (K Virtual Machine - KVM), một dạng thô thiển nhất của máy ảo Java được thiết
kế để chạy trên thiết bị di động. Lớp javax.microedition.midlet.MIDlet hoạt động như là
một giao diện (interface) giữ MIDlet và trình quản lý ứng dụng. Các phương thức thuộc
lớp này cho phép trình quản lý ứng dụng tạo, bắt đầu, tạm dừng, và hủy MIDlet
Các ứg dụng J2ME phải kế thừa (extend) lớp javax.microedition.midlet.MIDlet, L p ớ
này cung c p m t khung làm vi c (framework) cho các ho t ng sau:ấ ộ ệ ạ độ
• Cho phép trình quản lý ứng dụng điều khiển MIDlet bằng cách thông báo và yêu
cầu thay đổi các trạng thái
• Cho phép MIDlet lấy các thuộc tính từ application descriptor, một đăng ký
(registry) của các ứng dụng được duy trì bưởi trình quản lý ứng dụng
Hình sau mô tả sự tương tác giữa MIDle và trình quản lý ứng dụng
Vòng đời của MIDlet
Lớp chính của một MIDlet kế thừa là lớp javax.microedition.midlet.MIDlet. Lớp chính
định nghĩa ba phương thức hành động trong chu kỳ sống của nó: startApp(), pauseApp(),
và destroyApp().
Có ba trạng thái trong vòng đời của một MIDlet:
• paused: MIDlet instance đã được tạo song và chưa hoạt động (inactive)
• active: MIDlet là hoạt động.
• destroyed: MIDlet đã kết thúc và sẵn sàng cho việc tái chế bởi bộ thu gom rác.
Chú ý ở đây không có trạng thái nào tương đương với trạng thái loaded của applet, bởi vì
ở đây không có phương thức khởi tạo. Thông thường, một MIDlet khởi tạo chính nó
ngay lần đầu tiên khi phương thức startApp() c g i.đượ ọ
Hình: các trạng thái của MIDlet
Các thể hiện MIDlet được tạo bởi AMS, đặc thù trong việc đáp ứng yêu cầu của người
sử dụng. Ví dụ, AMS có thể liệt kê tất cả các MIDlet đã được cài vào hệ thống để cho
phép người sử dụng lựa chọn.
Trạng thái khởi đầu của MIDlet là paused. Giống như applet, một MIDlet phải thực hiện
một ít hoặc không làm việc khởi tạo trong constructor củ nó, bởi vì ngữ cảnh hoạt động
của nó chưa được thiết lập.
Tại một thời điểm sau khi xây dựng, AMS kích hoạt MIDlet và gọi phương thức
startApp(). Sau khi thực hiện các việc khởi tạo cần thiết, startApp() tạo và hiển thị giao
diện người sử dụng. Sau khi kết thúc phương thức startApp(). Trạng thái của MIDlet
chuyển từ paused sang active. Nếu MIDlet không thể khởi tạo chính nó vì một lý do nào
đó, nó phải nếm ra một ngoại lệ javax.microedition.midlet.MIDletStateChangeException
ngay lập tức nó chuyển đến trạng thái destroyed.
Sự làm mất tác dụng (Deactivation) xảy ra trên bất kỳ sự chuyển nào từ trạng thái active
đến trạng paused. MIDlet chưa bị hủy, nhưng nó phải giải phóng bất cứ nguồn tài
nguyên hệ thống nào có thể được. Nếu deactivation được tạo bởi hệ thống, phương
thức pauseApp() được gọi. Nếu MIDlet deactive chính nó, bằng cách sử dụng ngữ cảnh
hoạt động của MIDlet, phương thức pauseApp() không được gọi.
Sự phá hủy (Destruction) xảy ra khi MIDlet chuyển đến trạng thái destroyed từ trạng thái
active hoặc paused. Nếu sự phá hủy được tạo bởi AMS, phương thức destroyApp() được
gọi. Một đối số kiểu boolean được truyền cho phương thức này để chỉ ra hoặc là phá hủy
vô điều kiện hoặc là tùy ý. MIDlet có thể từ chối phá hủy tùy ý bằng cách nếm ra một
ngoại lệ MIDletStateChangeException. Nếu MIDlet phá hủy chính nó phương thức
destroyApp() không được gọi.
Mã chương trình cho một MIDlet như sau:
import javax.microedition.midlet.*;
public class BasicMIDlet extends MIDlet {
public BasicMIDlet(){
// constructor - don't do much here
}
protected void destroyApp( boolean unconditional )
throws MIDletStateChangeException {
// called when the system destroys the MIDlet
}
protected void pauseApp(){
// called when the system pauses the MIDlet
}
protected void startApp()
throws MIDletStateChangeException {
// called when the system activates the MIDlet
}
}
Môi trường hoạt động MIDlet
Lớp javax.microedition.midlet.MIDlet thường định nghĩa các phương thức nó cho phép
MIDlet tương tác với môi trường hoạt động : getAppProperty() trả về giá trị thuộc tính
khởi tạo; resumeRequest() yêu cầu AMS để reactivate MIDlet; notifyPaused() dịch
chuyển MIDlet đến trạng thái paused; và notifyDestroyed() dịch chuyển MIDlet đến
trạng thái destroyed.
Thuộc tính khởi tạo MIDlet là tứng cặp tên-giá trị nằm trong application descriptor hoặc
trong manifest của MIDlet. application descriptor là một file text riêng lẽ nó liệt kê
thông tin quan trọng về một tập các MIDlet được đóng gói lại thành một file JAR duy
nhất (a MIDlet suite). Manifest là một bản kê JAR chuẩn được đóng gói cùng với MIDlet
suite. Khi phương thức getAppProperty() được gọi, nó tìm application descriptor trước,
sau đó là manifest. (Chú ý trong MIDP 2.0 đưa ra một khái niệm về trusted suite, ở đó
getAppProperty() chỉ tìm manifest.)
The remaining methods directly affect the MIDlet's life-cycle. A paused MIDlet calls
resumeRequest() to be reactivated. An active MIDlet calls notifyPaused() to be
deactivated. A paused or active MIDlet calls notifyDestroyed() to be destroyed. Note that
resumeRequest() merely asks the AMS to reactivate the MIDlet; the AMS decides
whether and when to reactivate the MIDlet. Reactivation invokes the MIDlet's startApp()
method. By contrast, notifyPaused() or notifyDestroyed() causes an immediate transition
to the new state; as a consequence, neither pauseApp() nor destroyApp() is invoked.
Các phương thức còn lại trực tiếp ảnh hưởng đến chu kỳ sống của MIDlet. Trạng thái
paused của MIDlet gọi phương thức resumeRequest() c kích ho t l i. Tr ng để đượ ạ ạ ạ
thái active c a MIDlet g i ph ng th c notifyDestroyed() b phá h y. Chú ý ủ ọ ươ ứ để ị ủ
r ng ph ng th c resumeRequest() ch yêu c u AMS kích ho t l i MIDlet; AMS m i ằ ươ ứ ỉ ầ ạ ạ ớ
có quy n quy t nh có hay không c ng nh khi nào thì MIDlet c khích ho t. Sề ế đị ũ ư đượ ạ ự
kích ho t l i g i ph ng th c ạ ạ ọ ươ ứ startApp() c a ủ MIDlet. Khác với, notifyPaused()
hoặc notifyDestroyed() gây ra m t chuy n tr ng thái t c th i n tr ng thái m i;ộ ể ạ ứ ờ đế ạ ớ
h qu là ho c pauseApp()ệ ả ặ hoặc destroyApp() được gọi.
Mã chương trình cho một MIDlet như sau:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class BetterMIDlet extends MIDlet {
private Display display;
public BetterMIDlet(){
}
protected void destroyApp( boolean unconditional )
throws MIDletStateChangeException {
exitApp(); // call cleanup code
}
protected void pauseApp(){
// add pause code here
}
protected void startApp()
throws MIDletStateChangeException {
if( display == null ){
initApp(); // perform one-time initialization
}
// add per-activation code here
}
private void initApp(){
display = Display.getDisplay( this );
// add initialization code here
}
public void exitApp(){
// add cleanup code here
notifyDestroyed(); // destroys MIDlet
}
}
Xử lý sự kiện
Khi một người sử dụng tương tác với MIDlet, sự kiện sẽ được sản sinh. MIDlet cung cấp
một vài interface như một phần của cơ chế xử lý sự kiện sao cho trình ứng dụng có thể
được thông báo về các sự kiẹân và đáp ứng lại chúng. Mỗi một interface cung cấp một
phương thức được biết như là phương thức callback, Chúng là những lời gọi của các
phương thức do người lập trình định nghĩa chúng được thực thi bởi ứng dụng trong đáp
ứng lại sự kiện.
Các sự kiện có thể được sinh ra trong khi MIDlet đang chạy bao gồm:
• Nhập từ màn hình lệnh (Input from screen commands )
• Những thay đổi trạng thái của các item
• Những thay đổi trạng thái của cơ sở dữ liệu tương ứng với MIDlet
Cơ chế xử lý sự kiện trong MIDlet dựa trên mô hình listener. Mỗi đối tượng cài đặt một
listener sao cho nó có thể được thông báo và đáp ứng lại sự kiện. Để đạt được điều này,
MIDlet cung cấp ba interface: ItemStateListener, CommandListener, and RecordListener.
Nào chúng ta hãy xem mỗi interface một cách chi tiết hơn.
CommandListener
Một CommandListener m nhi m vi c thông báo cho MIDlet v b t k s ki n nào đả ệ ệ ề ấ ỳ ự ệ
c sinh ra b i các thành ph n có th hi n th (đượ ở ầ ể ể ị displayable items). Nó cung c p ấ
m t ph ng th c commandAction(Command c, Displayable d) mà i t ng k th a ộ ươ ứ đố ượ ế ừ
listener ph i cài t. Ph ng th c này ch ra m t s ki n l nh (command event )ả đặ ươ ứ ỉ ộ ự ệ ệ
ã x y ra trên Displayable dđ ả .
ItemStateListener
An ItemStateListener is responsible for notifying the MID application of any change in
the internal state of a display item (e.g., the value of a TextField on the screen). It
provides an itemStateChanged(Item I) method called when the internal state of an item
has been changed by the user. The change in internal state can be due to the user:
Một ItemStateListener m nhi m vi c thông báo cho MIDlet v b t k s ki n nàođả ệ ệ ề ấ ỳ ự ệ
c sinh ra b i tr ng thái trong c a m t thành ph n hi n th (đượ ở ạ ủ ộ ầ ể ị display item) (ví
d , giá tr trong ô textField trên màn hình). Nó cung c p m t ph ng th c ụ ị ấ ộ ươ ứ
itemStateChanged(Item i) c g i khi tr ng thái trong c a m t thành ph (item) đượ ọ ạ ủ ộ ầ
b thay i b i ng i s d ng. S thay i tr ng thái trong có th do ng i s ị đổ ở ườ ử ụ ự đổ ạ ể ườ ử
d ngụ
• Thay đổi gía trị các giá trị đã được thiết lập tren một ChoiceGroup
• Điều chỉnh giá trị của một Gauge töông tác
• Nhập hoặc sửa giá trị của một TextField
• Nhập vào ngày mới trong một DateField
Thiết bị phải quyết định khi nào nó xem xét một giá trị mới được nhập vào cho một item.
Ví dụ, cài đặt của một TextField có thể chỉnh sửa được rất khác nhau giữa các thiết bị
Một ItemStateListener s không c g i n u ng d ng t thay i giá tr c a ẽ đượ ọ ế ứ ụ ự đổ ị ủ
m t thành ph n t ng tác (ộ ầ ươ nteractive item), chỉ có người sử dụng mới thực hiện được
RecordListener
RecordListener ch u trách nhi m nh n các s ki n liên quan n m u tin ị ệ ậ ự ệ đế ẫ
(record) t kho l u tr m u tin t ng ng v i ng d ng. s d ng nó, trình ngừ ư ữ ẫ ươ ứ ớ ứ ụ Để ử ụ ứ
d ng ph i cài t các ph ng th c sau, các ph ng th c này do RecordListener ụ ả đặ ươ ứ ươ ứ
cung c pấ
• recordAdded(): Được gọi khi một record được thêm vào kho lưu trữ record(record
store).
• recordDeleted(): Được gọi sau khi một record bị xóa.
• recordChanged():Được gọi sau khi một record bị thay đổi.
Kết hợp listener với các đối tượng
Các Listener phải được kết hợp với sự kiên để cho các đối tượng này đáp ứng lại sự kiện
khi MIDlet thi hành. Các lớp MIDlet cung cấp một vài phương thức để kết hợp một đối
tượng lắng nghe sự kiên với một đối tượng
• setCommandListener(): Phương thức này thiết lập một đối tượng lắng nghe sự
kiện cho mọi command của đối tượng Displayable, thay thế tất cả đối tượng
CommandListener trö c ñây.ớ
• setItemStateListener(): Phương thức này thiết lập item state listener cho các thàng
phần hiển thị, thay thế các itemStateListener có trước.
• addRecordStateListener(): Phương thức này thêm record state listener vào record
store.
Hình sau cho thấy mô hình xử lý sự kiện MIDlet.
Các ngoại lệ MIDlet
Một MIDlet có khả năng giải quyết các tình huống bất thường thông qua exception
handling. Một ngoại lệ (exception) là một sự kiện nó xảy ra trong suốt quá trình thực thi
của một chương trình nó phá vỡ luồn sự kiện chuẩn của các chỉ thị lệnh. MIDlet duy trỳ
cơ chế xử lý ngoại lệ Java. Khi một lỗi như thế xảy trong một phương thức, phương thức
sẽ tạo ra một đối tượng ngoại lệ và nếm nó cho hệ thống thực thi. Đối tượng ngoại lệ
(exception) chứa thông tin về ngoại lệ, bao gồm loại ngoại lệ và trạng thái của chương
trình khi lỗi xảy ra. Sau hệ thống thực thi chịu trách nhiệm tìm một vài mã nguồn (code)
để xử lý lỗi. Trong kỹ thuật Java, việc tạo một đối tượng ngoại lệ và nếm nó cho môi
trường thực thi được gọi bởi throwing an exception.
Giống như chúng ta đã từng thấy trước đây. MIDlet có thể trải qua các trạng thái khác
nhau trong đời sống (lifetime) của nó. MIDlet báo hiệu bằng cách nếm ra một
MIDletStateChangeException ẩn để thông báo yêu cầu thay đổi trạng thái MIDlet đã bị
thất bại.
. chương trình cho một MIDlet như sau:
import javax.microedition .midlet. *;
public class BasicMIDlet extends MIDlet {
public BasicMIDlet(){
// constructor. throws MIDletStateChangeException {
// called when the system activates the MIDlet
}
}
Môi trường hoạt động MIDlet
Lớp javax.microedition .midlet. MIDlet