make a little difference

[置顶]Micolog部落——一个Micologer的聚集地

日期:2010.11.09
标签: micolog 个人项目
分类: what

phoengap源码解析——插件机制,java和js代码互调用详解

看了眼phonegap的android实现的源码,其实还是挺简单的。出乎意料的是,我原以为js这套api的封装是使用addJavascriptInterface这个接口完成的,但是它是用了一种奇异的方法来实现的。我们一步一步慢慢说。

http://docs.phonegap.com/en/1.3.0/index.html这个链接是phonegap的js api,可以看到api是分模块的,有Accelerometer,Camera,Capture,Compass,Connection,Contacts,Device,File,Geolocation,Media,Notification,Storage,Events,而每一个模块恰好是phonegap的一个plugin。而每一个plugin恰好大体对应一个java文件和一个js文件。在实际用phonegap开发的时候,我们引用的phonegap.js是经过编译整合后的文件,源码的framework/build.xml中有如下一段可以说明:

<!-- Create uncompressed JS file -->
<concat destfile="assets/www/phonegap-${version}.js">
 <fileset dir="assets/js" includes="phonegap.js.base" />
 <fileset dir="assets/js" includes="*.js" />
</concat>

插件机制对应的java代码,主要在com.phonegap.api这个包里,所有的api对应模块的java实现都扩展了Plugin类,并且在src/com/phonegap/api/PluginManager.java中有public String exec(final String service, final String action, final String callbackId, final String jsonArgs, final boolean async);方法,此方法里面调用plugin.execute方法,相应的plugin插件实现了execute方法,进行具体操作。对应js代码,插件机制以及公有基础的东西主要phonegap.js.base文件,每个单独的模块文件实现具体的操作。js代码里也有相应定义,
/**
* Execute a PhoneGap command. It is up to the native side whether this action is synch or async.
* The native side can return:
* Synchronous: PluginResult object as a JSON string
* Asynchrounous: Empty string ""
* If async, the native side will PhoneGap.callbackSuccess or PhoneGap.callbackError,
* depending upon the result of the action.
*/
public String exec(final String service, final String action, final String callbackId, final String jsonArgs, final boolean async);
可以看到api操作还提供了同步异步两种模式。这里的一些东西到这里可能还不是很明朗,稍后了解了java和js互掉的原理后就清楚了。

但是这里,特别的对于Events有些特别,java与js交互上是不同于其它模块的方法且相对简单的,所以先说这个。在src/com/phonegap/DroidGap.java文件中可以看到,所有js的回调事件都是通过loadUrl然后执行一段javascript脚本来实现的,如

生命周期回调:this.appView.loadUrl("javascript:try{PhoneGap.fireDocumentEvent('resume');}catch(e){};");
按钮响应:this.appView.loadUrl("javascript:PhoneGap.fireDocumentEvent('backbutton');");

assets/js/phonegap.js.base相应代码为:

PhoneGap.fireDocumentEvent = function(type, data) {
    var e = document.createEvent('Events');
    e.initEvent(type);
    if (data) {
        for (var i in data) {
            e[i] = data[i];
        }
    }
    document.dispatchEvent(e);
};

好了,开始最重要的部分了。phonegap使用的java与js互相调用的原理。phonegap实现的模型刚也说了,有同步和异步两种。js实现的api,所以是js先会调用java代码,然后再返回给js。对于同步的而言,就是js调用java,然后java返回一个结果作为返回值。对于异步的而言,可能js掉了很多java代码,但是立即返回,然后java代码执行结束后再回调js代码,这里就涉及到js调java,然后java再调用js。

对于js调用java:

js调用java的入口是通过在js中调用prompt方法,这很奇怪吧,这个方法本来是让浏览器弹出个输入框的。我当初找了好久也没发现phonegap到底怎么搞得的让js调用java的代码,后来看到一会觉得该是这个方法,但是这是一个浏览器的客户端自己的东西,而且怪异的是浏览器并没有弹出输入框,后来终于发现。

在DroidGap.java中有个hack,重载了WebviewClient的onJsPrompt方法,然后执行了自己的逻辑。 也就是js调用prompt的时候,java端浏览器代码接受到这个,然后在响应的处理函数中根据传过来的参数,实现了一些特别的逻辑。可以从这个方法的注释上看出一二。

