我有一个后台函数来监听推送消息。我需要处理推动。我创建了函数,以便在推送到达时采取任何操作,并且它运行良好。例如,当推送到达时,我增加一个数字等等。
然而,当用户按下ok进行推送时,实际启动应用程序的代码是什么?
我只需要让应用程序正常启动,就像用户只需按下应用程序的图标一样。
I am using OS < 7.X
答案 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();
}
}
}
其中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);
答案 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的答案。)
使用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方法中忽略它。