BlackBerry 应用程序开发者指南 第二卷:高级--第12章 管理应用程序
作者:Confach 发表于 2006-04-29 20:30 pm
版权信息:可以任意转载, 转载时请务必以超链接形式标明文章原始出处 和作者信息.
http://www.cnblogs.com/confach/articles/388973.html
12
第12章 管理应用程序
应用程序管理器 管理代码模块 |
应用程序管理器
BlackBerry设备VM有一个应用程序管理器,它的功能和对于其他Java程序的操作系统事件调动中心一样.
net.rim.device.api.system.ApplicationManager类使应用程序可以和应用程序管理器交互,并完成下面的操作:
- 与进程交互,例如获取前台应用程序的ID.
- 发送一个全局事件给系统.
- 锁住或解锁BlackBerry设备,或判断BlackBerry设备是否锁住.
- 立即运行一个程序,或者在一个特定的时间运行应用程序.
为了使用ApplicationManager类的任何方法,你必须获取一个当前应用程序管理器的引用.调用getApplicationManager()获得当前应用程序管理器.
ApplicationManager manager = ApplicationManager.getApplicationManager();
获取应用程序的相关信息
调用静态方法ApplicationManager.getVisibleApplications()获取当前运行的进程信息.例如,你可以编写一个系统管理应用程序来记录BlackBerry设备的状态,以决定用户使用每个应用程序所花费的时间.
对于正在运行的可见应用程序,为获取一组ApplicationDescriptor对象,调用getVisibleApplications().一个ApplicationDescriptor对象包含了应用程序的描述性信息,例如它的名称,图标,主(Home)屏幕的位置,以及资源包(bundle).使用ApplicationDescriptor方法获取这个信息.例如,为获取一个运行应用程序的名称,调用一个应用程序描述(descriptor)上的getName()方法.
ApplicationManager manager = ApplicationManager.getApplicationManager(); ApplicationDescriptor descriptors[] = manager.getVisibleApplications(); // Retrieve the name of a running application. String appname1 = descriptors[0].getName() |
为当前应用程序获取一个ApplicationDescriptor,调用
ApplicationDescriptor.currentApplicationDescriptor(). ApplicationDescriptor descriptor = ApplicationDescriptor.currentApplicationDescriptor(); String appname = descriptor.getName(); |
发布一个全局事件
使用ApplicationManager.postGlobalEvent()作为基本机制和其他进程进行通讯.
注:你也可以使用运行时存储发送和接收进程间的消息.为获得更多信息,参看135页的”在应用程序之间共享运行时对象”.
为了发布一个全局事件到指定的应用程序中,调用postGlobalEvent(int, long, int, int, Object, Object).
processID参数指定了进程的ID发送事件.为获取一个进程ID,调用getProcessId(ApplicationDescriptor). guid参数为事件指定一个GUID值.数据和对象为事件指定附加的信息.
为了对所有应用程序发送一个全局事件,使用下面形式之一的postGlobalEvent()方法:
方法 |
描述 |
boolean postGlobalEvent(long) |
发布一个带有唯一标志符的全局事件. |
boolean postGlobalEvent(long, int, int) |
发布一个带有附加数据的全局事件. |
abstract boolean postGlobalEvent(long, int, int, Object, Object) |
发送一个带有附加整数和对象数据的全局事件. |
接收一个全局事件
net.rim.device.api.system.GlobalEventListener接口的实现接收全局事件. GlobalEventListener.eventOccurred()的实现定义了当一个全局事件发生时所发生的事情.
调用Application.addGlobalEventListener(GlobalEventListener)注册你的实现.
锁住一个BlackBerry设备
>调用 ApplicationManager.lockSystem(true).
决定一个BlackBerry设备是否锁住
>调用ApplicationManager.isSystemLocked().
解锁一个BlackBerry设备
>调用ApplicationManager.unlockSystem(true).
用不同的参数运行一个应用程序
创建一个新的应用程序描述
.使用已经存在的ApplicationDescriptor作为一个模板.在main()里指定使用的参数.
ApplicationDescriptor template = ApplicationDescriptor.currentApplicationDescriptor(); String[] args = { "admin", "secure" }; ApplicationDescriptor newdescriptor = new ApplicationDescriptor(template, args); |
ApplicationDescriptor 构造子有其他2种格式:
签名 |
描述 |
ApplicationDescriptor(ApplicationDescriptor, String, String[]) |
此格式允许你为新的ApplicationDescriptor指定一个名称. |
ApplicationDescriptor(ApplicationDescriptor, String, String[], Bitmap, int, String, int) |
此格式允许你指定一个名称,初始设置,包括一个应用程序图标,主屏幕的位置,以及资源包,还有应用程序标题的ID. |
运行应用程序
使用一个新的ApplicationDescriptor对象运行应用程序.
ApplicationManager appmanager = ApplicationManager.getApplicationManager(); try { appmanager.runApplication(newdescriptor); } catch(ApplicationManagerException) { // Handle the error. } |
runApplication()方法创建一个新的进程,并且调用一个指定的描述上的导出main()方法,以及使用它的参数.如果可能,新进程会转移到前台来.
在指定的时间运行一个应用程序
>调用scheduleApplication()代替runApplication().
try { appmanager.scheduleApplication(newdescriptor, 1728000, false); } catch(ApplicationManagerException) { // Handle the error. } |
scheduleApplication(ApplicationDescriptor, int, Boolean) 方法需要下面的参数:
- ApplicationDescriptor对象.
- 启动应用程序的时间,毫秒计.
- Boolean值,true表示时间是绝对的(从January 1, 1970 UTC午夜开始计算),false表示时间相对于本地午夜的时间.
管理代码模块
CodeModuleManager类在net.rim.device.api.system里,它允许你获取相关信息,并且管理BlackBerry设备上的代码模块.
一个代码模块是一个.cod文件,它是BlackBerry IDE里单个工程编译的文件.为了查看安装在BlackBerry设备上的第三方应用程序列表,单击Appication.单击Propoerties菜单项查看关于每一个应用程序的信息.
获取模块信息
CodeModuleManager类提供方法使应用程序可以获取BlackBerry设备上的相关信息,例如名称,类型,描述,版本以及创建日期.
为获取一个模块的句柄,调用getModuleHandle().将代码模块名作为一个参数.
int handle = CodeModuleManager.getModuleHandle("test_module"); |
调用CodeModuleManager类的方法获取指定的信息.
将模块句柄作为参数传给这些方法.
String name = CodeModuleManager.getModuleName( handle ); String vendor = CodeModuleManager.getModuleVendor( handle ); String description = CodeModuleManager.getModuleDescription( handle ); int version = CodeModuleManager.getModuleVersion( handle ); int size = CodeModuleManager.getModuleCodeSize( handle ); int timestamp = CodeModuleManager.getModuleTimestamp( handle ); |
获取一组句柄
为获取BlackBerry设备上所有存在的模块句柄,调用getModuleHandles()
int handles[] = CodeModuleManager.getModuleHandles(); String name = CodeModuleManager.getModuleName( handles[0]); |
net.rim.device.api.system.CodeModuleManager类提供方法创建,保存,删除代码模块.这些功能允许一个BlackBerry设备上的应用程序可以无线接收.cod文件.
代码模块管理器方法
方法 |
描述 |
int handle = CodeModuleManager.getModuleHandleForObject( anObject ); |
此方法获取一个对象模块的句柄,在此模块里定义一个对象. |
boolean library = CodeModuleManager.isLibrary( handle ); |
此方法决定一个模块是否为类库,如果是返回true,如果是应用程序返回false. |
int size = CodeModuleManager.getModuleHandleForObject( anObject); |
决定了模块包含的代码的大小(字节). |
ApplicationDescriptor descriptors[] = CodeModuleManager.getApplicationDescriptiors( handle ); |
获得一组代码模块包含的所有描述. |
创建一个模块
>调用createNewModule().将模块的大小(字节)作为参数:
int handle = CodeModuleManager.createNewModule( 3000 ); |
此方法返回模块的句柄,否则,如果不能创建模块,返回0.
当你创建模块时,为了将数据增加到其中,调用下面形式的createNewModule().将整个模块的时长度(字节)作为参数,一个字节数据将加到模块中, length参数指定了从增加的字节数组到模块开始的字节数.
static int createNewModule(int, byte[], int); |
将数据写入模块
>调用writeNewModule().将数据的字节数组作为参数提供给本方法.
boolean success = CodeModuleManager.writeNewModule( handle, data, 0, data.length ); |
saveNewModule(int)返回CodeModuleManager类定义的结果代码之一,例如如果模块保存成功,返回CMM_OK.
从BlackBerry设备数据库删除一个模块
调用deleteModuleEx(int, Boolean).将模块的句柄作为参数删除,一个Boolean值指定是否删除模块和它包含的数据,或仅删除没有相关数据的模块.如果模块正在使用,它将在BlackBerry下次重启时删除.
int handle = CodeModuleManager.getModuleHandle("test_module"); if( handle != 0 ) { Boolean success = CodeModuleManager.deleteModule( handle, true ); } |
Last Updated:2007年2月6日