2012-04-26 46 views
1

大家好,我想控制從後臺應用程序全局推送屏幕。目前我做了一個正在擴展MainScreen的屏幕。我想在全球範圍內顯示此屏幕。我使用 pushGlobalScreen(Screen to push, int priority, flag);其工作,如果有兩個屏幕它顯示一個接一個。但我想要做的實際上是。我想關閉第一個屏幕,然後我想顯示下一個屏幕等等。那麼如何實現這一點。從後臺進程全局控制推送屏幕

這裏我更清楚地解釋它

我解釋了整個場景,我在數據庫中的時間檢查,如果當前時間與報警時間一致,然後它推動屏幕讓假設有不止一個警報同時保存。

while (Checking into database for time){ 
if (databasetime == current time) {// let suppose there is more than 
            //one alarm save for the same time 
    synchronized (getEventLock()) {// This will call one after other but i want to first 

     UiEngine ui = Ui.getUiEngine(); 

     ui.pushGlobalScreen(new AlarmScreen() , 1, UiEngine.GLOBAL_QUEUE);// 
         //Here i want to stop. I want user to close the screen then 
         // i want to push again the screen. As we do in 
         // PushModalScreen(Screen) How can i block 
        //pushGlobalScreen(new AlarmScreen() , 1, UiEngine.GLOBAL_QUEUE); 
     } 

    } 

} 

我覺得我的要求現在已經很清楚了。是嗎??

+0

我的理解是,你不想在顯示堆棧上推多於1個'AlarmScreen'實例,是嗎? – Rupak 2012-04-26 10:46:11

+0

是的,你是對的我想推第二個屏幕後關閉第一個你有任何建議 – BBdev 2012-04-26 10:56:17

+0

我已經發布了代碼段,檢查。 – Rupak 2012-04-26 11:18:35

回答

0

我已經解決了這個問題,但以不同的方式。我選擇的方式是,我將所有的ID存儲在表中,並檢查表中是否有任何id,我只推動一個屏幕。並在關閉它之前,我正在檢查表中是否有更多的ID只是updating the Contents of the Screen。現在它按照我想要的方式工作,如果沒有更多數據,我只是關閉屏幕。

2

在推送新的AlarmScreen實例之前,請檢查follwing代碼段以從顯示堆棧中移除AlarmScreen實例。

net.rim.device.api.ui.Screen currentScreen = Ui.getUiEngine().getActiveScreen(); 

// pop previously pushed AlarmScreen 
if (currentScreen instanceof AlarmScreen) { 
    try { 
     Ui.getUiEngine().popScreen(currentScreen); 
    } catch (IllegalArgumentException iaexc) { 
     // If your screen is not on the stack. 
    } catch (Exception exc) {   
    } 
} 

// push new AlarmScreen 
synchronized (Application.getEventLock()) { 
    Ui.getUiEngine().pushGlobalScreen(new AlarmScreen() , 1, UiEngine.GLOBAL_QUEUE); 
} 




繼應用( UiApplication)使用的 AlarmScreen的隊列。在從顯示堆棧移除活動的 AlarmScreen時,它將另一個 AlarmScreen從等待隊列推入顯示堆棧。

package mypackage; 

import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.container.MainScreen; 

public class MyApp extends UiApplication implements CloseEventListener { 
    public static void main(String[] args) { 
     (new MyApp()).enterEventDispatcher(); 
    } 

    private AlarmScreen []queue; 
    private int MAX = 10; 
    private int head = 0; 

    public MyApp() { 
     // initialize queue 
     queue = new AlarmScreen[MAX]; 
     head = 0; 
     for (int i=0;i<MAX;i++) { 
      queue[i] = new AlarmScreen(this, "Screen no. " + i); 
     } 

     // push first screen on display 
     UiApplication.getUiApplication().pushScreen(queue[head ++]); 
    } 

    public void screenClosed() { 
     if (head < MAX) { 
      UiApplication.getUiApplication().pushScreen(queue[head ++]); 
     } 
    } 
} 

interface CloseEventListener { 
    public void screenClosed(); 
} 

class AlarmScreen extends MainScreen { 
    private CloseEventListener listener; 

    public AlarmScreen(CloseEventListener listener, String title) { 
     setTitle(title); 
     this.listener = listener; 
    } 

    public boolean onClose() { 
     try { 
      UiApplication.getUiApplication().invokeLater(new Runnable() { 
       public void run() { 
        close(); 
       } 
      }); 
     } catch (Exception exc) { 
      System.out.println(exc.getMessage()); 
     } 
     // push a new screen from waiting queue 
     if (listener != null) { 
      listener.screenClosed(); 
     } 
     return true; 
    } 
} 
+0

實際上我不想這樣做,我希望用戶關閉屏幕,然後我想推新的AlarmScreen();即,如果在顯示堆棧中存在一個屏幕,則代碼pushGlobalScreen不應該運行兩次。它直到等待,直到堆棧上沒有屏幕。感謝您的代碼片段。 – BBdev 2012-04-26 11:27:16

+0

然後你可以維護一個隊列,它將保存所有的'AlarmScreen'實例。當用戶關閉活動的「AlarmScreen」時,只需按下隊列的第一個元素(如果不爲空)即可顯示。如果你需要實施方面的幫助,那麼我可以給你提示。 – Rupak 2012-04-26 11:33:28

+0

是的課程,如果你可以提供一些幫助,它會很好:) – BBdev 2012-04-26 11:39:44