Erstellen Sie eine Anwendung, die eine andere Anwendung Ereignis anvisieren
-
22-09-2019 - |
Frage
Eigentlich möchte ich eine Anwendung machen, das wird getGlobalEvent und Kontrolle dieses Ereignis durch eine andere benutzerdefinierte Anwendung. Gibt es eine Möglichkeit, dies zu tun. Kann ich globales Ereignis von einer bestimmten Anwendung bekommen? Es ist wie eine Anwendung, die benutzerdefinierte Anwendung in Ihrem Blackberry sperren wird, wenn Sie nach der Anwendung in dieser Verriegelungs App-Liste hinzufügen und das Passwort dann dem Zugriff setzen, wenn u versuchen, die Anwendung zu öffnen, wird es nach einem Passwort fragen, die u in der Sperr App eingestellt .
Lösung
Allgemeine Hinweise
- sollte Hintergrundanwendung sein
- in Timer-Thread Check aktuellen Vordergrundanwendung
- verwenden, um benutzerdefinierten globalen modalen Dialog auf Anfrage Passwort
- , wenn das Passwort falsch war schließen App von Zurück-Taste drücken Simulation oder Bewegung App Hintergrund
Überprüfen Application
Haben Sie sagen, es kann innerhalb einer Anwendung mehrere Prozesse sein, damit wir Prüfung basierend auf Modulnamen durchführen wird:
private String getModuleNameByProcessId(int id) {
String result = null;
ApplicationManager appMan = ApplicationManager.getApplicationManager();
ApplicationDescriptor appDes[] = appMan.getVisibleApplications();
for (int i = 0; i < appDes.length; i++) {
if (appMan.getProcessId(appDes[i]) == id) {
result = appDes[i].getModuleName();
break;
}
}
return result;
}
Verschieben Anwendung Hintergrund?
Ja, es gibt keine requestBackground () in Application ... also, was Sie tun können, ist requestForeground () auf die nächste beste App, die nicht auf den Vordergrund, und dies wird aktiv App Hintergrund bewegen! Sie können bringen Home-Bildschirm auch mit requestForegroundForConsole () :
protected int switchForegroundModule() {
int id = -1;
ApplicationManager appMan = ApplicationManager.getApplicationManager();
ApplicationDescriptor appDes[] = appMan.getVisibleApplications();
for (int i = 0; i < appDes.length; i++) {
if (!appDes[i].getModuleName().equalsIgnoreCase(STR_MODULE_NAME)) {
id = appMan.getProcessId(appDes[i]);
appMan.requestForeground(id);
// give a time to foreground application
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
}
return id;
}
Globaler Dialog
Nur um eingegebene Passwort Sie Dialog erweitern können, wird es leichter sein Ergebnis zu verbrauchen:
class PaswordDialog extends Dialog {
private BasicEditField mPwdField = new BasicEditField();
public PaswordDialog() {
super(Dialog.D_OK_CANCEL, "Enter password", Dialog.CANCEL, null,
Dialog.FIELD_HCENTER);
add(mPwdField);
}
public String getPassword() {
return mPwdField.getText();
}
}
Und Kennwortprüfmerker wird wie folgt aussehen:
private boolean checkPassword() {
boolean result = false;
final PaswordDialog pwdDlg = new PaswordDialog();
invokeAndWait(new Runnable() {
public void run() {
Ui.getUiEngine().pushGlobalScreen(pwdDlg, 0,
UiEngine.GLOBAL_MODAL);
}
});
result = ((Dialog.OK == pwdDlg.getSelectedValue()) && pwdDlg
.getPassword().equalsIgnoreCase(STR_PASSWORD));
return result;
}
Setzen Sie diese alle zusammen
Beispiel Adress Book App zu blockieren:
public class LockMainApp extends Application {
private static final String STR_MODULE_NAME = "net_rim_bb_addressbook_app";
private static final String STR_PASSWORD = "12345";
int mFGProcessId = -1;
public LockMainApp() {
Timer timer = new Timer();
timer.schedule(mCheckForeground, 1000, 1000);
}
public static void main(String[] args) {
LockMainApp app = new LockMainApp();
app.enterEventDispatcher();
}
TimerTask mCheckForeground = new TimerTask() {
public void run() {
int id = ApplicationManager
.getApplicationManager().getForegroundProcessId();
if (id != mFGProcessId) {
mFGProcessId= id;
String moduleName = getModuleNameByProcessId(mFGProcessId);
if (moduleName.equalsIgnoreCase(STR_MODULE_NAME)) {
if (!checkPassword())
mFGProcessId = switchForegroundModule();
}
}
};
};
}