embedded linux ,android

2010年11月21日 星期日

[轉]雲端運算是趨勢是噱頭抑或是一場騙局?


文章發佈於 : 2009-11-04 22:33:43 | 文章分類 : 阿維看世界
如果你跟我一樣經歷過數據機時代,或許曾經參與過一個計劃,在你的電腦上面安裝一個小程式,當你的網路進入閒置狀態就會使用你的電腦進行運算,協助某個科學機構計算人類DNA結構。撇開這個計畫是不是真的,或者這個計畫到最後到底算出了什麼東西,這樣的模式是我第一次看到雲端運算這四個字第一個想到的例子。

現在雲端喊的漫天震響,甚至出現不加入雲端就落伍了這樣新聞標題。但是當整個業界都瀰漫在一股雲端運算熱的時候,甚至連不熟悉網路產業的周遭親友都在談論雲端運算時,我們是否真的了解什麼是雲端運算?

現在這種場景讓我想到一句名言,當周遭所有的親朋好友甚至連菜市場的婆婆媽媽都在談論股票,並且各各說得頭頭是道,振振有詞時,就是該出脫股票的時候了。這句話雖然有點諷刺但歷史經驗告訴我們這句話似乎頗有道理的。前一次網路泡沫化發生之前,不管是什麼行業通通一窩蜂的 dot com,似乎只要掛上dot com這個招牌,企業營收就會一路往上飆升;以及數年前股市從萬點大崩盤。這兩個歷史經驗都印證了這句話。

資訊科技這個產業有一個毛病,什麼東西都要簡寫和縮寫,常常讓不在這個產業的人一頭霧水,然後還自己得意洋洋以為自己高人一等。因此首先我們必須知道雲端這兩個字到底是什麼的簡稱或縮寫,雲端原本的名字是雲端運算,請注意運算這兩個字;大陸翻譯成雲計算,也請注意計算這兩個字。

根據維基百科對於雲端運算說明如下:
雲端運算(cloud computing,中國大陸譯作雲計算),是一種基於網際網路的運算新方式,透過網際網路上異構、自治的服務為個人和企業使用者提供按需即取的運算。由於資源是在網際網路上,而在電腦流程圖中,網際網路常以一個雲狀圖案來表示,因此可以形象地類比為雲運算,『雲端』同時也是對底層基礎設施的一種抽象概念。

雲端運算的資源是動態易擴充套件而且虛擬化的,透過網際網路提供。終端使用者不需要了解「雲端」中基礎設施的細節,不必具有相應的專業知識,也無需直接進行控制,只關注自己真正需要什麼樣的資源以及如何透過網路來得到相應的服務。

雲端運算可以認為包括以下幾個層次的服務:基礎設施即服務(IaaS),平台即服務(PaaS)和軟體即服務(SaaS)。雲端運算服務通常提供通用的透過瀏覽器存取的線上商業應用,軟體和資料可儲存在資料中心。

基本特徵
網際網路上的雲端運算服務特徵具有和自然界的雲端、水迴圈具有一定的相似性,因此,雲端是一個相當貼切的比喻。通常雲端運算服務應該具備以下幾條特徵:

    * 基於虛擬化科技快速部署資源或獲得服務
    * 實作動態的、可伸縮的擴充套件
    * 按需提供資源、按使用量付費
    * 透過網際網路提供、面向海量資訊處理
    * 使用者可以方便地參與


維基百科寫的對於有人來說或許看不太懂,我舉另外一個例子來說明。首先我們先拋開維基百科上面所寫的和雲端運算這兩件事情。前陣子到目前都還相當流行的自己架站,不管是自己架設部落格或者是架設其他類型網站,到電子書店都會發現相當多這類型的書籍。

當你選定一套程式不管是wordpress、xoops或者是drupal,接下來的工作就是要購買主機和網域名稱。一般來說個人使用者挑選的是便宜的虛擬主機,也就是主機商提供一套主機(不是一台喔,如果你的主機商只有一台主機,那麼我奉勸你還是早點換主機商吧)然後切割成許多的區塊,你可以承租這個區塊去架設你的部落格或者是其他你想要的網站。這個概念就很像房東把一層樓隔成一間一間小小間的雅房或套房出租出去,付的錢比較多就可以租套房,付的錢比較少就只能租雅房。

