2012-07-04 4 views
3

J'essaie de faire apparaître une boîte de dialogue globale à partir d'un thread d'arrière-plan que j'ai démarré à partir d'un autre point d'entrée. J'ai essayé tellement de variations pour que ça fonctionne mais ça ne se montre toujours pas. J'ai essayéBlackberry global popup

synchronisation Application.getEventLock(), j'ai aussi essayé
UiApplication.getUiApplication().invokeLater, UiApplication.getUiApplication().invokeAndWait. J'ai même essayé d'abord synchronizing the eventlock avant d'appeler le invokeLater (ce que je trouve redondant, mais j'ai quand même essayé ...). Je ne suis pas sûr de ce que je fais mal.

+0

avez-vous essayé 'ui.pushGlobalScreen (écran, 1, UiEngine.GLOBAL_QUEUE);' – BBdev

+1

http://supportforums.blackberry.com/t5/Java-Development/Create-a-Background-Application/ta-p/ 445226 également vérifier ce lien – BBdev

+0

oui, j'ai essayé d'utiliser le GLOBAL_QUEUE – user1174960

Répondre

2

okk je vous donne une démonstration de l'échantillon ....

tout d'abord modifier le BlackBerry_App_Descriptor.xml cliquez sur Application Tab En ApplicationArgument écrire alternate et vérifier l'exécution automatique au démarrage Cliquez sur Alternate Entry Points clic sur ajouter et écrire dans le titre BackgroundApp

Faire une classe qui prolongera la classe d'application plutôt que la classe UiApplication comme cette façon

 
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(); 
     } 

} 

Faire une classe qui prolongera la classe UiApplication comme cette façon

 
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); 
    } 

} 

maintenant faire une MyScreen de classe et ajouter tous vos Ui dedans .... et pousser l'écran

 
public class Myscreen extends MainScreen { 



    public Myscreen(){ 
    CreateGui(); 
    } 

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

} 

exécuter l'échantillon que vous verrez après une minute une boîte de dialogue apparaîtra sur votre écran, peu importe si vous êtes dans l'application ou à l'extérieur de celui-ci. Merci peut-être que cela pourrait être une aide complète.

+0

Ok, j'ai suivi votre exemple ci-dessus et cela a bien fonctionné ... au moins jusqu'à ce que je l'ai testé sur le 9900 OS 7.0.0.440 ... Ce qui est bizarre, c'est que ça fonctionne bien sur 9700 (simulateur et périphérique) simulateur. Chaque fois que j'appelle synchronized (getEventLock()), j'obtiens une AccessControlException. J'ai deux écouteurs qui appellent la méthode de BackgroundApp qui montre le dialogue global, ce qui est bizarre quand le SMSListener l'appelle, tout fonctionne bien, mais quand l'EmailListener l'appelle ... – user1174960

+0

, j'obtiens une exception AccessControlException chaque fois qu'elle passe le synchronized (getEventLock()), et cela se produit uniquement sur l'appareil, cela fonctionne très bien sur le simulateur. – user1174960

+0

Désolé, il était ControlledAccessException – user1174960