您的位置:首页 > 其它

在低于3rd FP2的S60平台上建立类似Widget的应用

2011-04-04 12:38 459 查看
Widget应用实际上是一个嵌入了CSS、JavaScrip甚至Ajax的HTML文件(当然还包括针对S60 3rd
FP2中WebRunTime安装和运行所需的Info.plist和Icon.png),也就是一个本地的基于网页的应用,而这种基于网页的应用其实在
低于3rd FP2的S60平台上也可以运行,只要其使用的技术该平台支持即可(从S60
2nd就已支持xHtml规范,但其不支持JavaScript,只支持WMLScript。S603rd则支持HTML
4.01、JavaScript 1.5子集)。

当然由于有些设备用于打开HTML文件的默认程序是“服务”(也就是通常所说的WAP浏览器,从S60
3rd开始分为“服务”和“网络”,S60 3rd
FP1又合二为一成“网络”),有些标签或脚本语言可能不支持,所以也可以在“网络”(Web浏览器)的地址栏输入文件地址来运行(例如手机存储的“其
它”文件夹中有个叫aHtml.html的文件,则其地址为:file://c:/Data/Othes/aHtml.html,),这样效果会好一些。
当然,也有“服务”支持而“网络”不支持的情况。

举个最简单的例子,将ajaxsample.wgz
[1]

解压缩软件解压,然后将文件夹复制到S60
3rd设备可访问的存储中,再利用文件管理打开其中的主HTML文件,由于默认打开方式为“服务”,基本显示不正常,但如果使用“网络”输入地址打开,则
除了Widget标签外的大部分功能都可实现。所以在实际中必须根据不同平台在网页应用中使用不同的规范和版本。

也就是说,如果可以通过某种架构将某个主HTML文件以应用程序的方式加载,那么我们就能够在低于3rd
FP2的S60平台上开发出类似S60 3rd
FP2中的Widget应用。是否存在这种方式呢?答案是肯定的,那就是:在一个结构最为简单的S60应用中嵌入式的打开某个位于设备存储上的HTML文
件,以调用其相应的基于网页的应用。开发完成的这个S60应用可以通过SIS文件安装在设备上,只需要应用名称、标题、图标、用户界面(全屏,最好是只有
一个“退出”按钮)与网页应用匹配即可。这样我们开发的网页应用就可以发布到更多的S60 3rd设备上,更有甚者,如果
这个网页应用是基于嵌入WMLScript的WML文件,则理论上可以在更低版本的设备上实现(例如S60 2nd)。

在S60应用中打开HTML文件对大家并不陌生,主要有三种方法:

1.Document Handler(CDocumentHandler)

#include <APMSTD.H>

#include <DocumentHandler.h>

_LIT( KFileName, "//Data//Othes//aHtml.html" );

const TDesC& aFileName = KFileName;

CDocumentHandler* aDocHandler;

if( !aDocHandler)

{

aDocHandler = CDocumentHandler::NewL((CEikProcess*)iEikonEnv->Process());

}

TInt error = KErrNone;

TDataType aDataType;

error = aDocHandler->OpenFileEmbeddedL( aFileName, aDataType );

链接apmime.lib和commonui.lib

2.App framework APPARC(TApaTaskList、TApaTask)

HBufC* aParams = HBufC::NewLC( 100 );

aParams->Des().Copy( _L( "file://c:/Data/Othes/aHtml.html" ) );

TInt anApplicationUid = 0x10008D39;

TUid id( TUid::Uid( anApplicationUid ) );

TApaTaskList aTaskList( CEikonEnv::Static()->WsSession() );

TApaTask aTask = aTaskList.FindApp( id );

if ( aTask.Exists() )

{

HBufC8* aParams8 = HBufC8::NewLC( aParams->Length() );

aParams8->Des().Append( *aParams );

aTask.SendMessage( TUid::Uid( 0 ), *aParams8 );

CleanupStack::PopAndDestroy();

}

else

{

RApaLsSession aLsSession;

User::LeaveIfError(aLsSession.Connect());

TThreadId id;

aLsSession.StartDocument( *aParams, TUid::Uid( anApplicationUid ), id );

aLsSession.Close();

}

CleanupStack::PopAndDestroy();

链接apgrfx.lib

3.Browser Control API

#include <brctldefs.h>

#include <brctlinterface.h>

int aCommandBase = TBrCtlDefs::ECommandIdBase;

int aBrCtlCapabilities = TBrCtlDefs::ECapabilityDisplayScrollBar | TBrCtlDefs::ECapabilityLoadHttpFw;

TRect rect = Rect();

aBrCtlInterface = CreateBrowserControlL( this, rect, aBrCtlCapabilities, aCommandBase, NULL, NULL, NULL, NULL);

_LIT(KFileName, "file://c:/Data/Othes/aHtml.html");

aBrCtlInterface->LoadUrlL(KFileName);

aBrCtlInterface->ActivateL();

链接BrowserEngine.lib

注意:
1.因平台版本不同,同样位置文件的路径表示方式可能会不同,需根据实际情况变化;
2.使用Browser Control
API的应用需要在AppUi(继承自CAknAppUi的实例)和Appview(继承自CCoeControl的实例)中实现
HandleKeyEventL和OfferKeyEventL,以及两实例之间按键事件的的传递,以达到基本的网页浏览控制,或是实现其它一些请求、下
载等控制,甚至要添加各种观察器(Observer)以及能力(S60 3rd的Capability)。详细情况请参考SDK例程Browser
Control Example(%EPOCROOT%/60EX/BrCtlSampleApp)。

前两种方法(Document Handler、App framework APPARC)从S60
2nd就已获得支持,适合大多数S60设备,且非常简单,但在界面上很难和Widget应用做到相似,且第二种方法依赖应用UID,众所周知各个平台(尤
其是S60
3rd以上)的浏览器UID不尽相同,使用这种方法需要依据平台变换UID,当然也有好处:可以自由选择“服务”还是“网络”打开文件,有利于解决设备有
两个浏览器的情况;在界面上与S60 3rd FP2中的Widget应用最相似的是第三种方法,但Browser Control API从S60
2nd FP3才开始支持,比较受平台限制,编码也相对前两种复杂。

综上所述,在S60 2nd FP3以上版本我们可以使用Browser Control
API加载基于Html、JavaScript的网页应用,而S60 2nd FP3以下版本则可以通过Document
Handler打开嵌入WMLScript的WML文件来实现类似Widget的应用。

当然这种应用由于所开发平台标签语言和脚本版本的限制,无法达到与S60 3rd
FP2同样的效果,但这样可以简化S60平台的应用开发。尤其是一些简单应用,特别是网络应用的开发。相对于复杂的C++编程,网页实现同样的功能,例
如:文字、图片、文本输入框、列表、菜单、按钮、标签页等的显示控制,以及利用脚本实现数据处理和特殊效果方面,无论是代码量和复杂程度都要低的多,且较
容易实现。这就为我们开发简单应用提供了一种新的便捷方法。]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: