Do thời gian viết bài có hạn nên trong khuôn khổ bài viết này, tôi chỉ đưa ra một số nét cơ bản về Push Registry và tiếp cận kĩ thuật này bằng một ứng dụng minh họa hết sức đơn giản. Nội dung đầy đủ của hướng dẫn về Push Registry các bạn có thể tìm thấy tại đây
Mở đầu
Thông thường, để "chạy" một ứng dụng J2ME trên thiết bị di động, người sử dụng cần thông qua các menu của thiết bị để chọn và kích hoạt ứng dụng. Mỗi MIDlet sẽ trải qua vòng đời gồm các trạng thái: Hoạt động (Actived), Tạm dừng (Paused) và Bị hủy (Destroyed)
Push Registry là một phần của hệ thống Quản lý ứng dụng (Application Management System - AMS), một hệ thống nằm sẵn trong các thiết bị di động và đảm trách việc điều phối hoạt động của các ứng dụng qua các trạng thái như đã nói ở trên.
Trong J2ME, PushRegistry là một phần của hệ thống Generic Connection Framework (GCF), trong lớp javax.microedition.io.PushRegistry.
PushRegistry không làm thay đổi quá trình chuyển đổi giữa các trạng thái của một MIDlet mà chỉ cung cấp cho ta thêm 2 cách thức mới để cho phép MIDlet được thực thi, đó là:
- Dựa vào các kết nối tác động đến thiết bị (VD: SMS gửi đến hay Kết nối Bluetooth, ...)
- Dựa vào xác lập thời gian
Đăng ký nạp ứng dụng
Để có thể nạp một cách tự động, mối MIDlet phải đăng ký với hệ thống Push Registry theo 1 trong 2 cách
- Đăng ký tĩnh: bằng cách thiết lập thuộc tính MIDlet-Push trong file đặc tả của bộ cài đặt MIDlet (*.JAD)
- Đăng ký động: sử dụng các API của PushRegistry để đăng ký trong thời gian chạy.
- Kích hoạt ứng dụng dựa vào các kết nối
- Kích hoạt dứng dụng dựa vào xác lập thời gian
Trong khuôn khổ bài viết này, tôi giới thiệu cách đăng ký kích hoạt một MIDlet dựa vào xác lập thời gian
Đoạn chương trình sau, ta đăng ký để MIDlet được nạp tự động bằng cách sử dụng phương thức
PushRegistry.registerAlarm(MIDlet, time)
private void registerAlarm() {
final String className = this.getClass().getName();//tên MIDlet được đăng ký
final Date d=
new Date();//dùng để xác định thời gian đăng ký
final Calendar cal = Calendar.getInstance();
cal.setTime(d);
//15h55
cal.set(Calendar.HOUR, 15);
cal.set(Calendar.MINUTE, 55);
//việc đăng ký cần được thực hiện trong 1 luồng riêng để tránh treo toàn bộ MIDlet khi chờ đăng ký
Thread t = new Thread(new Runnable(){ // tạm thời tôi viết đối tượng Runnable không tường minh
public void run() {
try {
//đăng ký để MIDlet được tự động nạp vào lúc 15h55
PushRegistry.registerAlarm(className, cal.getTime().getTime() );
} catch (ConnectionNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
});
t.start();
}
Để hủy đăng ký, ta sử dụng chương trình tương tự với thời gian chỉ định =0
private void removeAlarm() {
final String className = this.getClass().getName();//tên MIDlet được đăng ký
//việc đăng ký cần được thực hiện trong 1 luồng riêng để tránh treo toàn bộ MIDlet khi chờ đăng ký
Thread t = new Thread(new Runnable(){ // tạm thời tôi viết đối tượng Runnable không tường minh
public void run() {
try {
//hủy đăng ký MIDlet
PushRegistry.registerAlarm(className, 0);
} catch (ConnectionNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
});
t.start();
}
Ví dụ này đã được chạy thử trên Nokia 6300. Khi chạy ứng dụng này, bạn hãy vào chọn mục Enable trong của ứng dụng, sau khi trả lời Yes cho các câu hỏi về Permission, bạn hãy thoát khỏi ứng dụng bằng command Exit. Đến thời gian định trước, MIDlet này sẽ tự động chạy.
Toàn bộ nội dung mã nguồn của ứng dụng bạn có thể download trong file đính kèm