你承租的主機空間包含了基本的硬碟空間和網路流量,如果你超過了基本使用量就需要額外支付費用。就好比你和房東約定好每個月的房租包含了兩百元的水電費,但是超過的部分你就需要額外再支付給房東。

這一切看起來都很合理,但是問題來了,我每個月的水電費用量都少於兩百元,可是我每個月付的房租裡面就是包含了固定兩百元的水電費,這樣我不是很虧嗎?此外,我平常所使用的空間比雅房還要小,可是我就是要付這樣的房租給房東,怎麼算都不划算。偶爾找朋友來想聚一聚吃個火鍋,立刻就又發現地方太小,實在是太擁擠了。

如果找到一個房東跟你說,水電費按照你使用的量,用多少就付多少,這樣是不是比較好,當然這個模式已經實現在現在一般的租賃中。這時候如果一個房東跟你說,房租一天一坪50元,按照你每天使用的坪數大小來收費,這樣是不是就太美好了。今天只想一個人靜靜的躲在自己的小天地,只需要五坪空間,你就只需要付250元;改天約了一群朋友來家裡開party需要100坪空間,那就付5000元。

你每天跟房東租的空間就好比是你向虛擬主機商承租的空間;你網站的流量就是你每天所使用的水電費。而這樣的動態而且可以隨時根據你的需求做變化,然後再根據你的使用量來進行收費的模式,就是維基百科形容雲端運算基本特徵的前三項。

看到這裡,你是不是覺得所謂的雲端運算就跟現行的虛擬主機很類似,只是將計費模式做了一些更動,沒錯!到目前為止的確是這樣,但是別忘了後面還有兩個基本特徵:透過網際網路提供、面向海量資訊處理以及使用者可以方便的參與。

這兩個基本特徵回到我第一段提到的內容,某個科學機構提供一個小程式,讓參與的人安裝後,在參與者網路閒置時進行運算並且將運算的結果回傳回去到該科學機構。

舉一個例子,大家都聽過木馬和殭屍電腦,先不管你對這兩個名詞的了解有多少。我們大家先化身為駭客,你今天想要攻擊一個你看不順眼的網站,或者是有人付錢請你攻擊一個網站。這時候如果單靠你自己一台電腦,一定很難讓那個網站掛掉,如果你可以透過散撥木馬控制一萬台甚至是十萬台電腦,這樣攻擊成功的機率是不是就高出許多?

所以其實雲端運算並不是一個新的東西,這件事情早就在你我身邊發生,而且運用的最好還是所謂的非法行為。

總結一下
(1) 基於虛擬化科技快速部屬資源或獲得服務:駭客快速部屬木馬然後獲得你的電腦來幫他服務;
(2) 實作動態的、可伸縮的擴充套件:駭客可以隨時隨機選擇被植入木馬的電腦來進行散撥病毒或木馬或者做他想要你做的事情;
(3) 按需求提供資源、按使用量付費:駭客對被植入木馬的電腦要求資源,被植入木馬的電腦就乖乖提供資源,只是付費的不是駭客,是被植入木馬的電腦的主人,傻傻的花錢買主機和牽ADSL;
(4) 透過網際網路提供、面向海量資訊處理:駭客透過網路操控被植入木馬的電腦,然後發出攻擊指令,對特定的電腦或網站進行攻擊。想想看上萬台甚至上百萬台電腦同時對特定電腦或網站攻擊,這個資訊量夠大了吧;
(5) 使用者可以方便地參與:只要我們不重視電腦安全,我們隨時都可以快速又方便的參與。

這裡我還真的要感謝駭客們提供了這麼一個簡單易懂的雲端運算範例,想必大家應該都可以了解什麼是雲端運算了。

看起來雲端運算對我們似乎沒有什麼幫助,除了主機的費用是根據我們實際的使用量來計價之外。但是任何的科技都是一體兩面的,就看我們怎麼去使用它。