/**
* Tell the client to display a prompt dialog to the user.
* If the client returns true, WebView will assume that the client will handle the prompt dialog
* and call the appropriate JsPromptResult method.
* Since we are hacking prompts for our own purposes, we should not be using them for this
* purpose, perhaps we should hack console.log to do this instead!
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
...
}

方法里面的代码就如刚所说会根据传过来的参数,做相应处理,它会先判断是不是本地网页的请求,如果是,然后分几种情况。

// Calling PluginManager.exec() to call a native service using
prompt(this.stringify(args), "gap:"+this.stringify([service, action, callbackId, true]));
gap:
// Polling for JavaScript messages
gap_poll:
// Calling into CallbackServer
gap_callbackServer:
// PhoneGap JS has initialized, so show webview(This solves white flash seen when rendering HTML)
gap_init:

分别是,如果是prompt传过来的是gap:这样开头的字符串,那么就执行相应的java调用,Calling PluginManager.exec() to call a native service using prompt(this.stringify(args), "gap:"+this.stringify([service, action, callbackId, true]))。gap_poll:和gap_callbackServer:是稍后要说到的java回调js使用的,gap_init:初始化处理相关的代码。如果其它情况,则构造一个Android的AlertDialog显示。

然后phonegap就是这样,通过设置setWebChromeClient和setWebViewClient,重载了一些实现,控制了浏览器行为,实现了自己的很多逻辑。

对于java回调js:

phonegap实现了一个回调服务器,服务器就是负责回调js代码的,服务器有一个js代码的队列,在src/com/phonegap/CallbackServer.java文件中

/**
* The list of JavaScript statements to be sent to JavaScript.
*/
private LinkedList javascript;

服务器保存要回调的js的代码,供js客户端取回,这里java端是服务器端,js端是客户端,服务器端不可能请求客户端做啥,是b/s模型,所以phonegap实现了两种服务模型,一种是轮询,一种是XHR异步回调,也就是Ajax的模型。src/com/phonegap/CallbackServer.java是回调服务器的代码所在处。从类的注释中可以看到。

This class provides a way for Java to run JavaScript in the web page that has loaded PhoneGap.
The CallbackServer class implements an XHR server and a polling server with a list of JavaScript statements
that are to be executed on the web page.

CallbackServer提供的这两种模型,一种是XHR,一种是轮询,轮询很简单了,callbackserver服务器端,有一个保存回调js的列表,前面所说,然后每隔一段时间客户端的js会询问一次服务器,是否有需要回调的js,如果有则调用,然后每隔一段时再查询一次服务器。而基于XHR的,其实这个就是ajax用的机制了,js发起一个异步请求,然后服务器会在返回数据之前保持住这个连接,当返回数据就位后,服务器给请求客户端返回数据,然后关闭连接。然后客户端接受并且处理。

刚说了服务器端的代码实现,现在来看一下客户端js的相关代码。

/**
* Internal function that uses XHR to call into PhoneGap Java code and retrieve any JavaScript
* code that needs to be run. This is used for callbacks from Java to JavaScript.
*/
PhoneGap.JSCallback = function() {
...
xmlhttp.open("GET", "http://127.0.0.1:"+PhoneGap.JSCallbackPort+"/"+PhoneGap.JSCallbackToken , true);
xmlhttp.send();
}

这个是XHR模型的代码,客户端js使用xhr请求服务器来获取js代码,进行回调。

/**
 * Internal function that uses polling to call into PhoneGap Java code and retrieve
 * any JavaScript code that needs to be run.  This is used for callbacks from Java to JavaScript.
 */
PhoneGap.JSCallbackPolling = function() {
...
    var msg = prompt("", "gap_poll:");
    if (msg) {
        setTimeout(function() {
            try {
                var t = eval(""+msg);
            }
            catch (e) {
                console.log("JSCallbackPolling: Message from Server: " + msg);
                console.log("JSCallbackPolling Error: "+e);
            }
        }, 1);
        setTimeout(PhoneGap.JSCallbackPolling, 1);
    }
    else {
        setTimeout(PhoneGap.JSCallbackPolling, PhoneGap.JSCallbackPollingPeriod);
    }
}

这个是轮询方式的,可以看到客户端每隔PhoneGap.JSCallbackPollingPeriod段时间,就请求一次服务器(通过prompt("", "gap_poll:");)。

 

至此js和java互调用,phonegap的plugin插件机制和api的实现原理就清楚了。另外phonegap源码的注释是很不错的。

日期:2012.01.28
标签: phonegap Android 源码解析
分类: why
0 Comments

