質問

実際には、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();

    }
   }
  };
 };
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top