最後我們回頭來看看現在資訊科技產業號稱的雲端運算是什麼,現在台灣喊雲端運算喊的最大聲動作也最明顯的就是廣達,連這期的天下雜誌都特地做了一篇專欄。

節錄天下雜誌專欄的內容:
(1) 廣達出資三點三億,取得多媒體及網路等晶片的Tilera Corp.的特別股,投入雲端運算晶片設計。
(2) 林百里自信地說,「接下來要做全球最大的三C企業。」這是個石破天驚的轉型宣示。意味著,過去專注筆電ODM代工製造的廣達,將變成林百里新三C「雲端運算」(cloud computing)、「連結」(connectivity)、「client device」(消費端載具),提供客戶雲端運算需求下,一條龍式的solution provider(系統解決方案供應者)。
(3) 林百里認為未來想要創業的人,可以省去向VC募資投資硬體,只要向廣達租低廉的雲端空間,就可以善用各地人才創新。

看起來廣達自信滿滿的投入雲端運算這個領域,但是問題來了,這樣最多只有做到雲端運算的第三項基本特徵,那跟虛擬主機商有什麼分別呢?最多只能算是雲端運算中的一個子項目基礎設施即服務(IaaS)

雲端運算的其中一項特徵就是透過網路處理大量資訊,而處理大量資訊的前提就是到底要處理什麼資訊呢?如果沒有服務沒有軟體放在這樣的機制上面,那這一切的架構都只是空談,相比對之下,連只會下載別人寫好的木馬然後散撥出去的毛頭小駭客更清楚雲端運算怎麼應用。

台灣的問題就是一向重視硬體不重視軟體,如果真的要投入雲端運算,請告訴別人你準備在雲端運算上面提供什麼軟體應用服務,而且請注意一點,雲端運算是需要使用者可以方便參與,方便參與也包含了另外一層意義,這個軟體是使用者想要或是需要的服務或軟體。

如果只是打著雲端運算的旗幟而沒有了解雲端運算的本質,這樣就跟前一波網路泡沫化前一樣,打著dot com的旗幟到處宣揚,或許不會跟之前一樣泡沫,但最後大家終將發現這只是資訊科技產業的另一項噱頭,最後成為一場世紀騙局而已,只是看你騙的程度有多大,騙了股東或投資人抑或是整個資訊科技產業騙了全世界。

參考資料
(1) 維基百科 雲端運算
(2) 天下雜誌 筆電之後是什麼?林百里:我不去藍海,我去雲端

vmWare中操作過程的錄製

在vmWare中可以利用VM--> Capture Movie這個選項來錄製各種作業系統的操作過程,產生出XXX.avi的檔案,但檔案太大了,所以需要利用轉檔軟體,利如CamStudio轉成flash swf方便傳輸及放在網路上分享

2010年11月18日 星期四

一流點子,還是一流團隊?


一流點子,還是一流團隊?

撰文者:郭奕伶

如果你是一個領導者,資源有限,你要選擇一流的點子,還是一流的團隊? 我曾經以為,好點子最重要,即便執行力打折,都瑕不掩瑜。畢竟,執行力的效率,怎麼打得過創新的破壞力?

然而,在加州爾灣(Irvine),我們深入製作《魔獸世界》的秘密基地——暴雪娛樂(Blizzard Entertainment)後,我發現,答案並非如此。

這裡,應該是全世界最看重創意、最自由的地方,但一進到工作現場,昏暗、沉默、密密麻麻的會議時間表??。

他們,是一支紀律嚴明的軍隊,十五年來只出過三個系列的遊戲,卻款款熱賣逾十年,光一款《魔獸世界》,過去四年就進帳一千二百億元,去年淨利率是蘋果電腦(Apple)的兩倍。
想像一下,在《魔獸世界》裡,有一千四百個地點、三萬個物件、七千六百個冒險任務,而且它要用十一種語言發行,還要讓萬人同時上線互動、將全球玩家分級??。這裡頭,有多少細節?

