2009-11-03 12 views
5

Sono nuovo nello sviluppo di app BlackBerry. Voglio essere in grado di ascoltare gli eventi keypress ogni volta che il BlackBerry (8900 nel mio caso) è acceso e su tutti gli schermi è possibile?BlackBerry - KeyListener con ambito globale

Se così fosse, sarebbe bello che qualcuno mi dirigesse nella giusta direzione. Sto già dando un'occhiata a Interface KeyListener.

import net.rim.device.api.system.*; 

Grazie a tutti

risposta

6

implementare un keylistenerClass like:

modello di importazione.Profilo;

import net.rim.device.api.system.KeyListener; 
import net.rim.device.api.ui.Keypad; 


public final class ShortcutHandler implements KeyListener { 

    public boolean keyChar(char key, int status, int time) { 
     return false; 
    } 

    public boolean keyDown(int keycode, int time) { 
     if (Keypad.KEY_ESCAPE == Keypad.key(keycode)) { 
         // Consume the event. 
         // Here I'm consuming the event for the escape key 
      return true; 
     } 
       //let the system to pass the event to another listener. 
     return false; 
    } 

    public boolean keyRepeat(int keycode, int time) { 
     return false; 
    } 

    public boolean keyStatus(int keycode, int time) { 
     return false; 
    } 

    public boolean keyUp(int keycode, int time) { 
     return false; 
    } 

} 

Poi nell'applicazione costruttore

Confermo che sta funzionando quando l'applicazione è in background.

+0

Wow - grazie per averlo confermato, lo proverò. – Abs

1

questo come immagino potrebbe funzionare

+0

Il keyListener riceverà solo eventi chiave quando l'applicazione è in primo piano. – Richard

+0

che non è vero ma grazie per il downvote – jitter

3

Come ho capito, si desidera ascoltare tutti gli eventi chiave in tutte le applicazioni in esecuzione sul dispositivo, non solo nella propria applicazione.
Penso che non sia possibile.

UPDATE

Come funziona il volume su e giù opera chiave? - Ass 11 ore fa

Se si vuole dire che tutte le applicazioni ricevono eventi chiave dai tasti del volume, questo non è vero. RIM OS riceverà quegli eventi e quindi aggiornare tutti i componenti audio come allarme, audio, lettore ecc

si può easely controllare con questo campione:
alt text

facciamo seguire:

  • run campione
  • entrare alcuni eventi chiave
  • sguardo al numero di eventi
  • andare backgro und
  • entrare alcuni eventi chiave
  • tornare a campione menu-> applicazione interruttore numero
  • eventi di controllo, è ancora lo stesso

Codice:

import net.rim.device.api.system.KeyListener; 
import net.rim.device.api.ui.MenuItem; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.Menu; 
import net.rim.device.api.ui.container.MainScreen; 

public class KeyListenerApp extends UiApplication implements KeyListener { 

    Scr mScreen; 

    public KeyListenerApp() { 
     mScreen = new Scr(); 
     pushScreen(mScreen); 
     addKeyListener(this); 
    } 

    public static void main(String[] args) { 
     KeyListenerApp app = new KeyListenerApp(); 
     app.enterEventDispatcher(); 
    } 

    private void updateScreen(final String text) { 
     mScreen.addLine(text); 
    } 

    public boolean keyChar(char key, int status, int time) { 
     updateScreen("keyChar " + key); 
     return true; 
    } 

    public boolean keyDown(int keycode, int time) { 
     updateScreen("keyDown " + keycode); 
     return true; 
    } 

    public boolean keyRepeat(int keycode, int time) { 
     updateScreen("keyRepeat " + keycode); 
     return true; 
    } 

    public boolean keyStatus(int keycode, int time) { 
     updateScreen("keyStatus " + keycode); 
     return true; 
    } 

    public boolean keyUp(int keycode, int time) { 
     updateScreen("keyUp " + keycode); 
     return true; 
    } 
} 

class Scr extends MainScreen { 
    int mEventsCount = 0; 
    LabelField mEventsStatistic = new LabelField("events count: " 
      + String.valueOf(mEventsCount)); 

    public Scr() { 
     super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR); 
     add(mEventsStatistic); 
    } 

    public void addLine(final String text) { 
     getApplication().invokeLater(new Runnable() { 
      public void run() { 
       mEventsStatistic.setText("events count: " 
         + String.valueOf(++mEventsCount)); 
       insert(new LabelField(text), 1); 
      } 
     }); 
    } 

    protected void makeMenu(Menu menu, int instance) { 
     super.makeMenu(menu, instance); 
     menu.add(goBGMenuItem); 
    } 

    MenuItem goBGMenuItem = new MenuItem("go backgroun", 0, 0) { 
     public void run() { 
      getApplication().requestBackground(); 
     } 
    }; 
} 
+0

Come funziona il tasto su/giù del volume? – Abs

+1

Grazie per la spiegazione e il codice - mi aiuta a capire tutto questo. – Abs

+0

Prego! –

1

Il codice sopra riportato funziona sicuramente, ma c'è un problema. Non sarai in grado di intrappolare le pressioni dei tasti su app native come la gestione delle chiamate in arrivo, la navigazione in entrata e altro. Come sistema genera un evento globale per queste app. È come se fosse possibile definire una routine per i clic quando l'app è in background, ma la funzionalità di tale routine è localizzata solo per l'applicazione. Non ha effetto su altre app in quanto tali.