PhoneGap,Web Application,反编译,代码阅读器——4in1游戏卡,寻觅童年游戏机快感

这篇文有点杂了,说了四部分,破折号后面纯扯了,如标题所示,分别是,title='PhoneGap,Web Application,代码阅读器,反编译——4in1游戏卡,寻觅童年游戏机快感'; title[:title.index('—')].split(',')

PhoneGap
phonegap,我想搞手机开发的人应该都知道,使用phonegap可以用web开发的前端技术开发应用,也就是html,css,js开发应用,然后可以部署到多个主流平台,并且phonegap根据各个平台封装了统一的一套和手机交互的api。API包含Accelerometer,Camera,Capture,Compass,Connection,Contacts,Device,File,Geolocation,Media,Notification,Storage等。然后就是js那套事了。

android的activity的生命周期算是android学习的第一课,那么关于phonegap的生命周期呢,分别是onDOMContentLoaded, window.onload,onNativeReady,onPhoneGapInit,onPhoneGapReady,onPhoneGapInfoReady,onDeviceReady,onResume,onPause,onDestroy。其中只有deviceready,pause,resume是提供给用户处理的,deviceready是java代码部分初始化完毕全部初始化完成,状态就绪触发,pause,resume是和android的onPause和onResume一样周期。

phonegap的问题是性能问题,还是会卡,照原生应用差很多,而且对于有大量后台逻辑的很不适合,Services,线程啥的还是很麻烦,官网说像Dropbox这种,大量上传下载,同步逻辑的应用不适合搞。而且虽说是phonegap是跨平台,但是按照http://phonegap.com/apps应用列表来看,大部分都是只编译了ios平台的,只用phonegap确实有很多限制,之前看到有部分嵌入phonegap的,当前这种模型可能更多也更适合些。

对于部分采用phonegap的,可能需要和其它原生Activity交互,传送数据什么的,phonegap提供了插件机制,github有维护插件列表,有个webintent,phonegap默认没有用js打开本地activity的方法,用别的activity启动phonegap的activity的时候也不能传参给js代码,这个可以方便做这些操作。最近版本的phonegap这个webintent插件失效了,phonegap插件机制有所更改,需要做一点更改,可以看这里https://github.com/phonegap/phonegap-plugins/pull/335。关于phonegap plugin,其实大部分的api都是基于插件机制做的,但是关于plugin的相关文档很不好,如果想写phonegap插件,还是看别的插件和源码中插件那部分,我看了下其实不复杂。

Web Application
分四部分,内容大部分来自android dev guide,其实Web Application就是应用里面嵌入个浏览器,用浏览器呈现网页罢了,不过是文艺的说法。

1. Targeting Screens from Web Apps
又是屏幕问题,Android的设备多种多样,重要的是dpi也不一样,你说电脑显示器也很多,各种各样,但是dpi是一致的。
对于Web Application,Android系统提供了一些对于分辨率的支持,html代码定义一些meta,webview会识别,然后做相应调整。

<meta name="viewport"
      content="
          height = [pixel_value | device-height] ,
          width = [pixel_value | device-width ] ,
          initial-scale = float_value ,
          minimum-scale = float_value ,
          maximum-scale = float_value ,
          user-scalable = [yes | no] ,
          target-densitydpi = [dpi_value | device-dpi |
                               high-dpi | medium-dpi | low-dpi]
          " />

简要说明,默认viewport的宽是800像素,如果设置了,设置多少就是多少,如果设置成device-width(height)就是手机分辨率的像素数。user-scalable是否允许用户缩放。另外js中可以通过window.devicePixelRatio取得设备像素密度比值。css可以通过media的-webkit-device-pixel-ratio属性来加载相应的css。

2. Building Web Apps in WebView
总结起来一句话用WebView,这个类仔细看看其实挺好玩,涉及到另两个WebViewClient和WebChromeClient,也很好玩。

3. Debugging Web Apps
Debuging好说,就是用console.log之类的,会在Logcat上打印。

4. Best Practices for Web Apps
其实这也没啥东西。

总结起来其实没啥东西。

反编译
------
http://code.google.com/p/android-apktool/
主要用来看反编译出来的资源文件。

http://code.google.com/p/dex2jar/
配合JD(Java decompiler),主要用来看反编译出来的代码。代码被混淆过的话,看了也看不出来啥,有的时候可以看看它用了什么库。

