我有一个后台功能监听推送消息。我需要处理推力。我创建了在推送到达时执行任何操作的函数,它运行良好。例如,当推送到达时,我增加一个数字等。
但是,当用户按下 ok 进行推送时,实际使应用程序启动的代码是什么?
我只需要让应用程序正常启动,就像用户刚刚按下应用程序的图标一样。
I am using OS < 7.X
我有一个后台功能监听推送消息。我需要处理推力。我创建了在推送到达时执行任何操作的函数,它运行良好。例如,当推送到达时,我增加一个数字等。
但是,当用户按下 ok 进行推送时,实际使应用程序启动的代码是什么?
我只需要让应用程序正常启动,就像用户刚刚按下应用程序的图标一样。
I am using OS < 7.X
一种典型的模式是构建一个有两个入口点的应用程序。也就是说,它可以以两种不同的方式启动。一种方式,将是正常的UiApplication
。这是可以通过按下主屏幕图标启动的标准 BlackBerry 应用程序。
另一种方法是定义一个后台服务,处理推送通知,并在设备启动时由操作系统启动。
您将通过在应用程序的 BlackBerry_App_Descriptor.xml 文件中添加备用入口点来定义后台/推送入口点。确保选中Auto-run at Startup和Do not display the application icon ...。除了 UiApplication 的正常入口点之外,您的应用程序描述符 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();
}
}
}
哪里PushAgent
有课那个extends 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);
试试这个 - 当您单击确定按钮时,使用以下代码运行您的 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;
}
}
为了完整起见,这里是您可以用来启动应用程序的所有选项:
我假设您已经有多个入口点 - 一个用于后台侦听器,一个用于 UI 应用程序。还假设您没有为 UI 应用程序传递任何应用程序参数。(有关如何执行此操作的完整说明,请参阅 Nate 的回答。)
使用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);
使用launch()
方法:
String modulename = "mymodule";
ApplicationManager.launch(modulename);
使用launchApplication()
方法:
String modulename = "mymodule";
ApplicationManager.launchApplication(modulename);
需要注意的一点是,如果您的 UI 应用程序已经打开,那么所有这些方法都会简单地将其带到前台,无论它处于何种状态。如果您需要单击按钮来打开应用程序的新实例,则必须将一些随机参数作为应用程序参数传递,然后在 main 方法中将其忽略。
class EntryPointForApplication extends UiApplication {
private static EntryPointForApplication theApp;
public EntryPointForApplication() {
GUIApplication scr = new GUIApplication();
pushScreen(scr);
}
}