「紀律,」創辦人兼總裁默罕(Michael Morhaime)解答,一切都奠基在「專注的紀律」。
故事,並非一開始就如此完美,草創初期,他們曾經貪心、曾經自負,甚至必須賣掉公司以換取生存,但「從回顧的角度看,我們發現,那些我們說『不』的決定,讓我們能聚焦在重要的事,」默罕將此稱為「專注的酷」(Concentrated Coolness)。
然而,誘惑從來不會停止。

尤其當一個人成功了,富有了,上門的試煉自然多了起來,決策難度也變高,所幸,這個組織的靈魂是「不斷的自我批判」,因此,即便後退兩步,下次還是會拉回正軌,再進個五步以上。一退一進、來回修正間,這家公司成為全球的線上遊戲王國。
所以,一流的點子重要,還是一流的執行團隊重要?

曾經,暴雪的數個天王級製作人出走,但最後都浮沉於世,再無驚人之作。這證明了,偉大的任務要完成,「要拿到最後的一○%,要花上比前面九○%更多的力氣。」默罕這麼說,而最後這一○%,就要靠一流團隊的執行力。

如果一定要選擇,我完全相信,一流的團隊能把二流的點子,執行到一流;但二流的團隊卻可能把一流的點子完全搞砸!

[轉]忘記會做微軟 不然就等死


反省篇PC大廠採購主管告白



忘記會做微軟  不然就等死



3年前台灣就啟動石減法革命,推出小筆電,遇上蘋果卻完全被取代。同樣的創意,為何台灣人就只能走上失敗?

林俊劭、林宏達



當台灣電子五哥金年上半年的獲利總和,第一次輸給傳產五哥的這一刻,台灣的電子代工業,正站在一個轉型的十字路口。三年前,當華碩推出第一台以簡便、快速上網為訴求的小筆電EeePC時,在市場上引起轟動,曾經每五秒賣出一台,刺激惠普(HP)、戴爾(Dell)等國際大廠跟進,被《富比世》(Forbes)雜誌評選為二OO八年年度的風雲產品。

然而,不到兩年的時間,小筆電又殺成一片紅海。現在,iPad問世半年後,卻產生天翻地覆的變化。小筆電,成了iPad出現後的主要犧牲者,看到iPad的出現,過去做小筆電的台灣業者,又開始了一窩蜂的平板電腦風潮,然而,這次能成功複製iPad平板電腦嗎?

「如果你的出發點是把Netbook(小筆電)做小,變成平板電腦,對不起,死路一條,你要想的是把smart phone(智慧型手機)做大。」


這是一位市值上千億的科技代工大廠,採購主管的告白。



他,在科技業資歷超過十年,從國內某品牌廠的研發工程師做起,經歷過台灣科技產業起飛的年代,看盡PC產業的興衰起伏,也曾主導過小筆電的研發與製造,如今手握千億採購金額,對於台灣電子業的結構有深刻觀察。

以下是他在前線的第一手觀察:

兩年前我就對Netbook不看好,我說這個東西是「曇花一現」、「falling star」,一個品牌多賣一台Netbook(小筆電),他就少(賣)一台Netbook(筆電),這是顯而易見的道理,多賣多死,revenue(營收)只有原來的三分之二,利潤更只有原來的三分之一。



「賣小筆電是虛的,賣越多死越慘」



Netbook至少還有兩萬塊,Netbook只要八千塊,淪落到外勞買來打skype回家的工具,這樣的市場你還留戀什麼?賣越多死越慘啊!表面上看來,這幫助他們把市占率提升,但這是虛的,對獲利沒有幫助啊!


小筆電剛出的時候,大家講說是第一年十五咪(編按:million,百萬台),第二年三十咪,第三年四十咪,再來馬上五年內就破百咪。大家是這樣想的,但去年三十四個咪,今年還會繼續衰退啊!


平板電腦今年是蠶食,明年是鯨吞!

iPad是硬體簡單,但豐富了應用軟體。兩年前的小筆電,是華碩發動的失敗的減法革命,當時以為這是個成功的減法革命,但是他同時減掉了軟體跟硬體。

