J2ME: Căn bản về Push Registry


Push Registry là một kĩ thuật mới có trong MIDP2.0(JSR 118) của J2ME. Nó cho phép các MIDlet có thể được nạp một cách tự động mà không cần đến sự kích hoạt của người dùng.

 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)
MIDlet life cycle
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à:

  1. 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, ...)
  2. Dựa vào xác lập thời gian

MIDlet with PushRegistry

Đă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

  1. Đă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)
  2. Đăng ký động: sử dụng các API của PushRegistry để đăng ký trong thời gian chạy.
    1. Kích hoạt ứng dụng dựa vào các kết nối
    2. 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

 


( đã được xem 4710 lần từ 12/04/2010 )

Tệp đính kèm

  1. PushedMIDlet.zip(1684 lượt tải về)

Phản hồi bài viết

   
Họ tên  
Email*
Mã xác thực email
Tiêu đề*
Nội dung*
Đính kèm 
 
 
Nguyễn Mạnh Tuấn tuannm2711@...
Push Registry
Em đang làm về J2ME. Em thấy bài viết rất hay. Nhưng em khôgn biết tự động khởi động chương trình khi máy nhận dc tin nhắn thế nào? Anh có thể giải thích hoặc gửi code lên cho em tham khảo sớm dc không anh. Em xin cảm ơn. Anh có thể gửi vào mail cho em hoặc đưa lên trang của anh
Trịnh Lê Tú trinhletu@...
Lỗi XML trong pushedMIDlet
Em đã download về và chạy thử thì phát sinh lỗi trong một file XML: ( Corrupt JAR, error while reading: Midlet.class
E:\Push\nbproject\build-impl.xml:905: Execution failed with error code 1.
BUILD FAILED (total time: 3 seconds). Thầy giúp em với, em cảm ơn thầy!!!
Hữu Dũng huudungle@...
re Tú
Trên Emulator thì khi exit là exit luôn cả Emulator (giống như tắt nguồn điện thoại) nên tạm thời không thử được.
Có thể có cách để thoát ứng dụng mà Emulator vẫn chạy, em thử tìm hiểu xem, nếu được thì share lại cho mọi người nhé.
Cám ơn em.
Trịnh Lê Tú trinhletu@...
Thắc mắc!
Cái này không chạy được trên điện thoại ảo sao thầy? Trên Java wireless toolkit được ko ạ?
 langtu4482000@...
Thầy cho em hỏi
Thưa thầy, em đã chạy thử chương trình trên bằng NetBean và kết quả là qua thời gian hẹn giờ mà vẫn không có hiện tượng gì. Em cảm ơn thầy!
hoai linh hoailinh78x@...
e co bai nay co the chay dc tren iphone
Cac ban co the download bai nay ve chay tren iphone
Tệp đính kèm
  1. PushedMIDlet_iphone.zip(1160 lượt tải về)
le tuan anh ltanhictu@...
hỏi về j2me
Em thưa Thầy! E chạy 1 ví dụ J2ME nhưng gặp lỗi ClassNotFoundExeption vidu.
Thầy cho em hỏi nguyên nhân và các khắc phục với ạ.
Code sau khi build thì complete hoàn toàn không có lỗi gì cả.
Thầy giúp em với.E cảm ơn Thầy !
huudung huudungle@...
PushedMIDlet
@Phan Bá Tuấn:
File này không đặt mật khẩu
Phan Bá Tuấn batuan_robeck128@...
Thầy cho e xin pass
Em là phan bá tuấn, lớp 0209A2. Thầy cho em xin pass file PushedMIDlet với a. Em cảm ơn thầy
Hữu Dũng huudung@...
chạy thử
các em chạy thử trong Mobile nhé.
Trang 1, 2
Tôi là Lê Hữu Dũng
Giảng viên CNTT
Khoa Công nghệ Tin học
Viện Đại học Mở Hà Nội