<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chasing an mobile web vision

    闖蕩在移動互聯網的世界中

    2006年9月16日 #

    移動互聯網時代--Android上的一個例子

    我們來演示一個獲取聯系人,并用網頁展現出來的簡單例子。

     首先,我們在eclipse環境中創建一個Android project,我們的Activity名稱是com.example.RIAExample,并且修改界面的layout文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation
    ="vertical"
        android:layout_width
    ="fill_parent"
        android:layout_height
    ="fill_parent"
        
    >
    <WebView android:id="@+id/web"
     android:layout_width
    ="fill_parent" android:layout_height="fill_parent">
    </WebView>
    </LinearLayout>

    可以看到,界面中僅僅包含一個WebView控件。

     接下來,創建一個簡單的java類來描述一個聯系人的信息,它包含聯系人姓名和號碼。

     

    package com.example;

    import java.util.Vector;

    import android.app.Activity;
    import android.os.Bundle;
    import android.webkit.WebView;

    public class RIAExample extends Activity {
        
        
    private WebView web;
        
        
    //模擬號碼簿
        private Vector<Person> phonebook = new Vector<Person>();
        
    /** Called when the activity is first created. */
        @Override
        
    public void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
    this.initContacts();
            web 
    = (WebView)this.findViewById(R.id.web);
            web.getSettings().setJavaScriptEnabled(
    true);//開啟javascript設置,否則WebView不執行js腳本
            web.addJavascriptInterface(this"phonebook");//把RIAExample的一個實例添加到js的全局對象window中,
                                                            
    //這樣就可以使用window.phonebook來調用它的方法
            web.loadUrl("file:///android_asset/phonebook.html");//加載網頁
         
        }

        
        
    /**
         * 該方法將在js腳本中,通過window.phonebook.getContacts()進行調用
         * 返回的JavaArrayJSWrapper對象可以使得在js中訪問Java數組
         * 
    @return
         
    */

        
    public JavaArrayJSWrapper getContacts(){
            System.out.println(
    "fetching contacts data");
            Person[] a 
    = new Person[this.phonebook.size()];
            a 
    = this.phonebook.toArray(a);
            
    return new JavaArrayJSWrapper(a);
        
        }

        
        
    /**
         * 初始化電話號碼簿
         
    */

        
    public void initContacts(){
            Person p 
    = new Person();
            p.name 
    = "Perter";
            p.phone_number 
    = "8888888";
            phonebook.add(p);
            p 
    = new Person();
            p.name 
    = "Jack";
            p.phone_number 
    = "777777";
            phonebook.add(p);
           
        }

        
        
    /**
         * 通過window.phonebook.debugout來輸出js調試信息。
         * 
    @param info
         
    */

        
    public void debugout(String info){
            
            System.out.println(info);
        }

    }

    下面是html文件,它非常簡單。
    <html>
        
    <head>
            
    <script type="text/javascript" src="fetchcontacts.js"/>
    </head>
    <body>
        
    <div id = "contacts">
            
    <p> this is a demo </p>
        
    </div>
    </body>
    </html>

    而主角就是我們的javascript腳本fetchcontacts.js
    window.onload= function(){
        window.phonebook.debugout(
    "inside js onload");//調用RIAExample.debugout
        var persons = window.phonebook.getContacts();//調用RIAExample.getContacts()
        if(persons){//persons實際上是JavaArrayJSWrapper對象
            window.phonebook.debugout(persons.length() + " of contact entries are fetched");
            
    var contactsE = document.getElementById("contacts");
            
    var i = 0
            
    while(i < persons.length()){//persons.length()調用JavaArrayJSWrapper.length()方法
                
                pnode 
    = document.createElement("p");
                tnode 
    = document.createTextNode("name : " + persons.get(i).getName() + " number : " + persons.get(i).getNumber());//persons.get(i)獲得Person對象,然后在js里面直接調用getName()和getNumber()獲取姓名和號碼
                pnode.appendChild(tnode);
                contactsE.appendChild(pnode);
                i 
    ++;
            }

        }
    else{
            window.phonebook.debugout(
    "persons is undefined");
        }

        
    }


     例子很簡單,我加了注釋希望有助大家理解,其他我就不深入解釋了。
    我把例子的源代碼放上來,你可以下來試一試。

    RIADemo

    這個例子說明通過WebView.addJavascriptInterface方法,我們可以擴展JavaScript的API,獲取Android的數據。這樣,JS的粉絲就可以使用Dojo,JQuery,Prototy等這些知名的js框架來搭建android應用程序來展現它們很酷很玄的效果!但是,目前addJavascriptInterface還不夠靈活強大,為什么呢?敬請關注第四篇“what next?”


    posted @ 2009-03-14 16:16 勤勞的蜜蜂 閱讀(5486) | 評論 (6)編輯 收藏

    移動互聯網時代--忽如一夜春風來,web花開各終端

    自從Apple在safari上使用webkit并移植到iphone后,webkit就仿佛是獲得了選秀第一名似的,吸引了眾多眼球。
    其實,我最早聽說webkit是在iphone出來前一兩年,當時有報道說Nokia正在采用webkit為它下一代的Symbian平臺做一個引擎,而且還有專門的社區,但比較封閉,很難進入那個圈子,讓人一點感覺沒有。不過,至少說明Nokia很早就盯上這一塊了。
    iphone發布后,Apple似乎就接管webkit了,從此,webkit社區就有了巨大變化。Apple把能開放的東西都放到了webkit社區里面,速度還相當的快(用Apple自己的話說,他們貢獻了81%的力量,看看webkit社區的主力開發人員,有多少來自Apple!)現在,我們時不時的可以看到webkit的更新,比如對html5的跟進,css的特效等新功能!其中不得不重點提出的是2008年6月2日,webkit社區發布了高性能javascript引擎SquirrelFish!9月3日google chrome發布,采用了V8 javascript引擎,號稱比SquirrelFish還快,兩個禮拜后webkit就發布了SquirrelFish Extreme給予正面還擊。巨頭們牟足了勁爭先把javascript引擎油門踩到底!我不想猜測他們賣力的真正原因,但是,我覺得隨著移動終端能力加強,javascript大面積攻進終端已經指日可待了,iphone和android已經實現了。
    這期間,由于Apple的快速組合拳,Nokia經營的webkit專區很快就倒閉了。但他并沒有放棄對webkit的投入,2008年1月28日Nokia宣布收購了Trolltech公司。現在Trolltech lab作為Nokia的代表仍然活躍在webkit社區之中。就前兩天,他們還在http://planet.webkit.org/發布了一篇標題極其引人的博文“Creating a Google chat client in 15 minutes”,為QWebView做了一把廣告,相信qt的粉絲肯定不會錯過。而本月初發布的qt4.5中,明確指出qt加強了對webkit諸如SquirrelFish等新功能的整合。那么就讓我們期待一下Nokia的新款機器吧。
    到此,我們已經看到Google, Apple, Nokia, Palm等移動終端的領頭羊們所采取的行動,然而,不要忘記軟件廠商!Adobe就是杰出的代表。作為RIA的強烈倡導者,他也選擇把webkit整合到其AIR平臺,你可以想象這個webkit+flash的威力有多強大!而Adobe發起的openscreen項目,更是表明了他要在RIA上爭奪王位的野心!
    好了,不啰嗦那么多了,總之呢,webkit已經成為移動互聯網這出大戲的主角了,回歸到我在上一篇中提到的主題,讓我們來研究一下android.webkit.WebView的功能,來看android上的RIA。
    敬請關注下一篇--使用WebView的小例子。

    posted @ 2009-03-10 22:39 勤勞的蜜蜂 閱讀(2286) | 評論 (0)編輯 收藏

    移動互聯網時代的終端--暫時遺忘OSGi,讓我們去品味一杯android磨出的移動互聯網咖啡吧

    1年多前,揣著在移動終端推廣OSGi的夢想,我離開了原來的公司,來到了一個自認為更利于osgi的地方,在我看來osgi擁有eRCP這樣的粉絲,應該會給它在移動終端上提供廣闊的舞臺。然而半路殺出個程咬金,google android!第一次見到它時,我不相信osgi會輸,于是就廢寢忘食的研究它,結果我沒有進行太多的抵抗,很快就被Android收編了。我得承認它在某些關鍵的因素,確實比osgi更適合移動終端。對此,我只能感嘆google開源的偉大,以及摒棄jcp的雷厲風行!但是,更為重要的是,在移動互聯網時代即將到來的時刻,Android為我們打開了一扇方便之門,這到底為何?

    通過對Android的(java)源碼進行掃描后,我看到了像jsr211,MVM這些老朋友的影子,嗯,我可不想再炒這些舊飯了。還有啥?網上熱炒android用了webkit作為其瀏覽器的引擎,和iphone的safari使用的引擎一樣,這個東西應該不錯,因為我一直覺得eRCP沒有很好的web控件,使得它在移動平臺上遜色不少,于是我翻到了android.webkit這個java包,wow! Google給webkit封裝了很多java的接口,這真是java開發人員的福氣,(聽說很多java開發人員對sun的javafx期待度最高的就是一個傳說中的JWebView控件,但是不知道出來沒,算了,我懶得查證了,因為俺現在不想浪費太多在sun java上,呵呵),不過我覺得這更是廣大互聯網應用開發人員的福氣!想想!用html + css + javascript就能編寫android的類似電話簿,日歷甚至手機桌面的應用,這難道不讓您浮想聯翩嗎?所以,如果說Android為移動終端進入互聯網開了一扇門,那么android.webkit.WebView就是這扇門的金鑰匙,而webkit就是通向互聯網的康莊大道!

    其實android的webview是一個極端復雜的控件,而我個人認為它是可以實現現在熱炒的RIA/webos等概念的基石!雖然我進入這個領域不長,但覺得它非常有意思,很有前途,所以我打算寫一個系列,分享對它的理解,強烈歡迎各位高手指點!

    怎么開始說呢?不知道大家有沒有注意,年初Palm公司在CES上palm pre的基于webkit的webos驚艷之秀,十足掉起了大家的胃口,這是我聽到第一個冠以webos的移動終端,這是不是意味著目前由palm來唱這個webos的獨角戲呢?答案當然不是,其實很多終端廠家以及平臺廠商很早就率領大部隊兵臨webos的城下了,相信很快一場硝煙彌漫的戰爭就要開始了......

    欲知端的,敬請關注移本系列第二篇--忽如一夜春風來,web花開各終端

    posted @ 2009-03-09 22:53 勤勞的蜜蜂 閱讀(3448) | 評論 (7)編輯 收藏

    OSGi介紹(七)bundle和service(續)

    接上一篇的例子,為了更具體一點,我們考慮這樣的case,
    假設房地產開發商construction A采納了規劃公司design A的方案,打算建造公寓類型的房子CityApartment
    然后客戶A買了一套房子

    用ooa方式分析這個case,
    我抽象這幾個實體:規劃公司,圖紙類型,開發商,房子,買房人
    然后描述這幾件事情:開發商選擇設計圖紙,蓋樓然后銷售;買房人根據圖紙買房并使用房子

    下面是我用java語言來簡單描述它:

    design A 公司

    package design.a;
    interface Apartment {
    ..
    //方法省略先
    }

     

    開發商construction A

    package construction.a

    import design.a.*;//開發商要按照圖紙蓋樓

    class CityApartment implements Apartment {
    .
    //方法省略先
    }


    class Construction implements BundleActivator{

    }



    客戶 costumer A

    package customer.a

    import design.a.*;//客戶要按照圖紙選擇房子

    class Customer implements BundleActivator {
    .
    //方法省略先
    }



    然后我們把他們分別做成bundle
    Bundle A : design A
    其manifest中這樣描述

    BundleSymbolicName: design A
    Export
    -Package: design.a


    Bundle B : construction A
    其manifest中這樣描述

    BundleSymbolicName: construction A
    Import
    -Package: design.a
    Bundle
    -Activator: construction.a.Construction


    Bundle C : customer C
    其manifest中這樣描述

    BundleSymbolicName: customer C
    Import
    -Package: design.a
    Bundle
    -Activator: customer.c.Customer



    這樣,裝入到framework后,framework就會把BundlB和C與BundleA關聯起來,正好描述開發商A選擇design A的圖紙,客戶A也不得不選擇design A的圖紙啦
    可是,單從這里,我們看不出來,開發商和客戶拿同一份圖紙干什么。那我們得必須在BundleB和C的實現里面寫點東西來說明。

    這里給出開發商construction.a.Construction的偽代碼:

    class Construction implements BundleActivator {

     
    public void start(BundleContext context){
      CityApartment apartment 
    = null;
      Hashtable properties 
    = null;
      
    for(int i = 0; i < 100; i ++){
       properties 
    = new Hashtable();
       properties.put(
    "price",new Integer(1000 + i*5));//開發商為房子定價
       apartment = new CityApartment();//一套房子蓋好
       
    //把房子按照公寓注冊出去并打廣告,等待客戶來購買,framework就相當于一個售樓處兼房屋中介
       context.registerService(Apartment.class.getName()/*公寓類型*/,apartment/*房子作為服務對象*/,properties/*與房子相關的附帶信息*/);
       
      }

      
    //這樣開發商一共注冊一百套房子
     }

    }



    而客戶的代碼可以如下:

    class Customer implements BundleActivator {
     
    public void start(BundleContext context){
      Apartment apartment 
    = null;
      ServiceReference ref 
    = context.getServiceReference(Apartment.class.getName,"(price=1050)");//先簽署購房合同,而且指明選擇Apartment類型,價格為1050的房子。
      apartment = (Apartment)context.getService(ref);//然后買到房子
      
    //買房人就可以使用房子apartment對象進行日常生活了
     }

    }


    這樣,我們就很清楚的看出,Design A為Construction A和Customer A提供了共同的Apartment定義,才使得他們有交易的可能。于此同時,Construction A和Customer A之間的耦合是非常松的,因為,如果有另外一個開發商onstruction B加入進來也構造了Apartment的對象,Customer就可以通過改變選擇條件,輕易的獲得B的房子,而客戶本身不關心房子是A還是B蓋的,這個是典型的面向對象的多態應用。

    總的說來,Bundle在framework的幫助下,使得其他bundle使用其類型定義成為可能。service就是在這些共享的類型定義基礎上產生的具體對象,而使用這些service對象的bundle,必然也是對應共享類型的使用者。
    這種類型共享,在osgi里面叫做"class space". framework運行時通過關聯bundle之間的類型定義,可以構成一個或多個"class space",而某個bundle在framework里面,只能處在一個"class space"里面,不能同時出現在多個"class space"中。
    怎么理解這個話呢?請看下一篇,外星人入侵了。

     

    posted @ 2007-07-21 22:28 勤勞的蜜蜂 閱讀(1728) | 評論 (1)編輯 收藏

    OSGi 介紹(七)bundle和service的關系

    osgi系列已經發表了有將近2年的時間了,很高興這期間得到了許多朋友的關注,你們和我的討論切磋都讓我興奮無比。而過去很長的時間里,由于靈感枯竭外加精力有限,不能給大家分享更多osgi的精彩,實在辜負大家的期望,還請諒解。不過,根據這段時間大家和我私下的討論,發現很多人都苦惱于分不清楚bundle和service的關系,而我的osgi 5-6又臭又長,而且還非常依賴技術,實在是坑害入門者的必備武器。這個不足,猶如頭上方圓半尺盤旋的蒼蠅,困擾著我,解釋的郵件也不知寫多少,估計收效甚微。于是我決定再次出山,寫一個驚世駭俗的分析文章,力圖讓更多讀者都能夠把這兩個瘋馬牛理清楚。

    開講之前,還是用老辦法,給大家舉個例子。放心,這個例子一點都不技術,而且我相信你可能比我還清楚。大家都知道房地產商是怎么運作樓盤的吧。據我淺顯的認識,他們都會先進行一些圖紙上的規劃,里面包含小區的整體規模,樓房外觀以及廣大疾苦民眾最為關心和渴求的戶型圖。據說,很多房地產商在搞定政府某些關鍵部門(個人意見僅供參考)拿到一塊地后,根本不用費心思去自己規劃這些自己都一竅不通的東西,只要請一個有資質的第三方公司寫寫畫畫,甚至照搬某西方發達國家的某社區概念,冠于中國特色云云,就能使廣大民眾趨之若鶩,傾囊搶購。ok,你可能受不了我又憤世嫉俗了,這個到底和osgi有啥關系?別著急,天色已經很晚,下次某個時間請繼續關注osgi(七)續,其間,請大家先考慮一下,如何用ooa的方式來描述人們如何購房,以及在房子里進行日常生活這樣的簡單場景。

    posted @ 2007-07-16 23:31 勤勞的蜜蜂 閱讀(2488) | 評論 (2)編輯 收藏

    OSGi on mobile phone !

    如果你一直關注osgi在embedded的發展,并且還能到舊金山參加正在舉行的java one,那我真是羨慕死你了.

    Nokia在她的N800上demo運行了osgi(此消息來源于david beers對BJ在osgi alliance blog上的評論,關于demo可以看這個link http://thehereweb.googlepages.com/)
    同時美國運行商Sprint也宣布采用osgi的手機平臺將會在年底面世.多么值得期待的事情!

    posted @ 2007-05-14 10:11 勤勞的蜜蜂 閱讀(1793) | 評論 (0)編輯 收藏

    framework implementation updated

    瞎整了半年多,克服了重重困難,終于把原來framework做了更新,如果有興趣,還可以按照原來的Link下載。
    framework下載后,解壓并運行startframework.bat就可以啟動framework了。
    目前該framework只支持在內存中存儲bundle.

    另外,多增加了一個管理bundle,它為framework提供了簡單的圖形化操作界面,可以在這里下載。

    http://m.tkk7.com/Files/Ferrari4000/bundlemanagement.zip

    下載后,最好先把名字改為bundlemanagement.jar
    然后可以這樣安裝,假設該文件下載到d:\bundles下,則可以在framework的shell下輸入
    in file:d:/bundles/bundlemanagement.jar
    安裝該bundle,安裝成功后輸入stt 1(注意:1是數字一),啟動該bundle就可以出現圖形操作界面了。

    圖形界面提供bundle的安裝(只支持本地安裝),啟動,停止,升級和刪除等簡單功能。
    其他功能會在后面陸續增加。目前這個bundle只能運行在j2se環境下。

    給的源代碼沒有很好的build文件,等我有時間了,再寫一個。

    感謝畢嘉兄弟的支持,他幫助設計了bundle存儲模塊以及實現了bundle在內存存儲的第一版。

    有啥問題,可以直接給我發郵件,jerrylee.li@gmail.com

    posted @ 2006-09-16 23:40 勤勞的蜜蜂 閱讀(1560) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲一本综合久久| 久久亚洲AV成人出白浆无码国产| 激情亚洲一区国产精品| 69视频免费观看l| 久久久亚洲AV波多野结衣 | 麻豆一区二区三区蜜桃免费| 国产精品免费_区二区三区观看 | 亚洲免费在线观看视频| 亚洲免费二区三区| 亚洲a级片在线观看| 日韩一级视频免费观看| 猫咪免费观看人成网站在线| 中文字幕专区在线亚洲| 97人妻精品全国免费视频| 亚洲成色999久久网站| 又黄又爽又成人免费视频| 亚洲一区二区三区国产精华液| 巨胸喷奶水视频www网免费| 特级毛片免费播放| 国产亚洲A∨片在线观看| 精品无码国产污污污免费网站| 亚洲乱码一二三四区乱码| 宅男666在线永久免费观看| a级毛片免费观看在线| 亚洲一区二区三区电影| 成年女人毛片免费播放人| 人人公开免费超级碰碰碰视频| 国产亚洲精品va在线| 黄页网站免费观看| 国产99久久亚洲综合精品| 亚洲AV无码国产精品色午友在线 | 成人免费视频国产| 三年在线观看免费观看完整版中文| 久久亚洲免费视频| 免费无码看av的网站| 国产午夜无码精品免费看动漫| 亚洲国产成人精品青青草原| 亚洲av手机在线观看| 中文字幕免费视频一| 亚洲Av无码国产一区二区| 亚洲av无码乱码国产精品fc2|