平板是蘋果成功的減法革命,硬體減的更誇張,筆電七四七的噴射引擎,蘋果的CPU A4減到只剩下機車的引擎。


IPad為什麼可以待機七天還有電?因為它瘋狂了硬體,沒有USB孔,沒有讀卡機,也沒有耳機,只有一個連結器,但在軟體上它豐富得很啊!硬體上只有摩托,但上網比飛機還快,人們會appreciate這個東西。



「搞低價結果,傷敵七分自損三分」



小筆電當初出來的時候被稱為上網機,結果iPad上網速度比它快三倍!第一個實現微軟與英特爾夢想的竟然是蘋果,真諷刺!


兩年前小筆電是潘朵拉,打開的下場是所有人的ASP(平均單價)全部往下降,雖然有量但沒有價,七傷拳,傷敵七分,自損三分,多賣一台把敵人幹掉一台,但你同時傷了自己,高價格的筆電賣不掉啊!


小筆電曾經定義為你的第二台NB,但現在淪落為外勞的電話機,iPad的減法不是只是為了減而減,而是減了為了加,加快上網速度,加快閱讀資訊的方便性,這是減法才有意義。

對於小筆電占比很高的公司,那就是等死啊!


IPad的市場是多出來的,我估計三年後會成長到一億台,不會因此侵蝕到傳統NB的市場,它硬生生在智慧型手機與NB中間卡出了一個位置,這個位置是小筆電想要的。


整個產業沒有一個完整配套的solution跟它打,但是以後會不會起來?會啊!為什麼兩年前我說
小筆電必死?因為它進入障礙低啊!


台灣人的宿命,就只能賺組裝的錢,這是宿命啦!


你在某方面的成功會造成你在另一方面的失敗,這是經營者與主事者的心態要改變,如果心態再不轉過來,沒有破釜沈舟,以宏達電為例,他以前做PDA代工做得很成功,但如果一直顧著眼前的成功,沒有想到要轉,那就沒有今年的宏達電啦!現在也是一樣,當他發現Android才有未來的時候,就把微軟的工程師全都轉到Android,叫他們忘記「以前會做微軟」,不這樣就會死翹翹啊!


富士康還在想著以前最賺錢的時代是摩托羅拉V3的時代,所以轉不過來啊。

一個成功的平板電腦,硬體要簡單,但簡單反而難。一個長期做汽車的公司,你覺得它能馬上做五千CC的引擎,但你要他做出一台五十CC的,要減掉兩個零耶!英特爾做的CPU都必死,雙A(華碩、宏碁)研發能力再強,能馬上做出十萬個軟體來嗎?



從硬體轉軟體,最大問題在人才



從硬體走到軟體,說起來容易,但實際上卻困難重重,最大的問題在於人才的嚴重不足。

「台灣的軟體過去二十年都被微軟給慣壞了,只要修修改改,懂開發的不多,」一位曾擔任過美商軟體大廠高階主管,現任國內某代工大廠的軟體總監,很感概的表示:「過去二十年我們再怎麼努力,也不過培養了六百五十個(軟體)工程師,現在去大陸,一個月就可以訓練出一百個,外面還有五百個排隊在等。」


「在學校培養出來的人,台灣就是硬體製造,離軟體開發、雲端運算『很遠很遠很遠』,」他指出,以前國際大廠如戴爾等客戶來,都是談硬體的價格,但現在,來就直接問你「軟體(部門)有多少人?」這顯示軟體研發能力已成功當前科技業最主要的競爭力。


「當公司要從製造硬體,轉換到軟體和服務,現有的營運系統(台灣代工產業),並不熟悉如何操作這種新營運模式。」台大國企系教授李吉仁說。


他解釋,「電子代工產業擅長玩的是,有限利潤下進行成本減法的遊戲,」客戶給的資源是固定的,能從哪裡再多省一點,不管是供應商的利潤還是材料的採購成本,只要少一點,公司的成本就能再下降一點,這個遊戲,常常是零和的結果。


「服務的邏輯卻不是這樣,」以蘋果的App Store為例,蘋果要建成一個有影響力的平台,先考慮的卻是如何讓別人賺到錢。「這個『共利』的平台策略,值得台灣廠商思考。」李吉仁說。

