別のアプリケーション イベントをロックするアプリケーションを作成する
-
22-09-2019 - |
質問
実際には、GlobalEvent を取得し、別のカスタム アプリケーションを通じてそのイベントを制御するアプリケーションを作成したいと考えています。何か方法はありますか。特定のアプリケーションからグローバル イベントを取得できますか?これは、Blackberry のカスタム アプリケーションをロックするアプリケーションのようなものです。ロック アプリのリストに次のアプリケーションを追加し、アクセスするためのパスワードを入力すると、そのアプリケーションを開こうとすると、ロック アプリで設定したパスワードを要求されます。 。
解決
よくあるアドバイス
- これはバックグラウンド アプリケーションである必要があります
- タイマースレッドで現在のフォアグラウンドアプリケーションをチェックする
- カスタム グローバル モーダル ダイアログを使用してパスワードを要求する
- パスワードが間違っていた場合 「戻る」キーを押すことをシミュレートしてアプリを閉じる またはアプリをバックグラウンドに移動します
アプリケーションの確認
言うまでもなく、1 つのアプリケーション内に複数のプロセスが存在する可能性があるため、モジュール名に基づいてチェックを実行します。
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;
}
アプリケーションをバックグラウンドに移動しますか?
はい、 requestBackground() はありません アプリケーションマネージャ...だからあなたにできることは requestForeground() フォアグラウンドではない次善のアプリを選択すると、アクティブなアプリがバックグラウンドに移動します。ホーム画面を呼び出すこともできます 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;
}
グローバルダイアログ
パスワードを入力するだけで Dialog を拡張できるため、結果を簡単に利用できるようになります。
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();
}
}
パスワードチェックは次のようになります。
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;
}
これをすべてまとめてください
アドレス帳アプリをブロックするサンプル:
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();
}
}
};
};
}
所属していません StackOverflow