原文地址:http://blog.csdn.net/Mailbomb/archive/2009/05/04/4149374.aspx
我的程序 能节能休眠
模仿功能:节能休眠模式
模仿对象:手机QQ2008
模仿进度:第一期
开发平台:Java平台
开发手机程序是需要经验,可很多读者都是才从PC平台转型而来,根本没有经验,如何快速的提高自己手机平台的开发经验呢?模仿设计,模仿知名手机程序的特色功能进行设计,快速积累手机平台的开发经验。下面,我们就选定手机QQ2008,模仿它的特色功能,先来看看“节能休眠模式”是如何设计的(完整程序下载地址:http://www.shuodoo.com/bzsoft)。
节能休眠模式设计思路
节能休眠模式的功能是降低手机QQ的耗电量,减少手机QQ的GPRS流量费用,从而减少用户充电的间隔时间,减少流量费用的支出。手机QQ的这种设计,充分考虑了手机用户的使用体验,是一种比较贴心的设计。这种模式也适合手机网络游戏和手机网络程序。
要模仿设计节能休眠模式,先制作一个简单的界面,该界面用于显示亮度变化和显示内容。另外还要在该界面类内部添加了一个系统线程,该系统线程的作用是定时发送一些系统信息,例如向服务器发送好友上下线通知、从服务器端获得发送给该用户的信息等。
在该模拟程序中,设计了一个专门的控制类,由该类实现节能和减少流量信息的控制,这样程序的结构比较清晰,也方便对于逻辑的修改。为了模拟网络通信,还专门设计了一个模拟网络发送的类,该类负责发送程序已经提交的通信指令(图1)。
减少GPRS流量
在手机网络程序中,当用户长时间不操作手机时,关闭屏幕或降低屏幕的亮度,是几乎所有的手机程序都可以实现的功能,但在实时性比较强的手机网络程序中,降低网络通信的频率会妨碍程序的实时性,所以只能从优化程序的协议设计、减少网络通信的数据量等方面考虑。优化网络协议的设计才是减少GPRS流量最核心的办法。
小知识:针对减少耗电量来说,就是减少程序的功能和降低屏幕的亮度。在手机QQ中,在休眠模式下,关闭了声音和振动提示等非核心功能,同时还降低了屏幕的亮度,甚至关闭了屏幕。关闭声音和振动提示功能,只需要在程序代码中加入一定的判断,在节能休眠模式下不执行该功能即可,对于关闭屏幕显示则需要使用手机新增的API,例如在Nokia系列的手机上可以使用Nokia UI API:DeviceControl.setLights(0,0);。
减少GPRS流量,就是减少程序和服务器网络通信的次数,并去掉一些不重要的网络通信。在手机QQ中,主要是通过去掉一些不重要的功能,例如关闭获得群信息、语音图片、好友上下线通知、新邮件更新提醒等网络通信指令,从而节约了客户端发送的指令流量和服务器端反馈的指令流量。
减少与服务器通信的频率,也会间接同时减少手机的用电量。这些功能需要在程序的逻辑控制中体现:减少无关网络指令的添加,以及增加网络连接线程的延迟时间从而达到降低和服务器端的网络通讯频率实现(图2)。
节能休眠模式设计步骤
第一步:创建项目
启动Eclipse环境,选择“File→New→J2ME MIDlet Suit”,设置项目名称为“EnergySaving”,并一路选择“Next”, 完成项目的建立。然后新建一个J2ME入口类,选择“File→New→J2ME MIDlet”,并设置名称为“EnergySavingMIDlet”,点击“Finish”。创建项目的代码下载地址是http://www.shuodoo.com/bzsoft。
第二步:设计界面
选择“File→New→Class”,并设置名称为“DemoForm”,点击“Finish”完成界面类的创建。接着,开始初始化界面。关键代码如下所示(完整代码下载地址:http://www.shuodoo.com/bzsoft):
public DemoForm(){
super("正常模式");
//初始化界面
cmdNormal = new Command("正常模式",Command.OK,1);
cmdEnergySaving = new Command("节能模式",Command.SCREEN,2);
addCommand(cmdNormal);
addCommand(cmdEnergySaving);
//初始化控制对象
control = new Control(this);
//注册事件监听器
this.setCommandListener(this);
//启动定时发送系统通信指令线程
Thread t = new Thread(this);
第三步:界面亮度调整
在手机切换到节能状态时,将节能开关变量打开,并将界面亮度调整到最高亮度的1/10。代码如下所示:
public void setEnergySavingMode(){
spf = ENERGYSAVING_SPF;
isInEnergySavingState = true;
//设置屏幕亮度
DeviceControl.setLights(0, 10);
}
通过赋值spf的值为节能模式SPF(每帧间隔时间),降低界面类中定时发送的系统指令发送的频率。通过赋值变量isInEnergySavingState为true,控制界面类中的定时发送系统指令时不发送非核心的指令,如好友上下线通知等,这样可以减少网络流量,也可以在一定程度上节能。通过设置屏幕亮度为10,使得屏幕亮度只是正常亮度的1/10(亮度最亮为100),可以达到显著的节能效果。
第四步:减少GPRS流量
在手机切换到节能状态时,程序将不会添加周期性的非核心网络通信指令到网络线程中这样网络线程发送的命令请求将减少。另外降低某些必须指令的发送频率,例如把获得信息的指令从每2秒发送一次,降低到每10秒发送一次,这样也可以显著减少流量,也可以降低程序的消耗。关键代码如下所示(完整代码下载地址:http://www.shuodoo.com/bzsoft):
public void addSystemData(){
if(isInEnergySavingState){
return; //结束
}
sendVector.addElement("正在查询好友上下线信息...\n");
sendVector.addElement("正在查询新邮件提示...\n");
sendVector.addElement("正在获得群信息...\n");
while(true){
//延时
Thread.sleep(Control.spf);
//添加命令
control.addSystemData();
control.addNeedData();
第五步:运行程序
在Eclipse主界面左侧的“Package Explorer”中,选中项目源代码EnergySavingMIDlet.java,单击鼠标右键,选择“Run As→Emulated J2ME Midlet”即可运行程序(图3)。
作者:peterzb(个人开发历程知识库 -
博客园)
出处:http://peterzb.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。