「創新分兩種,技術創新和商業創新,」李吉仁分析。台灣廠商許多生產的know-how是自己培養出來的,蘋果卻相反,除了作業系統跟介面軟體,大部分內容和軟體都是市場上買得到的。 

再不改變,台灣電子業會有什麼影響?


「硬體代工不會滅亡,只是利潤越來越薄。」李吉仁下了這個結論。



摘自商業周刊第1191

android thread




ThreadDemo .java
package wandroide.blogspot.com;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.concurrent.atomic.AtomicBoolean;

public class ThreadDemo extends Activity 
{
    ProgressBar bar1 = null;
    ProgressBar bar2 = null;
    TextView    tv   = null;

    Handler handler=new Handler(){
 @Override
 public void handleMessage(Message msg) 
 {
     bar1.incrementProgressBy(5);
 }
    };

    Handler handler2=new Handler(){
 @Override
 public void handleMessage(Message msg) 
 {
     bar2.incrementProgressBy(-5);
 }
    };
   
    AtomicBoolean isRunning=new AtomicBoolean(false);
    AtomicBoolean isRunning2=new AtomicBoolean(false);

    @Override
    public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  tv   = (TextView)findViewById(R.id.tv);
  bar1 = (ProgressBar)findViewById(R.id.progressbar1);
  bar2 = (ProgressBar)findViewById(R.id.progressbar2);
    }

    public void onStart() 
    {
 super.onStart();
 bar1.setProgress(0);
 bar2.setProgress(100);
     
 Thread background=new Thread(new Runnable() 
 {
      public void run() 
      {
          try {
              for (int i=0;i<20 && isRunning.get();i++) 
              {
                  Thread.sleep(1000);
                  handler.sendMessage(handler.obtainMessage());
              }
          }
          catch (Throwable t) {
               // just end the background thread
          }
       }
  });
      
  Thread background2=new Thread(new Runnable() 
  {
      public void run() 
      {
          try {
              for (int i=0;i<20 && isRunning2.get();i++) 
              {
                  Thread.sleep(1000);
                  handler2.sendMessage(handler2.obtainMessage());
              }
          }
          catch (Throwable t) {
              // just end the background thread
          }
      }
   });

   isRunning.set(true);
   background.start();
       
   isRunning2.set(true);
   background2.start();
    }

    public void onStop() {
  super.onStop();
  isRunning.set(false);
  isRunning2.set(false);
    }
}

2010年11月16日 星期二

BCB thread

解ATE bug
thread跑完就結束了,不需要delete