用法都很简单,另外,可以用hierarchyviewer来看Activity的布局,需要手机是Debug模式的,这个不是说手机root后就可以用。手机要是Debug模式的。

5分钟构建代码阅读器

刚看到一条微博,《简讯:为庆祝 Vim 编辑器的20周年,Applidium 项目团队把 Vim 移植到 iOS 了》。
然后有人回复:放过程序员吧!别人买一ipad开心玩游戏,我们买一个ipad到处写程序啊!

~~~~

代码阅读器,这其实是一个需求。

最基础的需求是代码高亮,这个其实巨简单,可以写成web application,可以用phonegap,现成的基于js的代码高亮工具有很多,搞技术博客的人肯定知道一堆这种js脚本,我看了几个简单的代码阅读器,都是基于google的prettify的。

读取文件内容到html,然后js高亮。读取文件可以java读取然后给html,也可以用phonegap的File API,用了下File API,很简单也好用。如果想要文件浏览器之类的,可以用OpenIntents的OI文件管理器,http://www.openintents.org/en/,然后就完了。可以说是5分钟完成代码阅读器应用。

另外,通过反编译,看到有的原生实现的用到了RSyntaxTextArea这个库,关于Android重点在MultiAutoCompleteTextView.Tokenizer这个东西,大概看了一眼。

但是我觉得,代码阅读的关键是,交叉引用的跳转,管有代码高亮只实现了一半,研究了半天没找到什么解决方案。过程中找到ace editor这个玩应,挺强大,但是对平板触摸设备不兼容,虽然有ipad branch,但是不好用。

结:这篇博文有点扯了,写的很粗,过年Happy下~

日期:2012.01.25
标签: phonegap web app Android
分类: when
0 Comments

写博二年总结

写博两个年头了,上一年的总结在这里,现在开始动笔写今年的。这几天看“麦韩方”博文论战,看的很爽,点亮了节日的气氛,也骚动了我写博的心弦,虽然内容完全是不同的领域。

翻看过去一年的博文,我越回想越翻看,越觉得有点矫情,这很令人讨厌。矫情,犹豫不决,然后不动手,结果一年什么也没做。该是立刻动手,都动手搞起来。另外,翻的过程中,发现有些东西觉得自己像是知道了很多,但是今天回头一翻,发现其实自己不过才接触一年,要自省。

翻了一遍第二年的博文,一共40篇左右,选出几篇喜欢的或者有点意义的,下面列出来。

十问十答
文体有点意思,里面写“Google的理念是只应有Browser和Game,我也一直这样认为。”,恰巧刚写过的一篇博文也提到过。

Android学习小结(一)——由Activity说开去
Android文第一篇,纯纪念。

wiki+写
夭折的wiki,断断续续的想弄wiki,现在发誓不弄了!

养植物与获取信息
很有feel,喝奶,养植物。植物还活着,养了8个月了。说养,其实一直没怎么管,回老家前,离开宿舍时,给它浇了点水。平时基本上我很难想到给它浇水,因为它被我丢在宿舍阳台里,偶尔想起也懒得出去弄点水,给它浇一下,仙人掌果然强悍阿,还坚挺的活着。

我说
整理的豆瓣上说过的话,后来基本没在豆瓣上说过话,还是喜欢豆瓣的书影音。

回想微软创新杯比赛点滴
那些年,我们一起参加的比赛。

目标
“这些想法让我也产生了一个冲动,就是我是一个目的明确的人。然而渐渐的,我想到这并不是真的。我想到我经常穿梭于Web上的各种链接,我时常的目的是打开Google,用它搜索点什么,然而我最初的目的就随着我一次一次点击链接而渐渐远去。”

update
写于2011.09.06,上一篇2011.07.17,间隔最旧的下一篇。

2011-2012
年度总结

用html5的canvas写了个书籍翻页效果
玩票html5

 

看了一眼,去年的总结也是在腊月二十九写的,今年恰巧也是这天,过年了,春节快乐~

日期:2012.01.22
标签: 博文总结
分类: summary
0 Comments

用html5的canvas写了个书籍翻页效果

之前在Android上写了个书籍翻页效果,主要也是用到里面的canvas进行绘图和变换,昨天想玩下html5里的canvas,然后把这个效果移植过来了一下。

2d画图那套东西,好像大体上都差不太多,也就是颜色,字体,绘制图形,图片,文字,组合,变型,裁剪等这些东西,主要是canvas这个类,它是画板,详情可以参看文后的几个链接,这里说下html5的canvas和Android中的canvas的区别。

