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.
Maõ chöông trình cho moä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
}
}