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表示时间相对于本地午夜的时间.

 :在指定的时间前如果重启或关闭BlackBerry设备,此应用程序不会执行.

管理代码模块

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日
posted @ 2006-04-29 20:30  张太国  阅读(3055)  评论(0编辑  收藏  举报