html5的canvas这里几乎把所有接口都集中在了canvas的context上,要先获取canvas的context,然后操作context进行几乎一切操作。所有画笔轮廓字体的设定都是全局的,而不像Android中是通过相应的笔刷和设定通过传参进去的,canvas本身不维护这些属性。对于组合变换这些属性两者是都有维护的,canvas都有状态这个重要的东西,被设计这一个栈,可以说是状态栈,通过save(),restore()还进行状态保存恢复,这很重要,也很好用,保存状态后,你可以玩命折腾,然后一个restore()又恢复了之前的状态,从新开始。

移植过程中碰到很多api上的细节不同,纠结掉不少时间,而且自己js水平很水,写的很白。文本的折行分页处理没搞,主要是个demo,遗憾的是一些动画效果和细节没有实现,细节部分是自己的懒惰问题,加之昨天写到小指很痛。动画效果是由于最开始我没有了解canvas的动画机制,然后就开始上手写代码,最后写出来到实现动画的时候,发现和Android动画机制很不一样,我尝试了一下,暂时没想到什么解决方案,于是作罢。也许这些问题稍候会完善一下。

canvas实现的书籍翻页效果地址:http://www.qhm123.com/static/pages/pager.html(源码右键查看)

修正:右下角翻页背面效果已修正。注意几点:context.rotate(angel)这个参数是弧度,不是角度;rotate没有提供以某一固定点旋转接口,默认是以点(0,0)作旋转的;变换是逆序的(The transformations must be performed in reverse order.)

一些资料:

 

日期:2012.01.21
标签: html5 canvas 效果
分类: how
0 Comments

xen,virt-manager简介

Xen

Xen到底是个啥,是个软件,还是个虚拟化技术,应该说Xen是个虚拟化解决方案吧。Xen的全称应该是Xen hypervisor,是一套开源的虚拟化解决方案,允许计算机硬件同时运行多个操作系统。应该都用过vmware, virtualbox之类的虚拟机软件,xen与它们的不同之处在于,“VMware ESX服务器的架构是建立在直接执行(直接在硬件上运行用户级的虚拟机编码)和二进制译码(对特权级别编码进行动态编译)的基础上的。从根本上说,它把一个完整的X86平台导出到虚拟机上,ESX服务器可以使大多数能在X86上执行的操作系统都能在虚拟机上运行,而不需要进行任何修改。Xen的架构中使用了一种叫Para虚拟化技术 (Para virtualization) ,对虚拟出来的客户操作系统(Guest OS)进行修改,使它知道它是在虚拟环境下运行。 ”(引号部分摘自网络)。

使用Xen技术的有哪些,为人熟知的VPS提供商Linode就是用的Xen技术,这也应该是都知道的。(我曾经用过一次基于OpenVZ的VPS,据说基于OpenVZ的VPS没有基于Xen的VPS好,可以给Xen的技术的好提供一个佐证),另外Xen网站上写着Amazon的云服务AWS也是基于Xen的,还有Rackspace,这些东西有的玩票性质的玩过,有的耳闻目见过,都是不错的货。

Xen hypervisor包含三个部分,Xen Hypervisor,Domain 0(Dom0), DomainU(DomU)。Xen hypervisor直接跑在硬件上,是所有客户操作系统硬件请求的接口,位于硬件之上,客户操作系统之下。Domain-0是不同于DomainU拥有直接控制硬件特权的特权域,它是在系统启动时由Xen hypervisor启动的,它可以是除了Windows以外的任何系统,刚说了它有特权,所以它可以控制所有其他的客户域,比如开关,I/O请求等。客户域(DomU)由Dom0控制,可以是半虚拟化(Paravirtualization)运行修改过的操作系统,也可以是(Hardware Virtual Machine)运行未经修改过的操作系统。

安装Xen可以通过编译内核,或者apt-get,yum方式。我在Ubuntu下用apt-get方式安装过,但是Graphic Console不知道为什么是黑屏的,后来换了Fedora用yum装好,很方便。

一些资料:

virt-manager

virt-manager是用来管理虚拟机的可视化桌面应用,算是个通用的虚拟机管理软件,可以管理qemu,xen,kvm虚拟机,当然使用xen提供的xm工具也可以管理,virt-manager提供了一些更方便的工具和可视化的操作方式。

virt-manager是基于libvirt的python-binding写的软件(libvirt是一套用来和很多虚拟机交互的一套api),界面使用了了GTK+和Glade。

