一、PhoneGap平台
前不久PhoneGap发布了1.0版本,这为移动开发大家族提供了又一个跨平台的解决方案。开发者只要有JavaScript、CSS3、Html5的基础就可以快速开发移动应用,并且一次开发支持iOS、iOS(xcode 4)、Android、WebOS、Blackberry、Symbian 六大平台。不过,JavaScript的速度虽然在近些年提高了100倍,其速度还是无法和原生代码相比。在编写复杂的业务逻辑时JavaScript显得力不从心。那么PhoneGap有没有办法解决这个问题呢?答案是肯定的。PhoneGap平台提供了插件功能,开发者可以将重量级的功能封装在原生代码开发的插件中,并将接口暴露给JavaScript,JavaScript在调用插件功能时都是非阻塞的,所以并不影响JavaScript层的性能。下面我们就看看如何编写和调用一个PhoneGap插件吧。
二、编写插件
由于要写原生代码,所以各个平台插件的编写略有不同。我们以Android为例吧。这个是PhoneGap官方的例子,原文网址:http://wiki.phonegap.com/w/page/36753494/How%20to%20Create%20a%20PhoneGap%20Plugin%20for%20Android 需要翻*墙。
1.插件功能
PhoneGap提供了文件读写的Api,但没有提供列出文件清单的功能。我们编写一个名为 DirectoryListingPlugin 的插件来实现列表SDCARD上文件的功能吧。
2.创建一个Android工程
如下图所示:
3.包含PhoneGap依赖
- 下载PhoneGap并解压
- 在工程根目录新建目录/libs
- 拷贝 phonegap.jar 到 /libs
注:由于是写插件,所以只有phonegap.jar就够了。要建立完整的PhoneGap应用,可参考http://www.phonegap.com/start/#android
4.实现插件类
代码:
002 |
*
Example of Android PhoneGap Plugin |
004 |
package com.trial.phonegap.plugin.directorylisting; |
010 |
import org.json.JSONArray; |
011 |
import org.json.JSONException; |
012 |
import org.json.JSONObject; |
015 |
import android.util.Log; |
018 |
import com.phonegap.api.Plugin; |
019 |
import com.phonegap.api.PluginResult; |
020 |
import com.phonegap.api.PluginResult.Status; |
024 |
*
PhoneGap plugin which can be involved in following manner from javascript |
027 |
*
{"filename":"/sdcard","isdir":true,"children":[{"filename":"a.txt" |
028 |
*
,"isdir":false},{..}]} |
033 |
*
successCallback = function(result){ |
037 |
*
failureCallback = function(error){ |
038 |
*
//error is error message |
041 |
*
DirectoryListing.list("/sdcard", |
048 |
*
@author Rohit Ghatol |
051 |
public class DirectoryListPlugin extends Plugin
{ |
053 |
public static final String
ACTION = "list" ; |
099 |
private JSONObject
getDirectoryListing(File file) throws JSONException
{ |
100 |
JSONObject
fileInfo = new JSONObject(); |
101 |
fileInfo.put( "filename" ,
file.getName()); |
102 |
fileInfo.put( "isdir" ,
file.isDirectory()); |
103 |
if (file.isDirectory())
{ |
104 |
JSONArray
children = new JSONArray(); |
105 |
fileInfo.put( "children" ,
children); |
106 |
if ( null !=
file.listFiles()) { |
107 |
for (File
child : file.listFiles()) { |
108 |
children.put(getDirectoryListing(child)); |
5.将插件类导出成jar 包
Eclipse中如下操作:
- 在要生成jar的项目上右击,选择菜单上的Export(导出)
我们导出成directorylist.jar
6.实现JavaScript插件
- 创建一个名为DirectoryListing的类
- 创建一个成员函数list()
- 在成员函数中调用PhoneGap.exec(<<successCallback>>,<<failureCallback>>,<<Plugin
Name>>,<<Action Name>>,<<Arguments Array>>);
- 将js文件保存为directorylisting.js
代码:
03 |
*
@return Object literal singleton instance of DirectoryListing |
05 |
var
DirectoryListing = { |
07 |
*
@param directory The directory for which we want the listing |
08 |
*
@param successCallback The callback which will be called when directory listing is successful |
09 |
*
@param failureCallback The callback which will be called when directory listing encouters an error |
11 |
list:
function(directory,successCallback, failureCallback) { |
12 |
return PhoneGap.exec(successCallback, |
14 |
'DirectoryListPlugin' , |
三、测试
1.创建一个PhoneGap应用 http://www.phonegap.com/start/#android
2.将 directorylisting.jar 加入工程依赖
3.将directorylisting.js放入到 /assets/www 目录下。
4.在 /res/xml/plugins.xml 文件中添加
1 |
< plugin name = "DirectoryListPlugin" |
2 |
value = "com.trial.phonegap.plugin.directorylisting.DirectoryListPlugin" /> |
5.在index.html中调用DirectoryListing.list
代码:
04 |
<title>PhoneGap</title> |
08 |
<input
disabled id= "list-sdcard" type= "button" value= "List
SDCard Contents" /> |
11 |
<!--
Place Holder for placing
the SD Card Listing --> |
12 |
<div
id= "result" ></div> |
16 |
<script
type= "text/javascript" src= "phonegap-1.0.0.js" ></script> |
17 |
<script
type= "text/javascript" src= "directorylisting.js" ></script> |
18 |
<script
type= "text/javascript" > |
19 |
document.addEventListener( 'deviceready' , function ()
{ |
20 |
var btn
= document.getElementById( "list-sdcard" ); |
21 |
btn.onclick
= function ()
{ |
22 |
DirectoryListing.list( "/sdcard" , |
23 |
function (r){printResult(r)}, |
31 |
function printResult(fileInfo){ |
32 |
var innerHtmlText=getHtml(fileInfo); |
33 |
document.getElementById( "result" ).innerHTML=innerHtmlText; |
36 |
function getHtml(fileInfo){ |
37 |
var htmlText= "<ul><li>" +fileInfo.filename; |
38 |
if (fileInfo.children){ |
40 |
for ( var index=0;index<fileInfo.children.length;index++){ |
41 |
htmlText=htmlText+getHtml(fileInfo.children[index]); |
44 |
htmlText=htmlText+ "</li></ul>" ; |
至此,一个PhoneGap Android插件就成完了。
文章转自 : http://blog.csdn.net/yyan/article/details/6664863