如何通过代码启动黑莓应用程序?

时间:2013-04-16 15:55:51

标签: blackberry java-me push-notification blackberry-jde

我有一个后台函数来监听推送消息。我需要处理推动。我创建了函数,以便在推送到达时采取任何操作,并且它运行良好。例如,当推送到达时,我增加一个数字等等。

然而,当用户按下ok进行推送时,实际启动应用程序的代码是什么?

我只需要让应用程序正常启动,就像用户只需按下应用程序的图标一样。

I am using OS < 7.X

4 个答案:

答案 0 :(得分:3)

一种典型的模式是构建一个具有两个入口点的应用程序。也就是说,它可以以两种不同的方式启动。一种方法是正常UiApplication。这是可以通过主屏幕图标按下启动的标准BlackBerry应用程序。

另一种方法是定义一个处理推送通知的后台服务,并在设备启动后立即由操作系统启动。

您可以通过在应用的BlackBerry_App_Descriptor.xml文件中添加备用入口点来定义后台/推送入口点。请务必选中启动时自动运行不显示应用程序图标... 。除了UiApplication的正常入口点之外,你的app描述符xml文件应该包含这样的东西:

  <AlternateEntryPoints>
    <AlternateEntryPoint Title="PushService" MainMIDletName="" 
                         ArgumentsForMain="-push" HomeScreenPosition="0"
                         StartupTier="7" IsSystemModule="true" 
                         IsAutostartup="true" hasTitleResource="false" 
                         TitleResourceBundleKey="" TitleResourceBundleName="" 
                         TitleResourceBundleClassName="" TitleResourceBundleRelativePath="">
      <Icons/>
      <KeywordResources KeywordResourceBundleName="" KeywordResourceBundleRelativePath="" KeywordResourceBundleClassName="" KeywordResourceBundleKey=""/>
    </AlternateEntryPoint>
  </AlternateEntryPoints>

然后,你将有一个这样的主程序:

public class MyApp extends UiApplication

    public static void main(String[] args) {
       if (args.length > 0 && args[0].equals("-push")) {
          // this is the push service
          PushAgent pa = new PushAgent();
          pa.enterEventDispatcher();
       } else {
          // UiApplication
          MyApp app = new MyApp();
          app.enterEventDispatcher();
       }
    }
}

其中PushAgentextends Application而不是UiApplication的类。

然后,当推送代理收到通知并且您决定要显示UI时,请使用以下内容:

ApplicationDescriptor ad = ApplicationDescriptor.currentApplicationDescriptor();
// String[] used for command line args, but we don't pass any to the UI app
ApplicationDescriptor ui = new ApplicationDescriptor(ad, new String[] { });
ApplicationManager.getApplicationManager().runApplication(ui);

答案 1 :(得分:2)

试试这个 - 单击“确定”按钮时,请使用以下代码运行ui应用程序。

public void dialogClosed(Dialog dialog, int choice) {
      switch (choice) {
          case Dialog.OK: 
              try {

                  ApplicationDescriptor[] appDescriptors =CodeModuleManager.getApplicationDescriptors(CodeModuleManager.getModuleHandle("BlackBerryCity"));    //here BlackBerryCity is the COD module Name
                  ApplicationDescriptor appDescriptor = new ApplicationDescriptor(appDescriptors[0], new String[] {"BlackBerryCity"});
                  ApplicationManager.getApplicationManager().runApplication(appDescriptor);

                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

              break;
          case Dialog.CANCEL:

              break;
          default:
              break;
       }
   }

答案 2 :(得分:1)

class EntryPointForApplication extends UiApplication {

    private static EntryPointForApplication theApp;

    public EntryPointForApplication() { 
        GUIApplication scr = new GUIApplication(); 
        pushScreen(scr);         
    } 

}

另请阅读How to setup alternate entry point in Blackberry application?

答案 3 :(得分:1)

为了完整起见,您可以使用以下所有选项来启动应用程序:

我假设您已经有多个入口点 - 一个用于后台侦听器,另一个用于UI应用程序。还假设您没有为UI应用程序传递任何应用程序参数。 (有关如何执行此操作的详细说明,请参阅Nate的答案。)

  1. 使用runApplication()方法:

    ApplicationDescriptor ad = ApplicationDescriptor.currentApplicationDescriptor();
    // String[] used for command line args, but we don't pass any to the UI app
    ApplicationDescriptor ui = new ApplicationDescriptor(ad, new String[] { });
    //Launch the application and ask it to come in foreground
    ApplicationManager.getApplicationManager().runApplication(ui, true);
    
  2. 使用launch()方法:

    String modulename = "mymodule";
    ApplicationManager.launch(modulename);
    
  3. 使用launchApplication()方法:

    String modulename = "mymodule";
    ApplicationManager.launchApplication(modulename);
    
  4. 需要注意的一点是,如果您的UI应用程序已经打开,那么所有这些方法都会在任何条件下将其带到前台。如果您需要单击按钮来打开应用程序的新实例,则必须将一些随机参数作为应用程序参数传递,然后在main方法中忽略它。