unit2.h
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TGridThread1 : public TThread
{
protected:
        void __fastcall Execute();
public:
        __fastcall TGridThread1(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TGridThread1::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall TGridThread1::TGridThread1(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
void __fastcall TGridThread1::Execute()
{
        //---- Place thread code here ----
}
uint1.cpp
#include 
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CGAUGES"
#pragma resource "*.dfm"
TForm1 *Form1;
TGridThread1 *GridThread1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // Create the thread objects
    GridThread1 = new TGridThread1(true);

    // Initial setup for threads and buttons
    GridThread1->Resume();
}

資料儲存與Content Provider

在使用手機時,user需要儲存一些資訊,如果這些資訊是比較固定的,此時若能儲存起來,就可免去每次輸入這些資訊的手續,在android有三種資料儲存方式:
Shared Preferences(xml形式)、檔案儲存與資料庫儲存。
Android 並沒有一個共同的儲存空間讓所有應用程式存取,因此若要讓其它的應用程式使用我的資料,就必須使用Content Provider,用來分享資料用的。


DataStorageDemo.java
package wandroide.blogspot.com;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class DataStorageDemo extends Activity implements OnClickListener
{
    private TextView mTextView         = null;
    private EditText mEditText         = null;         
    private Button   mSharedPrefButton = null;
    private Button   mFileButton       = null;
    private Button   mSqliteButton     = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
           
        mTextView         = (TextView)findViewById(R.id.ltextview);
    mEditText         = (EditText)findViewById(R.id.ledittext);          
 mSharedPrefButton = (Button)findViewById(R.id.lsharedprefbutton);
 mFileButton       = (Button)findViewById(R.id.lfilebutton);
 mSqliteButton     = (Button)findViewById(R.id.lsqlitebutton);
      
 mSharedPrefButton.setOnClickListener(this);
 mFileButton.setOnClickListener(this);
 mSqliteButton.setOnClickListener(this);
    }
    
    public void onClick(View v) 
    {
 if(v == mSharedPrefButton)
 {
     //write
     SharedPreferences pref = getSharedPreferences("PREF_DATA", MODE_WORLD_READABLE);
       SharedPreferences.Editor preEdt = pref.edit();
       preEdt.putString("PREF_EDITTEXT", mEditText.getText().toString());
       preEdt.commit();
       //read
       String pref_edittext = pref.getString("PREF_EDITTEXT", "hello shared preference");
            mTextView.setText(pref_edittext);
       mEditText.setText("");
 }
 else if(v == mFileButton)
 {
     
 }
 else if(v == mSqliteButton)
 {
          
 }    
    }
}
ContentProviderDemo.java
package wnadroide.blogspot.com;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class ContentProviderDemo extends Activity implements OnClickListener
{    
    private TextView mTextView              = null;
    private Button   mGetPrefButton         = null;
    private Button   mContentProviderButton = null;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mTextView      = (TextView)findViewById(R.id.ltextview);
        mGetPrefButton = (Button)findViewById(R.id.lgetprefbutton);
        mContentProviderButton = (Button)findViewById(R.id.lcontentproviderbutton);
       
        mGetPrefButton.setOnClickListener(this);
        mContentProviderButton.setOnClickListener(this);
    }
  
    public void onClick(View v) 
    {
 if(v == mGetPrefButton)
        {
     Context otherApp = null;
     try {
      otherApp = createPackageContext("wandroide.blogspot.com", 0);
     } catch (Exception e) {
      Log.d("wandroide", e.toString());
      finish();
     }
     SharedPreferences pref = otherApp.getSharedPreferences("PREF_DATA",MODE_WORLD_READABLE);
     String pref_edittext = pref.getString("PREF_EDITTEXT", "get不到");
     mTextView.setText(pref_edittext);
 }
 else if(v == mContentProviderButton)
 {
     Cursor c = getContentResolver().query(Uri.parse("content://wade.dbprovider"),
                null, null, null, null);
         
     if(c.getCount() != 0) 
     {
         c.moveToFirst();
      String name = c.getString(c.getColumnIndex("name"));
      if ( name == null ) return;
      mTextView.setText(name);
     }
     
   }
    }
}
DBProvider.java
package wnadroide.blogspot.com;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class DBProvider extends ContentProvider {
    Context mCtx;
    SQLiteDatabase db;

    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
 return -1;
    }

    @Override
    public String getType(Uri uri) {
 return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
 return null;
    }

    @Override
    public boolean onCreate() {
 mCtx = getContext();
 DoDB dbHelper;
 dbHelper = new DoDB(mCtx);
 db = dbHelper.getWritableDatabase();
 return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
 Cursor c = db.rawQuery("select * from nametable;", null);
 return c;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
 return 0;
    }
}
DoDB.java
package wnadroide.blogspot.com;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DoDB extends SQLiteOpenHelper {
    private final static String DATABASE_NAME = "namedb";
    private final static int DATABASE_VERSION = 1;
    private final static String TABLE_NAME = "nametable";
    public final static String FIELD_NAME = "name";
  
    public DoDB(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
 String sql = "CREATE TABLE " + TABLE_NAME + " (" + FIELD_NAME + ")";
 db.execSQL(sql);
 ContentValues cv = new ContentValues();
 cv.put(FIELD_NAME, "aaaaa");
 db.insert(TABLE_NAME, null, cv);
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    }
 
    public Cursor select()
    {
 return null;
    }
}
AndroidManifest.xml
<provider android:name=".DBProvider" 
          android:authorities="wade.dbprovider">
</provider>