단말기에서 프로그램의 단일 인스턴스가 실행되도록 보장

프로그램의 효율성을 높이려면 ExternalSearchProvider 구현에서 search()를 호출할 때 BlackBerry 단말기가 한 인스턴스만 실행하고 있어야 합니다.
  1. ExternalSearchProvider 구현에서, 단말기에서 실행 중인 프로그램을 확인할 수 있는 패키지를 가져옵니다.
    import net.rim.device.api.system.ApplicationDescriptor;
    import net.rim.device.api.system.ApplicationManager;
    import net.rim.device.api.system.ApplicationManagerException;
    import net.rim.device.api.system.CodeModuleManager;
  2. search()에서 프로그램의 핸들을 검색합니다.
    public void search(String keywords) {
        int modHandle = CodeModuleManager.getModuleHandle("MyApplication");
  3. 단말기에서 실행 중인 프로그램들을 나타내는 객체 배열을 검색합니다.
        ApplicationDescriptor[] allApps = ApplicationManager.getApplicationManager().getVisibleApplications();
    
  4. 배열의 각 요소를 조사하여 단말기에서 프로그램이 실행 중인지 확인합니다.
        for(int i = allApps.length -1; i >= 0; --i) {
            if(allApps[i].getModuleHandle() == modHandle) {
  5. 프로그램이 실행 중이면 프로그램에 검색 키워드를 보냅니다. postGlobalEvent()를 호출하여 새 키워드에 대한 결과를 화면에 표시해야 한다는 것을 알리는 메시지를 프로그램에 보냅니다. 프로그램의 생성자에서 GUID에 게시되는 글로벌 이벤트를 파악해야 합니다.
                int procID = ApplicationManager.getApplicationManager().getProcessId(allApps[i]);
                ApplicationManager.getApplicationManager().postGlobalEvent(procID,
                your application's GUID, 0, 0, keywords, null);
            }
        }
  6. 프로그램이 단말기에서 실행되고 있지 않으면 프로그램을 나타내는 ApplicationDescriptor 객체를 검색합니다.
        ApplicationDescriptor[] myAppDes =  CodeModuleManager.getApplicationDescriptors(modHandle);
  7. 프로그램을 시작합니다. 검색 키워드를 인수로 전달합니다. 프로그램의 생성자에서 검색 키워드를 포함하고 있는 인수가 있는지 여부를 파악해야 합니다.
        try {
            ApplicationManager.getApplicationManager().runApplication(new ApplicationDescriptor(myAppDes[0], new String[]{keywords}));
            }
            catch(ApplicationManagerException e)
            {
                // Process the error condition
            }
        }
    }
  8. 프로그램 클래스에서 net.rim.device.api.system.GlobalEventListener 패키지를 가져와서 글로벌 이벤트를 수신합니다.
    import net.rim.device.api.system.GlobalEventListener;
  9. UiApplication 클래스를 가져옵니다.
    import net.rim.device.api.ui.UiApplication;
  10. 5단계에서 만든 것과 같은 글로벌 이벤트를 수신하도록 프로그램을 등록하고, 첫 번째 화면을 표시합니다.
    public class MySearchProviderApp extends UiApplication implements GlobalEventListener {
        public MySearchProviderApp(String searchKeywords) {
            addGlobalEventListener(this);
            pushScreen(new MySearchScreen(searchKeywords));
        }
  11. 글로벌 이벤트에 응답하도록 eventOccured()를 구현합니다.
        public void eventOccurred(long guid, int data0, int data1, Object object0, Object object1) {
  12. 프로그램이 단말기에서 실행되고 있으면 기존 화면을 닫고 다른 화면을 표시합니다.
            if(guid == G53DDE84S97JHVEK390) {
                if(object0 instanceof String) {
                    popScreen();
                    pushScreeen(new MySearchScreen((String) object0));
                    requestForeground();
                }
            }
        }
  13. main 메소드의 인수에서 검색 키워드를 테스트합니다. 주어진 키워드를 사용하여 프로그램을 시작합니다. 키워드가 주어지지 않은 경우에는 빈 문자열을 사용하여 프로그램을 시작합니다.
        public static void main(String[] args) {
            String searchKeywords = "";
            if(args != null  && args.length > 0) {
                searchKeywords = args[0];
            }
            MySearchProviderApp app = new MySearchProviderApp(searchKeywords);
            app.enterEventDispatcher();
        }
    }

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.