我是 BlackBerry 应用程序开发的新手。我希望能够在黑莓(在我的情况下为 8900)打开并且在所有屏幕上时监听按键事件,这可能吗?
如果是这样,有人将我引向正确的方向会很棒。我已经在看接口 KeyListener。
import net.rim.device.api.system.*;
谢谢大家
我是 BlackBerry 应用程序开发的新手。我希望能够在黑莓(在我的情况下为 8900)打开并且在所有屏幕上时监听按键事件,这可能吗?
如果是这样,有人将我引向正确的方向会很棒。我已经在看接口 KeyListener。
import net.rim.device.api.system.*;
谢谢大家
实现一个keylistenerClass,如:
导入模型.配置文件;
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;
}
}
然后在您的应用程序构造函数中
public Application() {
//Add the listener to the system for this application
addKeyListener(new ShortcutHandler());
}
我确认当应用程序在后台时它正在工作。
据我了解,您希望监听设备上运行的所有应用程序中的所有关键事件,而不仅仅是在您的应用程序中。
我认为这是不可能的。
更新
音量加减键如何工作?– 腹肌 11 小时前
如果你想说所有应用程序都从音量键接收按键事件,那不是真的。RIM OS 将接收这些事件,然后更新所有音频组件,如警报、音频、播放器等。
您可以使用此示例轻松检查它:
执行以下操作:
代码:
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();
}
};
}
这就是我想象它可以工作的方式
UiApplication
甚至扩展的应用程序Application
Keylistener
,也可以扩展)Thread
KeyListener
实现添加到您的应用程序addKeyListener()
上面给出的代码当然有效,但有一个问题。您将无法捕获本地应用程序上的按键,例如呼叫处理短信传入浏览和其他东西。当系统为这些应用程序生成全局事件时。就像您可以在应用程序处于后台时定义点击例程一样,但该例程的功能仅本地化到您的应用程序。它不会影响其他应用程序。