专注于Blackberry

每周一技:HyperLinkField

这是每周一技的第二篇了。 前一篇介绍了从BES读取contacts的技术以及遇到相关问题的解决方案(via 每周一技:从BES服务器上lookup联系人)。 本篇将介绍如何编写自定义的超级链接控件。 背景 在很多情况下,我们都会遇见超级连接的显示,遗憾的是在Blackberry没有提供类似于HyperLinkField的组件,这给我们增加了很多麻烦,如果能够解决该问题,将会是一个不错的选择。 分析 既然Blackberry API没有,我们自己可以写一个该Field,在这里,我们将之命名为HyperLinkField,以符合Blackberry API命名的规则。 实现 先看几张效果图: 图1,当focus在其他field时HyperLinkField的样式. 图2 当光标移到该field上时,颜色会变蓝,当然你也可以更改颜色。 图3,当点击该Field时, 图4,其菜单如下 该Get Page就会打开连接。 在编写代码需要注意一下几个地方: 参数的设置 Layout的处理 如何paint 菜单的处理 点击该field如何处理 下面给出部分重要的代码。 package com.taigoo.blackberry.weekskills.hyperlink; import net.rim.device.api.ui.Color; import net.rim.device.api.ui.DrawStyle; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.MenuItem; import net.rim.device.api.ui.ContextMenu; import net.rim.device.api.ui.Font; import net.rim.device.api.ui.Graphics; import net.rim.device.api.ui.XYRect; import net.rim.device.api.system.Display; import net.rim.blackberry.api.browser.*; public class HyperLinkField extends Field { private [...]

继续阅读本文 →

Taigoo发表于 July 14, 2009 7:35 pm | 留言 |每周一技 

故技重施:Blackberry Push API

大概是6月初,RIM以很强的声势推出一个新服务,名曰Blackberry Push API。在没有看文档前,我非常憧憬RIM能给我们带来惊喜。但是我看完之后,发现RIM仅仅把原来的技术重新包装了一遍。 从商业的角度讲,我非常赞成RIM的这种做法,现在的很多新概念有很多都是把N年以前的东西拿出来翻新一下,例如AJax,SaaS等,都取得了不错的效果。 但是从技术角度上讲,也确实没什么。 我将该服务总结为一句话,即将Blackberry最具特色的PUSH功能应用到客户的需求上。 即便如此,我还是将我N年以前使用过的技术重温一下,顺便也说说PUSH API 的应用。 应用背景: 先举个例子,未必是真实的。假如上海有家出租车公司小众(不是大众),要通知司机小张,有个客户在人民广场的来福士广场有个客户于14:00需要车,那么小众通过何种方式将这个信息传给小张呢?假如小众公司正在使用Blackberry的服务,那么可以通过Alert的方式来实现。 现在总结一下: alert 新闻 财经 定单 文档 体育 服务不仅仅限于上面。 原理: 先看张图 简要解释一下: 先解释身份角色: Push Initiator:相当于小众公司,后面见车简称PI Blackberry Push Data Server:相当于部署在小众公司的Blackberry服务基础架构,后面简称BPIS Mobile Client:司机小张的Blackberry终端,简称,MC 再解释一下流程: PI发送一个push请求,即客户信息 BPIS给出一个返回给PI BPIS就请求push给MC MC收到后给出一个ACKnowledge,确认 BPIS给PI一个通知 PI收到后给BPIS一个返回 类似的机制和互联网的三次握手类似,就是Request/ACK/Response.目的就是为了保证大家都收到。 优点 很显然,省电,能够及时送达,安全,包括传送,以及安全送达。 实现 PAP XML HTTP 请求 几种push,例如submit,cancel,query等,具体技术细节不讲,因为这些又可以单独拿出来了。 综合上述,如果您熟悉PUSH,是不是觉得似曾相识呢。 不管怎么说,从中,我们可以进一步,也更清晰了解Blackberry PUSH这个概念。这在以后的解决方案中提供不少思路。

继续阅读本文 →

Taigoo发表于 June 29, 2009 7:46 pm | 留言(2) |开发 

黑莓通过编程的方式挂电话

最近使用了很多在Blackberry运行的来电防火墙软件。其实他们的实现方式很简单。 先分析一下,如何挂断电话呢?如果你在RIM提供的API里找一圈,你会特别失望,因为它根本没有提供对应的API。这点上,我觉得RIM特别不道德。 但是是不是没有方法了呢?我觉得办法还是有的。 我想出的办法就是模拟挂电话这个操作。 3个步骤: 按下去:press down 按住,哪怕0.1s:Hold on 松开: press up 代码如下: EventInjector.KeyEvent pressEndKey= new EventInjector.KeyEvent(EventInjector.KeyEvent.KEY_DOWN, Keypad.map(Keypad.KEY_END),KeypadListener.STATUS_NOT_FROM_KEYPAD,100); EventInjector.KeyEvent releaseEndKey= new EventInjector.KeyEvent( EventInjector.KeyEvent.KEY_UP, Keypad.map(Keypad.KEY_END), KeypadListener.STATUS_NOT_FROM_KEYPAD,100); EventInjector.invokeEvent(pressEndKey); EventInjector.invokeEvent(releaseEndKey); 是不是觉得很简单呢。 不过,这个方法,包括我上面说的几个软件都有一个共同的缺点,而且我认为是一个特别不好的方式,那就是当对方拨通电话之后,响了一声就挂断。这对于打电话的人来说是特别不友好的。 试想一下,你如果打电话给对方,然后啪一声挂了,接着你又打,又是啪一声。你什么感觉?

继续阅读本文 →

Taigoo发表于 October 13, 2008 5:56 pm | 留言(8) |开发 

BlackBerry 应用程序开发者指南 第二卷:高级–第12章 管理应用程序

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()作为基本机制和其他进程进行通讯.   [...]

继续阅读本文 →

Taigoo发表于 April 29, 2008 6:17 am | 留言 |文档 

上一页