2012-07-04 3 views
3

Я пытаюсь открыть глобальное диалоговое окно из фонового потока, который я начал с альтернативной точки входа.Blackberry global popup

public static void main(String[] args) { 
    MyApp theApp = new MyApp(); 
    if (args != null && args.length > 0 && args[0].equals("test")) { 
     new Thread(new Runnable() { 
      public void run() { 
       try { 
        synchronized (UiApplication.getEventLock()) { 
         UiEngine ui = Ui.getUiEngine(); 
         Screen screen = new Dialog(Dialog.D_OK, "Test", Dialog.OK, 
                Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION), 
                Manager.VERTICAL_SCROLL); 
         ui.pushGlobalScreen(screen, 1, UiEngine.GLOBAL_MODAL); 
        } 
       } catch (Exception e) { 
        System.out.println(e.toString()); 
       } 
      } 
     }).start(); 
    } else { 
     theApp.enterEventDispatcher(); 
    } 
} 

Я пробовал так много вариантов, чтобы заставить его работать, но он все еще не появляется. Я попытался

синхронизации Application.getEventLock(), я также попытался
UiApplication.getUiApplication().invokeLater, UiApplication.getUiApplication().invokeAndWait. Я даже попробовал synchronizing the eventlock прежде, чем позвонить invokeLater (что я считаю излишним, но я все еще пытался ...). Я не уверен, что я делаю неправильно.

+0

Вы пробовали 'ui.pushGlobalScreen (экран, 1, UiEngine.GLOBAL_QUEUE);' – BBdev

+1

http://supportforums.blackberry.com/t5/Java-Development/Create-a-Background-Application/ta-p/ 445226 также проверить эту ссылку – BBdev

+0

да, я пробовал использовать GLOBAL_QUEUE – user1174960

ответ

2

ОКК я даю вам пример демо ....

Прежде всего редактировать BlackBerry_App_Descriptor.xml нажмите на Application Tab В ApplicationArgument написать alternate и проверить автоматический запуск при запуске Нажмите на Alternate Entry Points мыши на добавить и написать в названии BackgroundApp

сделать класс, который будет расширять класс приложений, а не класс UIApplication как таким образом

 
import net.rim.device.api.system.Alert; 
import net.rim.device.api.system.Application; 
import net.rim.device.api.system.Bitmap; 
import net.rim.device.api.ui.Manager; 
import net.rim.device.api.ui.Screen; 
import net.rim.device.api.ui.Ui; 
import net.rim.device.api.ui.UiEngine; 
import net.rim.device.api.ui.component.Dialog; 


public class BackGroundApp extends Application { 
// this class is used for the background processing ..... 

    public void startBackgroundThread() 
     { 
      new Thread(){ 
       public void run() { 
        while (true) { 
         try { 
          Thread.sleep(60000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 




         synchronized (getEventLock()) { 

          //with this UiEngine pushGlobal dialogs 

          //whenever with the app in background 

          UiEngine ui = Ui.getUiEngine(); 
          Screen screen = new Dialog(Dialog.D_OK, "You have updates!", 
            Dialog.OK, Bitmap 
              .getPredefinedBitmap(Bitmap.EXCLAMATION), 
            Manager.VERTICAL_SCROLL); 
          ui.pushGlobalScreen(screen, 1, UiEngine.GLOBAL_QUEUE); 

         } 
        } 
       } 
      }.start(); 
     } 

} 

сделать класс, который будет расширять класс UIApplication как таким образом

 
public class GuiTest extends UiApplication { 
    static Timer t; 

    public static void main(String[] args) { 

     if(args.length>0&&"alternate".equals(args[0])){ 

          BackGroundApp app = new BackGroundApp(); 
          app.startBackgroundThread(); 
          app.enterEventDispatcher(); 

      } 

     else{ 
      GuiTest test = new GuiTest();   
      test.enterEventDispatcher(); 
     } 
    } 
    public GuiTest(){ 
     Myscreen screeMyscreen = new Myscreen(); 
     pushScreen(screeMyscreen); 
    } 

} 

Теперь сделайте класс MyScreen и добавьте все Ui в нем .... и нажмите на экран

 
public class Myscreen extends MainScreen { 



    public Myscreen(){ 
    CreateGui(); 
    } 

    public void CreateGui(){ 
     // Your Ui goes here ....... 
    } 

} 

запустите образец, который вы увидите через минуту, на экране появится диалоговое окно независимо от того, находитесь ли вы в приложении или вне его. Спасибо, может быть, это может помочь.

+0

Хорошо, я следил за вашим примером выше, и он отлично поработал ... по крайней мере, пока я не протестировал его на 9900 OS 7.0.0.440 ... Что странно, он отлично работает на 9700 (симулятор и устройство), а также работает над 9900 тренажер. Всякий раз, когда я вызываю synchronized (getEventLock()), я получаю исключение AccessControlException. У меня есть два Listeners, вызывающих метод BackgroundApp, который показывает глобальное диалоговое окно, что странно, когда SMSListener вызывает его, все работает нормально, но когда EmailListener вызывает его ... – user1174960

+0

, я получаю AccessControlException всякий раз, когда он передает synchronize (getEventLock()), и это происходит только на устройстве, оно отлично работает на симуляторе. – user1174960

+0

Извините, это было ControlledAccessException – user1174960