libvirt是重点,使用c语言写的,提供了很多语言的绑定,“Libvirt是一个软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等。这些软件包括一个API库、一个daemon(libvirtd)和一个命令行工具(virsh)。Libvirt的主要目标是:提供一种单一的方式管理多种不同的虚拟化提供方式和hypervisor。比如,命令行“virsh list -- all”可以列出所有任何支持的、基于hypervisor的虚拟机,这就避免学习、使用不同hypervisor的特定工具。使用libvirt,意味着使用virsh、virt-manager、virt-install等工具管理虚拟机,这些工具都是围绕着libvirt开发的。人们不再直接使用基于XEN的xm、或是qemu/qemu-kvm等二进制工具。”(引号部分摘自网络)

一些资料:

日期:2012.01.19
标签: Linux virt-manager xen libvirt
分类: what
0 Comments

买了个Android平板——小破文章一篇

想买个Android平板好久了,最早想买iPad,拖了好久,后来想在做Android开发,买个Android平板拿来还能写点程序。当然主要还是没钱,要不想买个iPad,再买个xoom,再买个kindle fire。。。

最近买了dell streak 10 pro,尽管网上评测问题很多,如我的使用体验,屏幕网格很明显,重力感应不灵敏,经常诡异的横竖屏切换,但没有出现无声问题。买的原因是便宜不到2000元,Android 3.2系统,之前也说了,想那这个板子做点东西,有一些屏幕还可以的板子不是3.x系统,当然我的理想产品是xoom,但是还是贵了几百,虽然已经降了不少了。

这个板子的还有一个让我让我郁闷的问题,它屏蔽了Google的服务应用,gmail,gtalk,android market,帐号同步啥的都用不了,我纳闷那些不让装Google应用的平板制造商是咋想的,脑袋被门挤了。作为一个谷粉,这是让我不能忍得,而且预装了一堆垃圾不能卸载的应用,这个板子还只在中国发售,所以xda上研究这个很少,有个ChimeraDroid版本的Rom,这个较为原生干净,http://forum.xda-developers.com/showthread.php?t=1342927。机锋坛子里有个配图的http://bbs.gfan.com/android-3407021-1-1.html,我觉得刚开始不懂的时候看一下还不错,但其实刷这个很简单,看xda的那个帖子就简单几步,机锋坛子里的搞的那个费劲。

用了几天的平板,感觉不能横竖平切换的软件很垃圾,这个不像手机,感觉平板横屏的使用场景更多。不能横屏的软件去死。手指操作主要集中在左右两个边缘中间偏上位置比较方便,我不喜欢太大范围内的移动手臂,甚至小范围内的。

视频播放器不给力,http://vplayer.net/,我用这个效果很不错,但是解码还是不是很给力,硬解不给力应该是cpu的关系,我对这个也不是很清楚,之前看了看FFmpeg这个项目,感觉播放个视频确实还是挺麻烦的,这个之前我还发了它的耻辱柱,上面有QQ播放器,暴风什么的,都用了这个开源库,但是没有开放源代码。后来用到这个http://bbs.gfan.com/android-3497668-1-1.html,效果非常不错。

感觉平板10寸的平板还是躺在床上上网,看视频的利器,躺在床上,看看还不错,要不然,坐在电脑前,摆弄这个我觉得还挺傻叉的,主要是老坐在电脑前很累。

感觉专门为平板上定制,根据平板特性做的应用太少了,也没有个好用的市场。

记得以前我还说过我一直觉得这世界上只有网页和游戏,我已经用不到什么应用了。现在想想,应用的缺点在于安装,需要下载安装,不像网页打开就看,这是一个门槛,但是最近又有点觉得网站神马的弱爆了,特别是在Android平板上,浏览体验感觉很差劲,浏览器分块空白现象很严重,而且很多网站没有为平板做优化或者专门的平板网页版,链接点起来很不准。

而且做网页真心比做软件简单很多,软件比网页难很多,原来我觉得做那种大规模访问的站点很酷,但是我渐渐发现其实大规模站点的支撑还是靠软件来完成的,其实这个世界没有软件与网站的区别,而只有前端与后端的区别,我觉得前端发展到极致就是酷毙了的交互体验,后端就是抗住各种压力稳定性的东西接近机器的东西,中间的业务逻辑神马的是很无聊的。

小破文章一篇 哈 ; )

日期:2012.01.16
标签: Android
分类: when
7 Comments