<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3402539703993479534</id><updated>2012-01-29T11:40:52.393+08:00</updated><category term='PendingIntent'/><category term='LinearGradient'/><category term='Message'/><category term='Market'/><category term='Game'/><category term='Looper'/><category term='Drawable'/><category term='TelephonyManager'/><category term='String'/><category term='undocument_api'/><category term='Display'/><category term='HttpClient'/><category term='honeycomb'/><category term='ColorMatrix'/><category term='BroadcastReceiver'/><category term='Uri'/><category term='SAXParser'/><category term='StackView'/><category term='git'/><category term='Camera'/><category term='resources'/><category term='Marketing'/><category term='app'/><category term='IntentService'/><category term='ClipboardManager'/><category term='ExpandableListView'/><category term='eclipse'/><category term='training'/><category term='Handler'/><category term='googleio'/><category term='AndroidInternals'/><category term='obfuscate'/><category term='Intent'/><category term='Service'/><category term='IntentFilter'/><category term='ColorMatrixColorFilter'/><category term='FileObserver'/><category term='Filterable'/><category term='UrlEncodedFormEntity'/><category term='URL'/><category term='AppInventor'/><category term='XML'/><category term='AlarmManager'/><category term='ThreadPoolExecutor'/><category term='Filter'/><category term='ADC'/><category term='android'/><category term='View'/><category term='emulator'/><category term='AdapterView'/><category term='HttpURLConnection'/><category term='speech'/><category term='testing'/><category term='open_source'/><category term='proguard'/><category term='ContentResolver'/><category term='AppWidgetManager'/><category term='porting'/><category term='AndroidHttpClient'/><category term='Activity'/><category term='Document'/><category term='BaseAdapter'/><category term='AnalogClock'/><category term='Syetem'/><category term='Calendar'/><category term='RemoteViews'/><category term='XMLReader'/><category term='image_effect'/><category term='HashMap'/><category term='Bitmap'/><category term='ColorFilter'/><category term='PorterDuffXfermode'/><category term='press'/><category term='PorterDuff'/><category term='DisplayMetrics'/><category term='AsyncTask'/><category term='IWindowManager'/><category term='EntityUtils'/><category term='Paint'/><category term='HandlerThread'/><category term='Spinner'/><category term='fragment'/><category term='ListView'/><category term='Gallery'/><category term='ContentProvider'/><category term='AutoCompleteTextView'/><category term='ant'/><category term='MediaPlayer'/><category term='Thread'/><category term='internal'/><category term='Ondrej'/><category term='AlarmClock'/><category term='Matrix'/><category term='Canvas'/><category term='SystemClock'/><category term='AppWidgetProvider'/><category term='john'/><category term='GoogleHttpClient'/><category term='TimeZone'/><category term='RAD'/><category term='ArrayAdapter'/><title type='text'>ysl 的程式天堂 - Android 應用開發 ‧ 研究 ‧ 與諮詢</title><subtitle type='html'>寫程式是自己二十多年來的興趣。因為，程式讓我在我的想像天堂裡，盡情創造。擅長的領域有: Android 應用程式開發與訓練, 大型應用軟體開發, C/C++/Java, Android/Palm/Aibo, Windows/MFC/Qt, Perl/Tcl/PHP/JavaScript, MySql</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default?start-index=101&amp;max-results=100'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>116</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2195824461221522019</id><published>2012-01-20T14:31:00.016+08:00</published><updated>2012-01-29T11:40:52.405+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>2012 Android 4 手機應用開發課程 @ 台灣</title><content type='html'>&lt;p&gt;2012 mobile app development training courses for Android 4 @ Taiwan&lt;/p&gt;&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/a.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;在 2012 年，除了延續 2011 的課程，並將原先的課程內容都改以 Android 4 平台為主之外，還加開了「深入研究Android 4手機應用新架構」這門進階課。&lt;/p&gt;&lt;br /&gt;
&lt;a name="entry"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;入門課 - Android應用開發設計實務&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;首先，我將課程內容都改以 Android 4 平台為主。在這個 Android 入門開發課程中，最重的要的是幫助入門者打好基礎，尤其是 Android 平台的架構，與在該平台上應用程式運作的基礎觀念與原理。這部分要是清楚了，日後遇到問題，要自己找資料解決，也有個方向。另外就是對 ListView 元件的運行原理，也有深入的介紹，ListView 是 Android 眾多 UI 元件中，最常用到的，也是最好用的一個。透過對 ListView 的了解，其他類似的元件如 GridView, Spinner 等由 AdapterView 所延伸的元件，自然也可觸類旁通。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;熟悉 Android 2.X開發環境與Android平台知識&lt;/li&gt;
&lt;li&gt;瞭解Android 2.X程式框架&lt;/li&gt;
&lt;li&gt;如何有效率的偵錯程式&lt;/li&gt;
&lt;li&gt;功能選單之設計與應用&lt;/li&gt;
&lt;li&gt;各式使用者介面元件之設計與應用&lt;/li&gt;
&lt;li&gt;如何支援多國語言與不同的硬體設備&lt;/li&gt;
&lt;li&gt;Intent 的使用&lt;/li&gt;
&lt;li&gt;深入剖析 Activity 之運作行為&lt;/li&gt;
&lt;li&gt;發佈應用程式與參考資料&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;a name="adv1"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;進階課 I - 深入研究三大元件與桌面小工具之開發&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;這個課程先帶領你深入研究 Android 三大重要元件 (Actiovity, Service, BroadcastReceiver) 的運作原理，與建立正確的使用觀念。其中我會用將近一天的時間來解釋與剖析 Activity &amp; Service 的生命週期。這部分是對已入門的開發者，最最重要的一部分，卻也是最不容易全盤了解與最容易被忽視的一部分。我試玩過很多應用，也看過不少人的程式，與發問的問題，都是源自於對這部分的了解不夠透徹。BroadcastReceiver e也是最常被使用的元件，在學如何開發桌面小工具之前，如何使用這元件的正確觀念是一定要先建立的。接下來，我會介紹如何開發桌面小工具和多媒體應用。對於已熟悉 Android 應用開發，而想進一步提昇您自身應用開發實力與建立正確觀念的您，這個課程是一定要上的。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;深入研究Android生命週期&lt;/li&gt;
&lt;li&gt;如何開發自訂使用者元件&lt;/li&gt;
&lt;li&gt;各式繪圖功能之使用與應用&lt;/li&gt;
&lt;li&gt;BroadcastReceiver之使用與應用&lt;/li&gt;
&lt;li&gt;深入研究Service之使用與應用&lt;/li&gt;
&lt;li&gt;如何建立桌面小工具&lt;/li&gt;
&lt;li&gt;重力加速感應器的使用與應用&lt;/li&gt;
&lt;li&gt;如何播放與錄製多媒體影音&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;a name="adv2"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;進階課 II - 深入研究Android 4手機應用新架構&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;在這個進階課程中，將介紹並帶領學員深入研究 Android 3、4 新應用架構與 APIs。首先要介紹的就是 Fragments，如果你要將你的應用同時執行在手機與平板上，Fragments 是一定要導入的設計概念。就算你只支援手機應用，新的 Fragments 也有助於將你的應用架構，整理的更模組化與達到高重用性的目的。除此之外，我也將一次介紹 Android 3/4 所加進來的各項重要新功能。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;設計平板與手機應用的最佳策略&lt;/li&gt;
&lt;li&gt;- Fragments 簡介&lt;/li&gt;
&lt;li&gt;- 深入研究 Fragment 生命週期&lt;/li&gt;
&lt;li&gt;- new resource qualifiers&lt;/li&gt;
&lt;li&gt;- 同時支援各式螢幕大小不同的設備&lt;/li&gt;
&lt;li&gt;支援 Android 3/4 桌面小工具新功能&lt;/li&gt;
&lt;li&gt;- 可縮放的桌面小工具&lt;/li&gt;
&lt;li&gt;- StackView, ListView&lt;/li&gt;
&lt;li&gt;- RemoteViewService&lt;/li&gt;
&lt;li&gt;Android 3/4 新功能&lt;/li&gt;
&lt;li&gt;- Action bar&lt;/li&gt;
&lt;li&gt;- Status bar notifications&lt;/li&gt;
&lt;li&gt;- PreferenceActivity, PreferenceFragment&lt;/li&gt;
&lt;li&gt;- PopupMenu&lt;/li&gt;
&lt;li&gt;- GridLayout&lt;/li&gt;
&lt;li&gt;- Drag &amp; Drop&lt;/li&gt;
&lt;li&gt;- Copy &amp; Past&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;a name="adv3"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;進階課 III - 雲端/地圖應用開發與原碼解析&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;在這個進階課程中，我會先介紹如何開發存取網路的 Android 應用。行動網路是智慧型手機的重要特色之一，因此開發具有網路存取功能的應用，也是大家常常會接觸的工作之一。我會在課程中提及如何在 Android 手機平台上，正確執行這項工作。智慧型手機的另項特色，就是 GPS (location-based)。&lt;/p&gt;&lt;p&gt;接下來，我會介紹如何開發地圖 (LBS, location-based) 應用，如何抓取經緯度座標，寫好地圖應用，都是這課程會教的事。&lt;/p&gt;&lt;p&gt;最後，我會花半天的時間，教大家如何讀 Android 應用的源碼，並實際拿個例子來解說。我個人覺得閱讀及追蹤 Android 的原始碼，是提昇你 Android 程式設計功力最好的方式之一。當你已具備 Android 開發基礎的情況下，想要再進一步提升你的程式設計功力，除了要想辦法讓自己多增加些程式設計經驗外，閱讀及追蹤別人寫的程式碼，更是最好的方法。不過網路上，每個人的程式功力高低不同，寫出來的程式也有好有差。讀到不良的程式，看不懂還不打緊，如果誤導你的觀念，那可就得不償失。因此，當你底子還不足以判斷好壞程式時，研讀 Android 原始碼，就是你學習 Android 程式設計時，最好的導師。&lt;/p&gt;&lt;p&gt;在這課程中，也會教授 Android 的第四大重要元件 ContentProvider 的用法，當然也會提及 SQLiteDatabase 這個主題。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Android雲端應用開發&lt;/li&gt;
&lt;li&gt;- 如何開發以網頁(WebView)為基礎的 Android 應用&lt;/li&gt;
&lt;li&gt;- Android與WebView間的互相呼叫&lt;/li&gt;
&lt;li&gt;- 如何開發Android端網路應用程式，及該注意的要點&lt;/li&gt;
&lt;li&gt;- URL, IntentService, HttpClient, AndroidHttpClient&lt;/li&gt;
&lt;li&gt;- XML 與 JSON parsers 的使用&lt;/li&gt;
&lt;li&gt;Android LBS (地圖)應用開發&lt;/li&gt;
&lt;li&gt;- 如何擷取各式地理座標資訊&lt;/li&gt;
&lt;li&gt;- 如何開發地圖(MapView)應用&lt;/li&gt;
&lt;li&gt;Android原始碼徹底研究&lt;/li&gt;
&lt;li&gt;- 如何研讀Android原碼&lt;/li&gt;
&lt;li&gt;- 深入研讀Android原碼實例&lt;/li&gt;
&lt;li&gt;- SQLiteDatabase, ContentProvider&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;底下是 2012 年計畫開的課程：&lt;/p&gt;&lt;p&gt;&lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;&lt;tr style="background-color:#ff9900;color:#000"&gt;&lt;td&gt;日期&lt;/td&gt;&lt;td&gt;地點&lt;/td&gt;&lt;td&gt;課程名稱&lt;/td&gt;&lt;td&gt;難易度&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;2/15,16&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=01C002" style="color:#000"&gt;Android 4 (ICS) 手機應用開發(入門+進階)&lt;/a&gt;&lt;br /&gt;
台北自強基金會&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;2/22,23&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=01C002" style="color:#000"&gt;Android 4 (ICS) 手機應用開發(入門+進階)&lt;/a&gt;&lt;br /&gt;
台北自強基金會&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;3/28,29&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120342&amp;msgno=308709" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;4/18,19&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120343&amp;msgno=308710" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階 I&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;5/9,10&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120342&amp;msgno=308712" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv2"&gt;進階 II&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;5/23,23&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120342&amp;msgno=308713" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv3"&gt;進階 III&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;6/6,7&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120354&amp;msgno=308737" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;6/20,21&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120355&amp;msgno=308738" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階 I&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;7/4,5&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120374&amp;msgno=308760" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv2"&gt;進階 II&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#000"&gt;&lt;td&gt;7/18,19&lt;br /&gt;
星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120356&amp;msgno=308745" style="color:#000"&gt;Android 4 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv3"&gt;進階 III&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://ysl-paradise.blogspot.com/2011/02/2011-android-2x.html"&gt;2011 在台灣所開的課程&lt;/a&gt;&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2195824461221522019?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2195824461221522019/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/2012-android-4.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2195824461221522019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2195824461221522019'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/2012-android-4.html' title='2012 Android 4 手機應用開發課程 @ 台灣'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/s72-c/a.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6262772685774453736</id><published>2012-01-01T15:57:00.004+08:00</published><updated>2012-01-01T16:05:22.477+08:00</updated><title type='text'>非凡電視採訪我 - 關於手機 APP 的發展</title><content type='html'>&lt;div style="border: solid 1px #dfdfdf; color: #686868; font: 13px Arial;"&gt;&lt;div style="background-color: white; padding: 20px;"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="color: #333333; font: 13px Arial; vertical-align: top; width: 578px;"&gt;&lt;div style="padding-bottom: 10px;"&gt;上週非凡的訪問出來了，先節錄片段供大家參&lt;wbr&gt;&lt;/wbr&gt;考。&lt;br /&gt;
今天 (2012/1/1) 非凡 58 台 20:55 新聞特攻隊 應該會再播一次。&lt;br /&gt;
&lt;a class="ot-anchor" href="http://youtu.be/cLcMqtTjFxM"&gt;http://youtu&lt;wbr&gt;&lt;/wbr&gt;.be/cLcMqtTjFxM&lt;/a&gt;&lt;/div&gt;&lt;div style="border-left: 2px solid #EAEAEA; margin-top: 10px; padding-left: 10px;"&gt;&lt;span style="margin-right: 5px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-weight: bold; margin-bottom: 4px;"&gt;&lt;span style="margin-right: 5px;"&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CJj-5P6srq0CFUVrNAodIDwAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FCGzQZKRkLPT%3Fgpinv%3DAMIXal9ab8t8E0u-Ebroplf9EC86NaYD90ZvhANnlE0hyoWOueTNAWhLdDfcAmXTUgsqLoA2n-Wky0bkpWI_ZlUCuIDoPFNSnpDXLJ3oytxBPUeb6N2puh8%26hl%3Den&amp;amp;dt=1325404624864" style="text-decoration: none;"&gt;非凡新聞特攻隊 2012_0101 手機 App 報導&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="margin-right: 5px;"&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CJj-5P6srq0CFUVrNAodIDwAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FCGzQZKRkLPT%3Fgpinv%3DAMIXal9ab8t8E0u-Ebroplf9EC86NaYD90ZvhANnlE0hyoWOueTNAWhLdDfcAmXTUgsqLoA2n-Wky0bkpWI_ZlUCuIDoPFNSnpDXLJ3oytxBPUeb6N2puh8%26hl%3Den&amp;amp;dt=1325404624864"&gt;&lt;img border="0" src="https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url=http://ytimg.googleusercontent.com/vi/cLcMqtTjFxM/hqdefault.jpg&amp;amp;container=focus&amp;amp;gadget=a&amp;amp;rewriteMime=image/*&amp;amp;refresh=31536000&amp;amp;resize_h=195" style="display: block; height: 195px; width: 312px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin: 5px 0 12px 0;"&gt;&lt;span style="margin-right: 5px;"&gt;&lt;a href="http://www.youtube.com/v/cLcMqtTjFxM?hl=en&amp;amp;fs=1&amp;amp;autoplay=1" style="text-decoration: none;"&gt;youtube.com&lt;/a&gt; - 2012 1/1 非凡58台新聞特攻隊節目，關於手機 App 的報導。 訪問人物：癮科技/吳顯二, 聖星科技/盧育聖 (Sam Lu)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CJj-5P6srq0CFUVrNAodIDwAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FCGzQZKRkLPT%3Fgpinv%3DAMIXal9ab8t8E0u-Ebroplf9EC86NaYD90ZvhANnlE0hyoWOueTNAWhLdDfcAmXTUgsqLoA2n-Wky0bkpWI_ZlUCuIDoPFNSnpDXLJ3oytxBPUeb6N2puh8%26hl%3Den&amp;amp;dt=1325404624864" style="color: #3366cc; text-decoration: none;"&gt;View or comment on Sam Lu's post »&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6262772685774453736?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6262772685774453736/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2012/01/11-58-20.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6262772685774453736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6262772685774453736'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2012/01/11-58-20.html' title='非凡電視採訪我 - 關於手機 APP 的發展'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1071915127859674230</id><published>2011-12-15T11:20:00.002+08:00</published><updated>2011-12-15T11:25:19.896+08:00</updated><title type='text'>不要用打廣告的方式來推銷你的應用</title><content type='html'>&lt;div style="border: solid 1px #dfdfdf; color: #686868; font: 13px Arial;"&gt;&lt;div style="background-color: white; padding: 20px;"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="color: #333333; font: 13px Arial; vertical-align: top; width: 578px;"&gt;&lt;div style="padding-bottom: 10px;"&gt;我在講如何推廣手機應用時，曾提到不要用打&lt;wbr&gt;&lt;/wbr&gt;廣告的方式來推銷你的應用。除非:&lt;br /&gt;
1. 你鎖定的是小眾市場&lt;br /&gt;
2. 你有很多錢&lt;br /&gt;
&lt;br /&gt;
不死心的開發者就問，哪到底要多&lt;wbr&gt;&lt;/wbr&gt;少錢？&lt;br /&gt;
這數據可供你參考：&lt;a class="ot-anchor" href="http://www.insidemobileapps.com/2011/12/12/distimo-reveals-downloads-top-ranked-free-app-ios/"&gt;http://w&lt;wbr&gt;&lt;/wbr&gt;ww.insidemobileapps.&lt;wbr&gt;&lt;/wbr&gt;com/2011/12/12/disti&lt;wbr&gt;&lt;/wbr&gt;mo-reveals-downloads&lt;wbr&gt;&lt;/wbr&gt;-top-ranked-free-app&lt;wbr&gt;&lt;/wbr&gt;-ios/&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
舉例來說，要進入美國排行榜前10名，"每&lt;wbr&gt;&lt;/wbr&gt;天"的下載量至少要8萬，一般來說，每個下&lt;wbr&gt;&lt;/wbr&gt;載的廣告成本約USD$1。這表示你 "每天" 要花 "USD$8萬"，才能擠進前10名。你有&lt;wbr&gt;&lt;/wbr&gt;這麼多行銷預算嗎？我相信就算是公司，答案&lt;wbr&gt;&lt;/wbr&gt;也是NO。如果你的應用沒有切中使用者需求&lt;wbr&gt;&lt;/wbr&gt;，那更慘，就算靠廣告站上排行，也很快被刷&lt;wbr&gt;&lt;/wbr&gt;下來。&lt;br /&gt;
&lt;br /&gt;
那到底要如何推廣你的手機應用？我還&lt;wbr&gt;&lt;/wbr&gt;是深信"口碑行銷"，是最有效的。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CPCj4LCPg60CFUMhNAod-QwAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2Fh7yQ7UKwkhq%3Fgpinv%3DAMIXal9qhMRMXeuvueH59bfPP56m-b51V0Taf4W6Dxaa9__VTsec078hPV6BU-Zco0r-5haJAtRDfTpBuxRqWRFooxQ_NT0wf6tJazVQXG7laQlKGSUeInU%26hl%3Den&amp;amp;dt=1323919207832" style="color: #3366cc; text-decoration: none;"&gt;View or comment on Sam Lu's post »&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1071915127859674230?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1071915127859674230/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/12/1.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1071915127859674230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1071915127859674230'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/12/1.html' title='不要用打廣告的方式來推銷你的應用'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1919891288868641251</id><published>2011-12-12T16:17:00.003+08:00</published><updated>2011-12-12T16:23:26.607+08:00</updated><title type='text'>非 ICS 平台也可用 GridLayout</title><content type='html'>&lt;div style="border: solid 1px #dfdfdf; color: #686868; font: 13px Arial;"&gt;&lt;div style="background-color: white; padding: 20px;"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="color: #333333; font: 13px Arial; vertical-align: top; width: 578px;"&gt;&lt;div style="padding-bottom: 10px;"&gt;ICS 新增一個好用的 GridLayout 元件，據說 support package 會將它含進來，在此之前，你可以參考  &lt;a class="ot-anchor" href="http://blog.peterkuterna.net/2011/11/using-new-gridlayout-on-pre-ice-cream.html"&gt;http://blog.peterkut&lt;wbr&gt;&lt;/wbr&gt;erna.net/2011/11/usi&lt;wbr&gt;&lt;/wbr&gt;ng-new-gridlayout-on&lt;wbr&gt;&lt;/wbr&gt;-pre-ice-cream.html&lt;/a&gt;&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CNjkvaqM_KwCFcptNAodT3YAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FAXZwE5EXrSm%3Fgpinv%3DAMIXal-Qq9ArleMWxOuqb4Rhygzr0qURBs9jTbap1s1zl5djk7HdvANiorlMtDbBhpHicTk0Li_tbfWO01ycCXPCR3pOJG98zBLgZGqcKhhPabp53tpgIbc%26hl%3Den&amp;amp;dt=1323677871208" style="color: #3366cc; text-decoration: none;"&gt;View or comment on Sam Lu's post »&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1919891288868641251?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1919891288868641251/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/12/ics-gridlayout-support-package.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1919891288868641251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1919891288868641251'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/12/ics-gridlayout-support-package.html' title='非 ICS 平台也可用 GridLayout'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8763046374286313501</id><published>2011-11-16T12:59:00.003+08:00</published><updated>2011-11-16T13:04:03.479+08:00</updated><title type='text'>How to view Android source file on Eclipse(Windows platform)?</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;Windows 沒有 symbolic link 功能，實在是一件很討厭的事。為了要在 Eclipse 中看 Android 原始碼，而將 all source files copy 到 &amp;lt;sdk&amp;gt;/platforms/andr&lt;wbr&gt;oid-xxx/sources 中，不是一個好方法。我建議你可:&lt;br /&gt;
1. on Eclipse, right-click Android X.X/android.jar, select Properties menu item, it will show you a dialog box.&lt;br /&gt;
2. select &amp;quot;Java Source Attachment&amp;quot;&lt;br /&gt;
3. specify your android source files path, e.g. xxx/frameworks/base/&lt;wbr&gt;code/java, to the &amp;quot;Location path&amp;quot; field&lt;br /&gt;
4. click OK button&lt;br /&gt;
好了，在Eclipse中一路&lt;wbr&gt;往回追class/method declaration時，就可以直接看到&lt;wbr&gt;Andorid source code。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CIC-sb2vuqwCFQmz5god0l4AAA&amp;path=%2F110650936199389484797%2Fposts%2FPCQafcpnW4a%3Fgpinv%3DAMIXal_ZWoGsmth7e-Z_Ji8vZh3HTSnsrsRn2ebx13hdYvSVYrSEyw62zTxDTy9b0D7YWgLn1E2Tvtr7T3eSUJ5bGHtUb0n8MnXS1M951IccF6dgjJCJkg8%26hl%3Den&amp;dt=1321419563361" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8763046374286313501?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8763046374286313501/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/how-to-view-android-source-file-on.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8763046374286313501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8763046374286313501'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/how-to-view-android-source-file-on.html' title='How to view Android source file on Eclipse(Windows platform)?'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4289775257234014290</id><published>2011-11-04T07:37:00.003+08:00</published><updated>2011-11-16T13:04:35.186+08:00</updated><title type='text'>A library for using, editing, and creating fonts</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;&lt;a href="https://code.google.com/p/sfntly/" class="ot-anchor"&gt;https://code.google.&lt;wbr&gt;com/p/sfntly/&lt;/a&gt;&lt;br /&gt;
A Java and C++ Library for Using, Editing, and Creating SFNT-based (TrueType, OpenType, AAT/GX, and Graphite. Tables) Fonts&lt;br /&gt;
&lt;br /&gt;
Google 新 release 的 open source。可以抓到字型資料，想玩字型&lt;wbr&gt;特別變化效果的，可參考使用。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CODHl4bRm6wCFYQN5god9H0AAA&amp;path=%2F110650936199389484797%2Fposts%2FH2AxA9mRUHd%3Fgpinv%3DAMIXal-7MURfOQpFzVpujeDXZxHC9lbpHUO5-C1JAzUW6nYCCuJyOGfQ9AJIv5nSzgpIapC0-KLNLxg4h6gn9_SEgum5UF-aJtmKTsJzI7O-N6CSLmM44yg%26hl%3Den&amp;dt=1320363422509" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4289775257234014290?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4289775257234014290/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/httpscodegooglecompsfntly-java.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4289775257234014290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4289775257234014290'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/httpscodegooglecompsfntly-java.html' title='A library for using, editing, and creating fonts'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-378381270822538984</id><published>2011-11-03T15:23:00.004+08:00</published><updated>2011-11-16T13:04:48.097+08:00</updated><title type='text'>如何Proguard 後還能看到死掉的檔名與行號</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;Android 程式套用 Proguard 之後，最大的缺點就是無法從程式死掉時的 stack trace 結果，一眼看出死在哪個檔案的哪一行上。分&lt;wbr&gt;享給你最簡單的解法：&lt;br /&gt;
在 proguard 的輸入參數中加上 &amp;quot;-keepattributes SourceFile,LineNumbe&lt;wbr&gt;rTable&amp;quot; 即可。缺點是會讓你的程式變大一些，不過瑕不掩瑜。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CIDggbn3mawCFckG5god8kgAAA&amp;path=%2F110650936199389484797%2Fposts%2F92CjmG9Upg3%3Fgpinv%3DAMIXal97JwYB224FBQlMcvsw9-NFaq9i1fFBgYxJBpe_G2eBuEvDPPoLYgEzB2EKncQ5iU10SpK_zURvwccppIDPbzFaBQCRv6UReapSswLQ3P8-OY9n-NY%26hl%3Den&amp;dt=1320305010177" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-378381270822538984?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/378381270822538984/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/android-proguard.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/378381270822538984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/378381270822538984'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/android-proguard.html' title='如何Proguard 後還能看到死掉的檔名與行號'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8412430207428894184</id><published>2011-11-02T20:28:00.003+08:00</published><updated>2011-11-16T13:05:01.368+08:00</updated><title type='text'>Android crypto 支援的 cliper, keygen algorithm...</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;想要知道 Android crypto 支援的 cliper, keygen algorithm and MessageDigests 可查此：&lt;br /&gt;
&lt;a href="http://groups.google.com/group/android-developers/browse_thread/thread/a4c3673dee73eac8" class="ot-anchor"&gt;http://groups.go&lt;wbr&gt;ogle.com/group/andro&lt;wbr&gt;id-developers/browse&lt;wbr&gt;_thread/thread/a4c36&lt;wbr&gt;73dee73eac8&lt;/a&gt;&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CJC18OX5l6wCFci25godcmkAAA&amp;path=%2F110650936199389484797%2Fposts%2FZc1Weziv1eQ%3Fgpinv%3DAMIXal-L0fryVW3TOhxusHVlwUGENSJa0ZMqDGskvZoLjMmJgyOlBRjT292lUg_mc4r7ehU8DlfZywzi2kCTWYGOq2btGLKsNJrsZkQMXwjsSKblS5pQU0k%26hl%3Den&amp;dt=1320236921659" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8412430207428894184?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8412430207428894184/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/android-crypto-cliper-keygen-algorithm.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8412430207428894184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8412430207428894184'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/android-crypto-cliper-keygen-algorithm.html' title='Android crypto 支援的 cliper, keygen algorithm...'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5754831186278874083</id><published>2011-11-02T06:37:00.003+08:00</published><updated>2011-11-16T13:05:17.042+08:00</updated><title type='text'>Android UI Development: Tips, Tricks and Techniques</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;&lt;a href="http://www.parleys.com/#st=5&amp;amp;id=2115&amp;amp;sl=13" class="ot-anchor"&gt;http://www.parleys.c&lt;wbr&gt;om/#st=5&amp;amp;id=2115&amp;amp;sl=&lt;wbr&gt;13&lt;/a&gt; (slides &amp;amp; video)&lt;br /&gt;
Android UI Development: Tips, Tricks and Techniques&lt;br /&gt;
&lt;br /&gt;
Java 就算有 garbage collection 也無法免除開發者在記憶體管理上的額外的包&lt;wbr&gt;袱&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=COjHgPW_lqwCFci25god3EoAAA&amp;path=%2F110650936199389484797%2Fposts%2FAu3rDMM65so%3Fgpinv%3DAMIXal9Reqq94p8zxHzmqDBsCmuEOzK3KoTZcg_Jmd-15FIU9n2B1oIFT-EqSBoMXwUXWfZWOt9jNoH8ZaBA56DDCQLFDz7Qh3ZI5NS6K6JPioMMERES4y4%26hl%3Den&amp;dt=1320187024386" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5754831186278874083?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5754831186278874083/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/httpwwwparleyscomst5.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5754831186278874083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5754831186278874083'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/httpwwwparleyscomst5.html' title='Android UI Development: Tips, Tricks and Techniques'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8956112476047864426</id><published>2011-11-01T22:44:00.005+08:00</published><updated>2011-11-16T13:05:31.247+08:00</updated><title type='text'>如何產生或解有密碼保護的 zip 檔</title><content type='html'>&lt;div style="border: solid 1px #dfdfdf; color: #686868; font: 13px Arial;"&gt;&lt;div style="background-color: white; padding: 20px;"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="padding-right: 15px; vertical-align: top;"&gt;&lt;/td&gt;&lt;td style="color: #333333; font: 13px Arial; vertical-align: top; width: 578px;"&gt;&lt;div style="padding-bottom: 10px;"&gt;&lt;a class="ot-anchor" href="http://code.google.com/p/winzipaes/"&gt;http://code.google.c&lt;wbr&gt;&lt;/wbr&gt;om/p/winzipaes/&lt;/a&gt;&lt;br /&gt;
Andro&lt;wbr&gt;&lt;/wbr&gt;id 上，想要產生或解有密碼保護的 zip 檔，可用這個 library.&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CPDx053WlawCFYQN5godWF4AAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FQxuq6RgiXo6%3Fgpinv%3DAMIXal8PpWHG45i5f4LoSaWW9E9om0pDwslSe9mQ3lntJQyzCAOHhNp5ZxVZFWnJin3jHBV78upSjUkAOvdVZynoBVslMYeBWpQ5c_a99_FJaiM5lvy7gzQ%26hl%3Den&amp;amp;dt=1320158655479" style="color: #3366cc; text-decoration: none;"&gt;View or comment on Sam Lu's post »&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8956112476047864426?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8956112476047864426/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/httpcodegooglecompwinzipaes-android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8956112476047864426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8956112476047864426'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/11/httpcodegooglecompwinzipaes-android.html' title='如何產生或解有密碼保護的 zip 檔'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2661319122208206919</id><published>2011-10-29T13:15:00.005+08:00</published><updated>2011-11-16T13:05:47.949+08:00</updated><title type='text'>Ad Blocker - III</title><content type='html'>&lt;div style="border: solid 1px #dfdfdf; color: #686868; font: 13px Arial;"&gt;&lt;div style="background-color: white; padding: 20px;"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="padding-right: 15px; vertical-align: top;"&gt;&lt;/td&gt;&lt;td style="color: #333333; font: 13px Arial; vertical-align: top; width: 578px;"&gt;&lt;div style="padding-bottom: 10px;"&gt;要讓裝 AdBlocker 之類的使用者停用你的應用非常簡單，只要讀&lt;wbr&gt;&lt;/wbr&gt;取 /etc/hosts 檔案，內容中有 &lt;a class="ot-anchor" href="http://admob.com/"&gt;admob.com&lt;/a&gt;，就跳出應用即可。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CLi3r7yRjawCFYMM5god4ncAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FN5WPAGvqUWU%3Fgpinv%3DAMIXal-VC3ygEz0e32OF3sHcBt7kjbXrOb_glTaJOZmmshpqQmd1XWI02fUMxk8QEAboVOghs8RZB8jTparBwCWP7Rouj9QnYbVHg2XTe1qd3eEHTvecO5A%26hl%3Den&amp;amp;dt=1319865319939" style="color: #3366cc; text-decoration: none;"&gt;View or comment on Sam Lu's post »&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2661319122208206919?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2661319122208206919/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/adblocker-etc_29.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2661319122208206919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2661319122208206919'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/adblocker-etc_29.html' title='Ad Blocker - III'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-804776713668443426</id><published>2011-10-29T13:14:00.009+08:00</published><updated>2011-11-16T13:06:13.702+08:00</updated><title type='text'>Ad Blocker - I</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;開發者出免費版，就是要賺廣告費。可是就有&lt;wbr&gt;人裝Ad blocker之類的應用，來阻擋廣告。這&lt;wbr&gt;次我心一橫，有裝Ad blocker一律不能用我的免費應用。果&lt;wbr&gt;然用Ad blocker的人都跳出來給你一顆星。哈&lt;wbr&gt;，我好爽!&lt;br /&gt;
* Excellent app! As a dev,I agree with your new adblock politics.. as a user I uninstall and grab the next free currency app. it&amp;#39;s a pitty.&lt;br /&gt;
* Totally sucks!! WHAT THE FUCK IT SAYS DONT USE ADFREE BLOCKER SAM LU FUCK OFF&lt;br /&gt;
* Adblock Detects adblock and refuses to run. Very very poor show.&lt;br /&gt;
* Just upgraded and it won&amp;#39;t run since my phone is rooted and blocks ads. Time to uninstall.&lt;br /&gt;
* Forcing to apply restrictions on rooted ad blocker phone is hostile. Uninstalled!&lt;br /&gt;
* Ad block restricted Epic fail. Custom firmware with edited hosts. Update no longer works. Uninstalling now&lt;br /&gt;
* Seit dem Update kann man die App nicht mehr starten wenn man AdFree installiert hat. Ich werde mein Handy nicht nur fur die App mit Werbung uberfluten&lt;br /&gt;
* Col nuovo aggiornamento non si apre se si utilizza ad blocker    Disinstallo e passo a programmi omonimi, non amo le imposizioni giuste o sbagliate che siano.&lt;br /&gt;
* Ad-Blocker Zeigt seit letztem Update an, dass ein Ad-Blocker installiert ware. Ist aber nicht der Fall!&lt;br /&gt;
* Geht seit dem Update nicht mehr&lt;br /&gt;
* 改悪 最新バージョンでは、広告をブロックすると&lt;wbr&gt;起動できません！&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CJiS_6KRjawCFYQN5godWF4AAA&amp;path=%2F110650936199389484797%2Fposts%2Fct3zj75YvEo%3Fgpinv%3DAMIXal813A_KR2RY_vcPSoxHkLLtddAWCduSqxWAd_InvTTWHUAvpa91NDrZ8my5PWk5Tyuxk093c5pPVEQpPf3cm5hJ5a6ryo7EoLcE3FqWT5K-f0wrLE0%26hl%3Den&amp;dt=1319865266720" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-804776713668443426?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/804776713668443426/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/ad-blocker_29.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/804776713668443426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/804776713668443426'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/ad-blocker_29.html' title='Ad Blocker - I'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8636364684373419810</id><published>2011-10-29T13:14:00.008+08:00</published><updated>2011-11-16T13:05:59.923+08:00</updated><title type='text'>Ad Blocker - II</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;前幾天讓裝Ad blocker的，一律不能用我的免費應用 (見 &lt;a href="http://goo.gl/oW1fE" class="ot-anchor"&gt;http://goo.gl/oW1fE&lt;/a&gt;) 一如預期，這兩天全都是1 star reviews。幾個朋友不免擔心地問我，&lt;wbr&gt;這不是會影響你的收入？我說，有可能，可是&lt;wbr&gt;沒做你怎知結果是好或壞？手機應用市場中，&lt;wbr&gt;有太多東西是會顛覆傳統行銷理論。總得有人&lt;wbr&gt;犧牲，實際實驗一下才行。你覺得結果會是如&lt;wbr&gt;何？&lt;br /&gt;
想知道結果的，先發表一下你的看法，累&lt;wbr&gt;積到一定的留言數，我再公佈我的實驗結果。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=COCxpayRjawCFYMM5god4ncAAA&amp;path=%2F110650936199389484797%2Fposts%2FEt11kt8fY6o%3Fgpinv%3DAMIXal8OAF64yZjB5hyln77fVUWy9Od22joZZfkB8UXUpcB73ymdQYp83NX1IRV3AmilPDoXiNsNpXqlc18LOEIGBLkx7wBV-tUedh3MuNRG-wGZcLiwWhI%26hl%3Den&amp;dt=1319865286221" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8636364684373419810?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8636364684373419810/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/ad-blocker-httpgoogl_29.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8636364684373419810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8636364684373419810'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/ad-blocker-httpgoogl_29.html' title='Ad Blocker - II'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-825784975545856754</id><published>2011-10-29T13:13:00.004+08:00</published><updated>2011-11-16T13:06:37.203+08:00</updated><title type='text'>小小的設計細節改變卻讓你的 UI 有明顯的改善</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;&lt;a href="http://www.pushing-pixels.org/2011/10/21/make-it-look-pretty.html" class="ot-anchor"&gt;http://www.pushing-p&lt;wbr&gt;ixels.org/2011/10/21&lt;wbr&gt;/make-it-look-pretty&lt;wbr&gt;.html&lt;/a&gt;&lt;br /&gt;
你可能不會注意到這樣的設計細節&lt;wbr&gt;，但小小的改變卻讓你的 UI 有明顯的改善。&lt;/div&gt;&lt;div style="margin-bottom:10px;padding-left:10px; border-left:2px solid #EAEAEA"&gt;&lt;a style="zSoyz" href="http://www.pushing-pixels.org/2011/10/21/make-it-look-pretty.html"&gt;&lt;img src="https://images1-focus-opensocial.googleusercontent.com/gadgets/proxy?url=https://s2.googleusercontent.com/s2/favicons?domain%3Dwww.pushing-pixels.org&amp;amp;container=focus&amp;amp;gadget=a&amp;amp;rewriteMime=image/*&amp;amp;refresh=31536000&amp;amp;resize_h=16" border=0 style="margin-right:5px" /&gt;&lt;span style="font-weight:bold"&gt;Make it look pretty ·  Pushing Pixels&lt;/span&gt;&lt;/a&gt;&lt;div style="padding-bottom:10px"&gt;Make it look pretty. October 21st, 2011 | No Comments &amp;raquo;. The &amp;ldquo;Design Secrets for Engineers&amp;rdquo; blog post over at Pulse engineering blog opens up with the following: If you are a designer like me, you mus...&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;amp;emid=CIiQiomRjawCFci25godf3MAAA&amp;amp;path=%2F110650936199389484797%2Fposts%2FXmruRxDUfzQ%3Fgpinv%3DAMIXal8yJPDMTtQwypE3du8vrdAT6PBqRUfb0CANNu5tql0jIKrwnJyPIcsRLHMJ29ZZnVfCZhsUDeBnYxEXhHo3o7qoaeYgdvd5lDKIFplv1LVyIpcRmOU%26hl%3Den&amp;amp;dt=1319865212374" style="zSoyz;margin-right:10px"&gt;&lt;img src="https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url=http://www.pushing-pixels.org/wp-content/uploads/2011/10/sentinel-small.jpg&amp;amp;container=focus&amp;amp;gadget=a&amp;amp;rewriteMime=image/*&amp;amp;refresh=31536000&amp;amp;resize_h=120" border=0 style="max-height:200px;max-width:275px" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CIiQiomRjawCFci25godf3MAAA&amp;path=%2F110650936199389484797%2Fposts%2FXmruRxDUfzQ%3Fgpinv%3DAMIXal8yJPDMTtQwypE3du8vrdAT6PBqRUfb0CANNu5tql0jIKrwnJyPIcsRLHMJ29ZZnVfCZhsUDeBnYxEXhHo3o7qoaeYgdvd5lDKIFplv1LVyIpcRmOU%26hl%3Den&amp;dt=1319865212374" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-825784975545856754?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/825784975545856754/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/httpwwwpushing-pixelsorg20111021.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/825784975545856754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/825784975545856754'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/httpwwwpushing-pixelsorg20111021.html' title='小小的設計細節改變卻讓你的 UI 有明顯的改善'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6414648960168458922</id><published>2011-10-29T13:12:00.004+08:00</published><updated>2011-11-16T13:08:49.357+08:00</updated><title type='text'>省電應用與 icon 設計</title><content type='html'>&lt;div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"&gt;&lt;div style="background-color:#fff;padding:20px;"&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td style="padding-right:15px;vertical-align:top"&gt;&lt;/td&gt;&lt;td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"&gt;&lt;div style="padding-bottom:10px"&gt;Android 上省電應用不少，不過真正有效(或聰明)的&lt;wbr&gt;卻不多。今天某個使用者介紹底下這個應用給&lt;wbr&gt;我，我發現他竟然只是將螢幕亮度降到最低的&lt;wbr&gt;方式來省電。這招是能省到電，不過實在不高&lt;wbr&gt;招。&lt;br /&gt;
&lt;a href="https://market.android.com/details?id=com.bh.android.PowerSaveModeEnabler" class="ot-anchor"&gt;https://market.and&lt;wbr&gt;roid.com/details?id=&lt;wbr&gt;com.bh.android.Power&lt;wbr&gt;SaveModeEnabler&lt;/a&gt;&lt;br /&gt;
從開發者名&lt;wbr&gt;字上看，應該是華人(對岸的?)，不過他的 icon 設計卻是一致地糟。&lt;br /&gt;
&lt;a href="https://market.android.com/developer?pub=BH_Lin" class="ot-anchor"&gt;https://mar&lt;wbr&gt;ket.android.com/deve&lt;wbr&gt;loper?pub=BH_Lin&lt;/a&gt;&lt;br /&gt;
寫了這麼&lt;wbr&gt;多應用，應該花了很多心血。有機會遇到他，&lt;wbr&gt;會和他說，不要寫那麼多垃圾應用。&lt;/div&gt;&lt;a href="https://plus.google.com/_/notifications/ngemlink?&amp;emid=CLDq8vKQjawCFc075godyUkAAA&amp;path=%2F110650936199389484797%2Fposts%2FCnkzd4yedXD%3Fgpinv%3DAMIXal9WfHd6AdDeae1eWLk1KndtQMuR3cFu2cm0M0PqHRoqzv6fFJxoCRuiwvNdyMw13twpJp5u1CqUUXv5j2ZqDR8z6NYiTq26yxoBILfntbC2YRb8QbY%26hl%3Den&amp;dt=1319865165854" style="color:#3366CC;text-decoration:none;"&gt;View or comment on Sam Lu's post &amp;raquo;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6414648960168458922?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6414648960168458922/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/android_29.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6414648960168458922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6414648960168458922'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/10/android_29.html' title='省電應用與 icon 設計'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3985389388440757843</id><published>2011-09-22T10:34:00.005+08:00</published><updated>2011-10-14T20:28:05.267+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>今年下半年的校園演講</title><content type='html'>去年的校園演講主要著重在 Android 的介紹，今年則是更進一步讓同學知道如何在手機應用中，賺到你的第一桶金。&lt;br /&gt;
&lt;br /&gt;
底下是目前的預計行程：&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
9/22/2011, 3p-5p, 中央大學 E1-102 (電機館), 手機應用的創意設計與發展契機&lt;br /&gt;
9/28/2011, 6:30p-9:30p, 台灣科技大學 RB105 國際演講廳, 開發手機應用的必勝法則&lt;br /&gt;
10/7/2011, 2:30p-4p, 成功大學資工所 資訊系館4263教室, 手機應用的創意設計與發展契機&lt;br /&gt;
10/27/2010, 13:10p-16:00p, 中原大學 教學大樓105多媒體教室, 手機應用的創意設計與發展契機&lt;br /&gt;
&lt;br /&gt;
台科大的那一場，是數位時代和台科大合開的三學分課程。我主講的是 9/28 晚上那一堂，很多資料都是第一次在此演講中對外發佈，這也是這綜合我這幾年在手機應用的開發心得。該課程有開放旁聽，不過座位有限。如果你想在手機應用中尋求發展的話，建議你可以來聽聽看。這應該也是今年唯一關於我個人手機應用開發心得的完整演講。&lt;br /&gt;
&lt;br /&gt;
之後校園演講的資訊與更新，請點 &lt;a href="http://ysl-paradise.blogspot.com/2010/05/blog-post.html"&gt;http://ysl-paradise.blogspot.com/2010/05/blog-post.html&lt;/a&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3985389388440757843?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3985389388440757843/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/09/blog-post.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3985389388440757843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3985389388440757843'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/09/blog-post.html' title='今年下半年的校園演講'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-7302538622183222676</id><published>2011-07-17T11:28:00.027+08:00</published><updated>2011-07-17T19:03:44.710+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>消保法的過時與不完整 - 北市府說 Apple, Yahoo, PCHome 都已遵守消保法，事實真的是如此嗎？</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-B2NCkqwRo_4/Tggz-lkHblI/AAAAAAAAAas/B_8_2t-uSmE/s320/RefundStamp.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;民國 83 年頒行的消保法，在當時的時空環境下，並沒有考慮到現今蓬勃發展的數位內容產品，以至於當北市府消保官硬要將這過時消保法，也套用在數位內容產品時，在近期內衍生出了許多爭議。&lt;/p&gt;

&lt;p&gt;消保官依法行政，從法來看，一點問題也沒有。但如果消保官真得要嚴格執法的話，請問國內三大軟體市集與網購平台，有幾家是符合消保法第十九條規定的？消保官在 &lt;a href="http://blog.yam.com/philipy/article/39261422"&gt;這裡&lt;/a&gt; 說，Apple, Pchome, Yahoo 都有遵守消保法規定，國內軟體市集也在 &lt;a href="http://www.ithome.com.tw/itadm/article.php?c=68358"&gt;這裡&lt;/a&gt;說，他們也都遵守消保法規定。事實真的是如此嗎？&lt;/p&gt;

&lt;p&gt;我今天就當壞人，幫消費者檢驗一下，現行有那些平台廠商是符合這過時消保法規定的。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;如果你要繼續往下閱讀時，我建議先看一下 &lt;a href="http://ysl-paradise.blogspot.com/2011/06/app.html"&gt;消保法的過時與不完整 - App七天內可退錢，那電子書，音樂，電影也都可以看完再退囉&lt;/a&gt; 這篇。那裡有詳細說明現行消保法之規定。同時幾個法律專家，在 &lt;a href="http://mag.udn.com/mag/digital/storypage.jsp?f_MAIN_ID=315&amp;f_SUB_ID=3764&amp;f_ART_ID=327235"&gt;這&lt;/a&gt;，在 &lt;a href="http://yveslin0816.blogspot.com/2011/06/android-market-app-19.html"&gt;這&lt;/a&gt; 也都有提出對這現行消保法的看法。&lt;/p&gt;

&lt;p&gt;底下的資料都是依據文章撰寫當時在網路上所採集的資料整理而來，如果有不對或需要修改的地方，請來信告訴我。&lt;/p&gt;

&lt;p&gt;根據現行消保法，簡單地來說，只要是你透過網路向商家購買的商品，都可以在 7 天內，"無須說明理由" 及 "負擔任何費用或價款"，直接向商家要求退錢。我在這想強調的重點是「無須說明理由」及「負擔任何費用或價款」。這代表說，只要在網購平台上買到的東西，在 7 天內，只要你不想要了，都可以退貨給商家，要求全額退款。商家不可以問你退貨的理由，或者不管你寫的理由多麼荒唐，商家都必須要無條件退全額給你。北市府消保官就是根據這項恐龍消保法條，要求 Apple 的  App Store 與 Google 的 Android Market 嚴格遵守。&lt;/p&gt;

&lt;p&gt;我們來看一下，目前有哪些廠商可以完全符合消保法的規定：&lt;/p&gt;

&lt;p&gt;Apple 說他已經符合消保法規定了，真的是這樣嗎？Apple 你有沒有忘了，你還有個 Apple online store？在 &lt;a href="http://store.apple.com/tw/help/returns_refund?mco=MTg4Mjg4Nzg"&gt;Apple online store 退貨與退款&lt;/a&gt; 中，說明電子軟體，已開封的軟體和記憶體...都不可以退貨。(註一)&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-vBBPZ9Dji1g/TiJcsMNh3fI/AAAAAAAAAe8/OqYYGSihf_E/s1600/apple_online_store.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 150px;" src="http://2.bp.blogspot.com/-vBBPZ9Dji1g/TiJcsMNh3fI/AAAAAAAAAe8/OqYYGSihf_E/s320/apple_online_store.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630164398428511730" /&gt;&lt;/a&gt;&lt;br&gt;
另外，在 &lt;a href="http://www.apple.com/legal/itunes/appstore/tw/terms.html"&gt;Apple Store 的條款與約定&lt;/a&gt; 中說，In App訂閱是不可以退錢的。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-LAK0KXwUh2A/TiJc5ERSeqI/AAAAAAAAAfE/9L8bJDQKx8E/s1600/apple_ias.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 84px;" src="http://3.bp.blogspot.com/-LAK0KXwUh2A/TiJc5ERSeqI/AAAAAAAAAfE/9L8bJDQKx8E/s320/apple_ias.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630164619635096226" /&gt;&lt;/a&gt;&lt;br&gt;
消保法可不管你賣的是麼東西，只要是在非實體店家中賣出的東西，7 天內，消費者想退錢，你就得一定要退，好嗎？自己加的那些限制條款，都是違反消保法的。&lt;/p&gt;

&lt;p&gt;註一：關於業者加上「拆封軟體或影音商品，不得退貨」等限制條款，PCHome 在 2010 年 10 月已有訴願敗訴的判例。也就是說，依照消保法規定，不管你是甚麼商品， 7 日內一定可無條件退錢，管你拆封不拆封。法官，消保官都沒錯，他們是依法行政。錯的是行政院主管機關，不積極修法，也不出來解釋這條文套用在數位內容商品的適用性。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-lzhPKGFxeaI/TiKe_e-GzUI/AAAAAAAAAf8/yZ2mMuqrJHA/s1600/pchome_fail.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 316px; height: 320px;" src="http://4.bp.blogspot.com/-lzhPKGFxeaI/TiKe_e-GzUI/AAAAAAAAAf8/yZ2mMuqrJHA/s320/pchome_fail.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630237297649044802" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;說實話，我找了很久，都沒看到中華、台哥大和遠傳軟體市集的退貨說明寫哪裡。&lt;b&gt;讓消費者在購買前，清楚知道他的退貨權益，不是一件更重要的事嗎？&lt;/b&gt;反過來說，電信三雄這一糢糊策略，有效，果然是本土公司，條文都不寫，出事時，只要出個嘴，隨便你怎麼說都行。我唯一找到的資料是 &lt;a href="http://www.ithome.com.tw/itadm/article.php?c=68358"&gt;電信業者：手機軟體退費依消保法給七天鑑賞&lt;/a&gt;，&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-YNWc3vhp8iE/TiJdATZ9Q8I/AAAAAAAAAfM/mZDSveLZsKI/s1600/tw_markets.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 70px;" src="http://3.bp.blogspot.com/-YNWc3vhp8iE/TiJdATZ9Q8I/AAAAAAAAAfM/mZDSveLZsKI/s320/tw_markets.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630164743957070786" /&gt;&lt;/a&gt;&lt;br&gt;這篇文章內說「若有不滿意者可以撥打專線給客服，說明原因後辦理退費」。拜託，消保法規定的是無須說明任何理由，好嗎？除了要將「說明原因」拿掉之外，也請先公佈你們的退貨條款，讓消費者檢視。&lt;/p&gt;

&lt;p&gt;博客來也曾被消保官 &lt;a href="http://www.businessweekly.com.tw/webarticle.php?id=43840&amp;p=3"&gt;說是遵守消保法的乖寶寶&lt;/a&gt;。我告訴你，博客來也沒遵守消保法的規定。在 &lt;a href="http://www.books.com.tw/exep/qa/item.php?i_id=0000000184"&gt;博客來的退換貨原則條款&lt;/a&gt; 中，列了一堆不准退貨的但書。什麼開封的軟體不能退，拆封的雜誌或影音商品也不準退...&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-W52WHFdRptk/TiJdIw1OQMI/AAAAAAAAAfU/u6D2eUbYEF8/s1600/books.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 269px;" src="http://2.bp.blogspot.com/-W52WHFdRptk/TiJdIw1OQMI/AAAAAAAAAfU/u6D2eUbYEF8/s320/books.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630164889295012034" /&gt;&lt;/a&gt;&lt;br&gt;一樣，7 天內，消費者想退，你就得一定要退，加這些限制退貨條款都算違反消保法。&lt;/p&gt;

&lt;p&gt;另外曾被消保官點名的乖寶寶，還有 Yahoo 及 PCHome。他們真的是乖寶寶嗎？Yahoo 在 &lt;a href="http://buy.yahoo.com.tw/gdsale/gdsale.asp?gdid=2465057"&gt;賣 Windows&lt;/a&gt; 的商品網頁上，就清楚說明，一但你拆封了，也是不能退的。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/--LdPJfmCnHg/TiJdQ6iOmqI/AAAAAAAAAfc/kvXVFuv2TNs/s1600/yahoo.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 117px;" src="http://2.bp.blogspot.com/--LdPJfmCnHg/TiJdQ6iOmqI/AAAAAAAAAfc/kvXVFuv2TNs/s320/yahoo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630165029338651298" /&gt;&lt;/a&gt;&lt;br&gt;
在 PCHome 的 &lt;a href="http://shopping.pchome.com.tw/?mod=item&amp;func=exhibit&amp;IT_NO=DSAE5J-A48888914&amp;SR_NO=AIAG71&amp;ROWNO=1"&gt;商品退貨需知&lt;/a&gt; 中，也說電腦軟體、遊戲光碟、DVD、食品...拆封就不能退。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-4inY9U_6tTY/TiJdYwg3kMI/AAAAAAAAAfk/UHViKnUaGMI/s1600/pchome.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 183px;" src="http://3.bp.blogspot.com/-4inY9U_6tTY/TiJdYwg3kMI/AAAAAAAAAfk/UHViKnUaGMI/s320/pchome.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630165164087546050" /&gt;&lt;/a&gt;&lt;br&gt;在消保法的保護之下，沒有那種拆封就不能退的事，就算我 DVD 看完，7 日內我想退，Yahoo, PcHome 你們也都一定要全額退錢給我。消費者勝利！勝利！&lt;/p&gt;

&lt;p&gt;大買家的 &lt;a href="http://www.savesafe.com.tw/Products/ProductView.aspx?t_s_id=&amp;s_id=6ae5b51073be86c2807c932acabce528"&gt;退貨說明&lt;/a&gt; 也說「著作權相關之商品( 如影音光碟、軟體)及耗材(墨 水匣、碳粉匣)若已拆封，則無法接受退換貨」。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-cXVD-GVOdUA/TiJdfwUGJ_I/AAAAAAAAAfs/rXWHsTUtmiY/s1600/safesave.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 34px;" src="http://2.bp.blogspot.com/-cXVD-GVOdUA/TiJdfwUGJ_I/AAAAAAAAAfs/rXWHsTUtmiY/s320/safesave.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630165284293060594" /&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;誠品的 &lt;a href="http://www.eslite.com/cs_faq.aspx"&gt;退換貨的處理方式&lt;/a&gt; 也說「為維護智慧財產權，影音商品(如錄音帶、錄影帶、CD、DVD等)，若已被拆封將無法接受退貨退款」。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2lz4GlzU8_E/TiJdlhlKw0I/AAAAAAAAAf0/FxT_BcNYUI8/s1600/eslite.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 52px;" src="http://1.bp.blogspot.com/-2lz4GlzU8_E/TiJdlhlKw0I/AAAAAAAAAf0/FxT_BcNYUI8/s320/eslite.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630165383417348930" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7/11 的 7Net 中的 &lt;a href="http://www.7net.com.tw/knowledge/knowledgeE1.html"&gt;退貨辦法&lt;/a&gt; 也說「以數位或電磁紀錄形式儲存或著作權相關之商品 ( 如CD、VCD、DVD、電腦軟體 ) 及耗材 ( 墨水匣、碳粉匣 ) 若已拆封，則無法接受退貨」。&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-aWZczcup_FU/TiKi3MZXGYI/AAAAAAAAAgE/XuZo_tCizOA/s1600/7_11.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 69px;" src="http://4.bp.blogspot.com/-aWZczcup_FU/TiKi3MZXGYI/AAAAAAAAAgE/XuZo_tCizOA/s320/7_11.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630241553270643074" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;再說一次，沒有那種拆封不准退的條款，好嗎！(前面註一已列有判例) 消保法第十九條說的是「郵購或訪問買賣之消費者，對所收受之商品不願買受時，得於收受商品後七日內，退回商品或以書面通知企業經營者解除買賣契約，&lt;b&gt;無須說明理由&lt;/b&gt;及負擔任何費用或價款」。7 日內，不管消費者有沒拆封，都一定要可以退錢。&lt;/p&gt;

&lt;p&gt;好了，我決定換個方式，列出有販售數位內容商品且確實符合消保法的乖寶寶。&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;很抱歉，我找了幾天，還是沒找到。(註二)&lt;/p&gt;

&lt;p&gt;如果你知道誰符合消保法的話，請告訴我，我會列在這，並幫他們大力宣傳，鼓勵大家多多向他們買 DVD、軟體，音樂 CD 等產品。不過，希望這些符合法律規定的商家，一定要撐下去，不管退貨有多少。因為你們是消保法的模範寶寶。&lt;/p&gt;

&lt;p&gt;大家都希望生活在一個法治而不是人治的社會，一個公平且合理的法律，我想大家都願意遵守。不過，&lt;b&gt;為什麼有這麼多的網購平台都不願(還是無能)遵守消保法的規定？主管機關得好好思考一下這個問題&lt;/b&gt;。只知一昧地執行過時法令，搞得大家不是陽奉陰違，就是走模糊政策 (乾脆不說有退貨這事，等有人問了，再說)，這些對消費者來說，更不是一件好事。&lt;/p&gt;

&lt;p&gt;對於平台業者來說，如果真的要讓數位內容商品也確實遵守消保法，我猜，他們的損失其實也不是太大。不過對於下游的內容提供業者，損失可就大了。內容提供業者無法受到合理的保護，消費者又怎能得利？&lt;/p&gt;

&lt;p&gt;我今天寫這篇文章，並不是要拖大家一起下水。重要的是，希望所有消費者、網購平台與軟體市集業者要重視這個問題，並團結起來，一起 &lt;a href="http://www.facebook.com/event.php?eid=256361641046257"&gt;連署要求行政院消保會修改現行消保法對數位內容產品的不適用性&lt;/a&gt; 。只有符合時宜的消保法，才能保障位在天平兩端的消費者與商家。大家阿Q式地放任惡法的執行，最終消費者、平台業者與下游內容提供商家，大家都是輸家。&lt;/p&gt;

&lt;p&gt;那誰是贏家？你、我心知肚明。&lt;/p&gt;

&lt;p&gt;註二：Groupon 賣的好康兌換券可無條件退錢。不過消費者拿到好康兌換券還是沒有看到最終商品，在這時候退錢，對大家都沒損失，這說得過去。如果用好康兌換券買到軟體後，還可以在 7 日內無條件退錢，那我就給你個消保法模範寶寶。&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-7302538622183222676?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/7302538622183222676/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/07/blog-post.html#comment-form' title='22 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7302538622183222676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7302538622183222676'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/07/blog-post.html' title='消保法的過時與不完整 - 北市府說 Apple, Yahoo, PCHome 都已遵守消保法，事實真的是如此嗎？'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-B2NCkqwRo_4/Tggz-lkHblI/AAAAAAAAAas/B_8_2t-uSmE/s72-c/RefundStamp.jpg' height='72' width='72'/><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1835501111729838731</id><published>2011-06-27T14:52:00.055+08:00</published><updated>2011-09-03T10:33:16.572+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>消保法的過時與不完整 - App七天內可退錢，那電子書，音樂，電影也都可以看完再退囉</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-B2NCkqwRo_4/Tggz-lkHblI/AAAAAAAAAas/B_8_2t-uSmE/s320/RefundStamp.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;最近熱門的手機應用相關新聞就是「&lt;a href="http://www.google.com/#sclient=psy&amp;hl=en&amp;authuser=0&amp;source=hp&amp;q=%E5%8F%B0%E5%8C%97+app+%E9%80%80%E8%B2%A8+7+%E5%A4%A9&amp;pbx=1&amp;oq=%E5%8F%B0%E5%8C%97+app+%E9%80%80%E8%B2%A8+7+%E5%A4%A9&amp;aq=f&amp;aqi=&amp;aql=undefined&amp;gs_sm=e&amp;gs_upl=1937l1937l2l1l2l0l0l0l0l0l0ll1&amp;bav=on.2,or.r_gc.r_pw.&amp;fp=dff9e71c446b502d&amp;biw=1151&amp;bih=609"&gt;台北市政府要求 Apple、Google 提供七天 App 免費下載鑑賞期！&lt;/a&gt;」。如果手機應用可以在 7 天內退錢，那在網路上買的電子書，是不是可以在 7 天內看完，然後退錢？線上購買的電影，也可以看完後再退錢嗎？透過手機付費下載的音樂，我只要在 7 天內自行燒成光碟，然後再退錢，不是也可以？手機上的圖鈴下載，也都可以在 7 天內無條件退錢嗎？這聽起來極度的不合理，不是嗎？&lt;/p&gt;&lt;p&gt;首先，我們先來看看台北市政府根據的是哪條法令。&lt;/p&gt;&lt;span class="fullpost"&gt; &lt;p&gt;目前台北市政府根據的法令，就是在民國 83 年頒行，94 年最後修改的「&lt;a href="http://www.cpc.gov.tw/knowledgebase_query/ShowCategoryTree_Query_390.asp?SpecialID=416"&gt;中華民國消費者保護法&lt;/a&gt;」中的 &lt;a href="http://www.cpc.gov.tw/knowledgebase_query/ShowFAQ.asp?ID=3944&amp;CID=416&amp;Reload=Reload"&gt;第十九條&lt;/a&gt;：「郵購或訪問買賣之消費者，對所收受之商品不願買受時，得於收受商品後七日內，退回商品或以書面通知企業經營者解除買賣契約，無須說明理由及負擔任何費用或價款。」。其中，郵購買賣定義在&lt;a href="http://www.cpc.gov.tw/knowledgebase_query/ShowFAQ.asp?ID=3943&amp;CID=416&amp;Reload=Reload"&gt;第二條&lt;/a&gt;：「郵購買賣：指企業經營者以廣播、電視、電話、傳真、型錄、報紙、雜誌、網際網路、傳單或其他類似之方法，使消費者未能檢視商品而與企業經營者所為之買賣。」。&lt;/p&gt;&lt;p&gt;簡單的說，&lt;b&gt;只要是你透過網路向商家購買的商品，都可以在 7 天內，"無須說明理由" 及 "負擔任何費用或價款"，直接向商家要求退錢&lt;/b&gt;。&lt;/p&gt;&lt;p&gt;所以，消費者可以購買來電鈴聲，下載到手機後，再去要求退款。買的電子書，也可以在 7 天內看完後，再去要求退錢。付費下載的音樂與電影，消費者也可以一樣畫葫蘆地玩。請問當初訂定消保法的官員與審訂的立法諸公，這樣的法令合理與公平嗎？&lt;b&gt;這樣的消保法，不是就變成變相合理盜版的保護傘嗎？&lt;/b&gt;&lt;/p&gt;&lt;p&gt;我想這消保法對於著作權數位內容商品的處理，應該是有修法的必要。目前各網路購物平台為了應付這消保法，在販賣軟體時，都會加上「如果您所購買的商品是電腦軟體、遊戲光碟、CD、VCD、DVD、食品、耗材、個人衛生用品等一經拆封即無法回復原狀的商品，在您還不確定是否要辦理退貨以前，請勿拆封。」。只要拆封包裝，就不能退錢了，連試用一下都不行。 (後註：這樣的規定依現行消保法也是明顯違法的，也就是說幾乎&lt;a href="http://ysl-paradise.blogspot.com/2011/07/blog-post.html"&gt;全台有賣影音或軟體的網購平台都違反消保法&lt;/a&gt;。)&lt;/p&gt;&lt;p&gt;消費者目前在各軟體市集中，決定要購買應用之前，他都會看到每個應用的產品說明，功能特色，甚至還有執行畫面的截圖。這些說明，和一般電腦軟體產品外包裝說明所揭露的資訊是相同的。那消費者在軟體市集中看完應用說明，決定下載時，是不是就等同他打算要拆封包裝？&lt;/p&gt;&lt;p&gt;消保法的立意良好，不過看完整個條文後，我覺得他&lt;b&gt;對「商品」這一詞，應該要再明確的定義。至少以我來看，這商品應該是不能涵蓋著作權相關的數位內容商品，像是軟體、電影、音樂、書籍之類的&lt;/b&gt;。或是要對這數位內容商品的處理，要有不同的配套處裡。&lt;/p&gt;&lt;p&gt;目前的手機應用，涵蓋各式各樣數位內容商品。有遊戲、電子書、桌面壁紙，及各類應用。對於如何保護消費者在購買這些數位內容商品的權益時，我覺得重要的是「&lt;b&gt;要有明確且順暢的退貨與申訴處理管道&lt;/b&gt;」。&lt;/p&gt;&lt;p&gt;看完應用的說明，決定下載應用後，應該就等同他已在實體店家中，觀看完商品，決定購買一樣，是不能夠再要求無條件退錢的，除非這個商品有瑕疵。所以在這些國內、外的軟體市集中，我覺得對消費者重要的是，當消費者發現商品有瑕疵時，是否可以在購買商品的訂單上，輕易地找到申訴或退貨的管道，並且用中文向商家發出申訴與退貨的請求。有些軟體市集壓根不提瑕疵商品退貨管道，或是要消費者找半天才找到不起眼的連結，或是要消費者打電話（我人在國外，誰付這越洋電話錢？），或是只接受英文申訴。我覺得，這些才是消保法為了保護消費者權益所應該要規範的。&lt;/p&gt;&lt;p&gt;在還未修法之前，由於數位內容商品的特殊性，我覺得行政院消保會官員應該站出來，解釋一下這消保法中的 7 日猶豫期機制，對於數位內容商品的適用性。&lt;b&gt;對於在軟體市集中購買付費應用，是否也應該像目前網路購物平台處理軟體、音樂商品一般，只要應用有提供說明，消費者按下購買鍵之後，就等同於他拆封包裝，是不能無條件退錢的。此外，再規範軟體市集商家，要明確地提供有中文服務的瑕疵商品申訴與退貨的請求管道與處理期限。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;雖然我是個應用的開發者，不過多數時間我還是以消費者的身分存在。一個與國際接軌的合適法令與明確的處理方式，才能讓消費者與商家都達到雙贏的目標。如果因為這消保法猶豫期的規定，而引起開發商對於台灣保護著作權的疑慮，因而放棄在台灣銷售商品，我想這對消費者與商家而言，都不是一個樂於見到的狀況。&lt;/p&gt;&lt;p&gt;參考資料: &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cpc.gov.tw/detail.asp?id=573"&gt;消保法條文修正草案&lt;/a&gt; 中，已明確增列第十九條七天猶豫期的排除項目，其中的排除項目有小額交易物品、報紙、期刊、雜誌和業經消費者啟封之影音產品或電腦軟體。草案中已表明現行消保法明顯不符合現行消費環境，且已於民國 96 年 1 月提出來了，怎麼現在還沒通過，現在是誰的問題，答案應該很清楚了。草案雖然還未過關，不過從這草案中，知道官員們也知道現行國際的遊戲規則。為何北市府的消保官，非得從嚴執行這過時的第十九條呢？&lt;/li&gt;
&lt;li&gt;在 &lt;a href="http://www.cpc.gov.tw/KnowledgeBase_Query/ShowFAQ.asp?ID=4384"&gt;提供消費者付費下載數位軟體產品之交易是否屬於消保法&lt;/a&gt; 這個函中，說明 &lt;b&gt;若企業經營者提供網路交易時，以合理方式使消費者有機會於適當時間內得以檢視該等數位化商品者，才可認為其交易非屬本法所稱之郵購買賣&lt;/b&gt;。就像我說的，軟體市集中已提供應用的說明與執行畫面截圖，Android Market 甚至提供 15 分鐘的試用期，這是否符合該函中所敘述的條件？我想行政院消保會還是要有官員跳出來說明才行。延伸參考：&lt;a href="http://gcis.nat.gov.tw/eclaw/tjk/chinese/tjk_tw_HotNewsView.asp?sno=OP]PkW"&gt;電子商務與消保法法定契約解除期限之適用 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.copyrightnote.org/crnote/bbs.php?board=3&amp;act=read&amp;id=1202"&gt;著作權商品若有「七日鑑賞期」豈是公平？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://back.cpc.gov.tw/KMOuterPath/6310/%E7%B6%B2%E8%B7%AF%E4%BA%A4%E6%98%93%E9%81%A9%E7%94%A8%E6%B6%88%E4%BF%9D%E6%B3%95%E9%83%B5%E8%B3%BC%E8%B2%B7%E8%B3%A3%E8%A6%8F%E7%AF%84%E4%B9%8B%E6%8E%A2%E8%A8%8E.pdf"&gt;網路交易適用消保法郵購買賣規範之探討&lt;/a&gt; - 行政院消保員消保官/李英正&lt;/li&gt;
&lt;!--
&lt;li&gt;&lt;a href="https://back.cpc.gov.tw/KMOuterPath//6569/%E7%94%B1%E6%B6%88%E4%BF%9D%E6%B3%95%E8%A7%80%E9%BB%9E%E8%AB%96%E7%B6%B2%E8%B7%AF%E4%BA%A4%E6%98%93%E5%A5%91%E7%B4%84%E7%9B%B8%E9%97%9C%E5%95%8F%E9%A1%8C-%E6%9D%8E%E8%8B%B1%E6%AD%A3.pdf"&gt;由消保法觀點論網路交易契約相關&lt;/a&gt;&lt;/li&gt;
--&gt; &lt;/ul&gt;&lt;/p&gt;&lt;p&gt;事件發展: &lt;ul&gt;&lt;li&gt;2011/9/初: 等待消息...&lt;/li&gt;
&lt;li&gt;2011/8/22: &lt;a href="http://www.libertytimes.com.tw/2011/new/aug/24/today-taipei9.htm"&gt;北市府說Google沒具體回應，正式協商再延到9月初&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/8/5: &lt;a href="http://news.chinatimes.com/domestic/130506/132011080501289.html"&gt;北市Google四度協商沒結論 8/22 再議&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/8/3: &lt;a href="http://www.taipei.gov.tw/ct.asp?xItem=2685243&amp;ctNode=5158&amp;mp=100001"&gt;北市政府法規會新聞稿: 北市府與Google第三度討論 8/5找更多業者續談&lt;/a&gt;。真是的消保官還在硬ㄠ，這篇 &lt;a href="http://blog.epromotor.info/?p=1716"&gt;北市府的謊言：數位產品在歐盟新實施的14天無條件退款規範真相&lt;/a&gt; 馬上又打了消保官一巴掌。&lt;/li&gt;
&lt;li&gt;2011/7/29: &lt;a href="http://www2.cna.com.tw/ShowNews/WebNews_Detail.aspx?Type=FirstNews&amp;ID=201107290030"&gt;7天鑑賞僵局 谷歌要求延至8/3協商&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/7/20: &lt;a href="http://www.libertytimes.com.tw/2011/new/jul/20/today-life11.htm"&gt;行政院消保會出來打北市府的臉，說北市的說法「言重了」&lt;/a&gt; 消保會怎現在才出來，隔山觀虎鬥，對你這主管機關有何好處？&lt;/li&gt;
&lt;li&gt;2011/7/19: &lt;a href="http://www.dpublishing.org.tw/2011/07/19.html"&gt;四大公協會終於站出來建議修改過時的消保法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/7/15: &lt;a href="http://www.ssdo.taipei.gov.tw/ct.asp?xItem=2110857&amp;ctNode=27993&amp;mp=124011"&gt;Google不願修改定型化條款 北市府：持續溝通 再給兩週&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/7/15: &lt;a href="http://www.apple.com/legal/itunes/appstore/tw/terms.html"&gt;蘋果已更改退費機制&lt;/a&gt; (Apple 真的全都改了嗎？好像不是這樣，請看 &lt;a href="http://ysl-paradise.blogspot.com/2011/07/blog-post.html"&gt;北市府說 Apple, Yahoo, PCHome 都已遵守消保法，事實真的是如此嗎？&lt;/a&gt;)，&lt;a href="http://www.techbang.com.tw/posts/6430-north-city-cut-penalty-incident-google-legal-interpretation-in-doubt"&gt;Google繼續停售付費APP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/30: &lt;a href="http://tcgwww.taipei.gov.tw/ct.asp?xItem=2054151&amp;ctNode=5158&amp;mp=100001"&gt;Google與北市府會談 將回美國研究是否修正Android Market契約&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/27: &lt;a href="http://tcgwww.taipei.gov.tw/ct.asp?xItem=2041592&amp;ctNode=5158&amp;mp=100001"&gt;Google停售付費APP 拒絕遵循臺灣法律 臺北市重罰一百萬&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/26: &lt;a href="http://www.techbang.com.tw/posts/6230-android-market-to-suspend-payment-of-taiwan-application-services"&gt;Google Android Market 在台灣暫停付費應用程式服務。也就是台灣消費者不能買應用了。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/24: &lt;a href="http://www.ithome.com.tw/itadm/article.php?c=68348"&gt;蘋果承諾App Store將提供7天試用退費機制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/22: &lt;a href="http://udn.com/NEWS/LIFE/LIF1/6413793.shtml#ixzz1QXKTwqAP"&gt;蘋果明未提追蹤器下架退款機制 罰150萬&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/17: &lt;a href="http://tcgwww.taipei.gov.tw/ct.asp?xItem=2009658&amp;ctNode=5158&amp;mp=100001"&gt;蘋果將「超級手機號碼追蹤器」下架 北市府：消費者的勝利&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/4: &lt;a href="http://mag.udn.com/mag/digital/storypage.jsp?f_MAIN_ID=322&amp;f_SUB_ID=2949&amp;f_ART_ID=322857"&gt;北市府要求 Apple Store 及 Android Market 建立退費機制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2011/6/3: &lt;a href="http://sports.chinatimes.com/tech/12050905/112011060300248.html"&gt;手機號碼追蹤器 是空包彈？市議員應曉薇代民向北市府申訴&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;相關文章: &lt;ul&gt;&lt;li&gt;&lt;a href="http://ysl-paradise.blogspot.com/2011/07/blog-post.html"&gt;北市府說 apple, yahoo, pchome 都確實遵守消保法，事實真的是如此嗎？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://web.cool3c.com/node/47999"&gt;Google和台北市政府的鬥爭：傷的是願意付費的消費者和願意出力的開發者&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mag.udn.com/mag/digital/storypage.jsp?f_MAIN_ID=320&amp;f_SUB_ID=2943&amp;f_ART_ID=327132"&gt;問題在哪？ 看蘋果、Google付費退費模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiselysong.blogspot.com/2011/06/2011-06-27-googleandroid-market.html"&gt;偉栽台北市政府幹掉了Google台灣的Android Market付費區&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://playpcesor.blogspot.com/2011/06/google.html?showComment=1309183045489#c595481619527976849"&gt;Google下架軟體、北市罰重金對槓，誰來回應消費者與開發者？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.gasolin.idv.tw/2011/06/googleandroid-marketapp.html"&gt;對Google關掉台灣Android Market付費App下載的觀察&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.yam.com/philipy/article/39261422"&gt;葉狀師闖天關-從處罰Google一百萬談起&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mag.udn.com/mag/digital/storypage.jsp?f_MAIN_ID=315&amp;f_SUB_ID=3764&amp;f_ART_ID=327235"&gt;Google有權拒絕提供七日鑑賞期&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yveslin0816.blogspot.com/2011/06/android-market-app-19.html"&gt;Android Market 付費 APP 適用消費者保護法第19條之困境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=RZBc-bLfW1s"&gt;邪惡市長開罰 Google一百萬！&lt;/a&gt; - YouTube 純粹搏君一笑&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=tw.takol.android.protesttaipeibovmeddleandroidmarket"&gt;抗議臺北市政府干預Android市場&lt;/a&gt;-聯署抗議的 Android app 都出來了&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1835501111729838731?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1835501111729838731/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/06/app.html#comment-form' title='62 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1835501111729838731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1835501111729838731'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/06/app.html' title='消保法的過時與不完整 - App七天內可退錢，那電子書，音樂，電影也都可以看完再退囉'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-B2NCkqwRo_4/Tggz-lkHblI/AAAAAAAAAas/B_8_2t-uSmE/s72-c/RefundStamp.jpg' height='72' width='72'/><thr:total>62</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5310314228215144938</id><published>2011-06-13T10:00:00.001+08:00</published><updated>2011-06-13T13:54:07.366+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>行動終端應用技術與趨勢研討會 演講</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-IX6cXRxLusQ/TfEFE8rlqPI/AAAAAAAAAak/333u7vSg2bo/201107.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這個活動是由國立台北科技大學主辦。活動主題為「&lt;a href="http://lrs.itsa.org.tw/calendar/view.php?view=day&amp;course=200&amp;cal_d=8&amp;cal_m=7&amp;cal_y=2011"&gt;行動終端應用技術與趨勢研討會&lt;/a&gt;」。&lt;/p&gt;

&lt;p&gt;這次研討會的時間是 2011/7/8 8:40pm-4:40pm，地點在台北科技大學科技大樓共同科館地下1樓演講廳，研討會網頁在 &lt;a href="http://lrs.itsa.org.tw/calendar/view.php?view=day&amp;course=200&amp;cal_d=8&amp;cal_m=7&amp;cal_y=2011"&gt;這&lt;/a&gt;。這個研討會是免費參加的，不過名額只限 150 名。要報名的，請點 &lt;a href="https://spreadsheets.google.com/viewform?hl=zh_TW&amp;formkey=dDRrOXJhanFQOThOM2QzWGF2a0tRa1E6MQ#gid=0"&gt;報名網頁&lt;/a&gt;。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這次我演講的題目是「發現熱門手機應用的秘密」。這次演講的內容和之前在 &lt;a href="http://ysl-paradise.blogspot.com/2011/05/android.html"&gt;Android 應用盈利模式及成功案例&lt;/a&gt; 中的內容差不多相同。不過上次的演講只有 20 分鐘，還有很多部分限於時間的因素，沒法講清楚。希望在這次一小時的演講中，能讓想掌握應用開發契機的朋友，能更清楚我所想要傳達的想法。&lt;/p&gt;

&lt;p&gt;在這次的演講中，主要和大家分享如何在手機應用開發中，掌握獲利的機會。我希望透過我自身的經驗分享，能鼓勵更多的優秀開發者，在手機應用新經濟潮流中，寫出更多好用的應用，也同時邁向你財務獨立的目標。我相信台灣優秀的軟體開發者，絕對不甘於寫驅動程式，或是沒日沒夜地幫案主接專案。我衷心的希望，透過大家所開發的應用，能讓全世界對台灣的軟體開發能力，有寡目相看的一天。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5310314228215144938?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5310314228215144938/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/06/blog-post.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5310314228215144938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5310314228215144938'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/06/blog-post.html' title='行動終端應用技術與趨勢研討會 演講'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-IX6cXRxLusQ/TfEFE8rlqPI/AAAAAAAAAak/333u7vSg2bo/s72-c/201107.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4329522005658776552</id><published>2011-05-31T09:00:00.000+08:00</published><updated>2011-05-31T09:00:02.330+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ListView'/><category scheme='http://www.blogger.com/atom/ns#' term='BaseAdapter'/><title type='text'>使用 ListView 元件時該注意的技巧 - II</title><content type='html'>&lt;p&gt;The tricks when using ListViews - II&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/-wtBYJw_SzRw/TbKF8b5ZyZI/AAAAAAAAAUg/oxnyvxtH0WQ/tricks.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在 &lt;a href="http://ysl-paradise.blogspot.com/2011/04/listview-i.html"&gt;使用 ListView 元件時該注意的技巧 - I&lt;/a&gt; 中，我們了解到 ListView 常用的技巧。在這一篇中，我們來看看當使用 ListView 時，可能犯的錯誤有哪些。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;首先，如果你有寫自己的 ListAdapter，有些人會不曉得在 getView() 中，如何處理傳入的 convertView。&lt;/p&gt;
&lt;p&gt;正確的處理方法，應該像底下範例一樣。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//refer to http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html
public View getView(int position, View convertView, ViewGroup parent) {
  SpeechView sv;
  if (convertView == null) {
    sv = new SpeechView(mContext, Shakespeare.TITLES[position],
            Shakespeare.DIALOGUE[position]);
  } else {
    sv = (SpeechView) convertView;
    sv.setTitle(Shakespeare.TITLES[position]);
    sv.setDialogue(Shakespeare.DIALOGUE[position]);
  }
  return sv;
}
&lt;/textarea&gt;

&lt;p&gt;如果你不判斷 "if (convertView == null)"，每次都呼叫 "sv = new SpeechView(...)"，程式當然也會動，不過就會讓 Dalvik 每隔一陣子就瞎忙一通，回收不用的 View objects。這樣的結果，當然也會在使用者捲動時，造成不順的感覺。&lt;/p&gt;

&lt;p&gt;第二個最常犯的錯誤就是下面這個例子。&lt;/p&gt;
&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
&lt;ListView android:id="@android:id/list"
  android:layout_width="match_parent" 
  android:layout_height="wrap_content"
  android:layout_weight="1" /&gt;
&lt;/textarea&gt;

&lt;p&gt;你看出問題在哪了嗎？如果你不知道答案的話，我建議你在自己的 ListAdapter 中的每個函數，都加個 Log.d() 追蹤一下這些函數的執行順序與次數。底下是我某個應用中，所印出來的結果。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
getCount()
getCount()
getCount()
getCount()
getView(): nPos=0, vConvert is null
getView(): nPos=1, vConvert is not null
getView(): nPos=2, vConvert is not null
getView(): nPos=3, vConvert is not null
getView(): nPos=4, vConvert is not null
getView(): nPos=5, vConvert is not null
getView(): nPos=6, vConvert is not null
getView(): nPos=7, vConvert is not null
getCount()
getCount()
getView(): nPos=0, vConvert is not null
getView(): nPos=1, vConvert is null
getView(): nPos=2, vConvert is null
getView(): nPos=3, vConvert is null
getView(): nPos=4, vConvert is null
getView(): nPos=5, vConvert is null
getView(): nPos=6, vConvert is null
getCount()
getCount()
getView(): nPos=0, vConvert is null
getView(): nPos=1, vConvert is not null
getView(): nPos=2, vConvert is not null
getView(): nPos=3, vConvert is not null
getView(): nPos=4, vConvert is not null
getView(): nPos=5, vConvert is not null
getView(): nPos=6, vConvert is not null
getView(): nPos=7, vConvert is not null
getCount()
getCount()
getCount()
getCount()
getView(): nPos=0, vConvert is not null
getView(): nPos=1, vConvert is not null
getView(): nPos=2, vConvert is not null
getView(): nPos=3, vConvert is not null
getView(): nPos=4, vConvert is not null
getView(): nPos=5, vConvert is not null
getView(): nPos=6, vConvert is not null
getView(): nPos=7, vConvert is not null
getCount()
getCount()
&lt;/textarea&gt;

&lt;p&gt;整個畫面上，只顯示 7 個項目。怎麼 getView() 被呼叫了那麼多次？&lt;/p&gt;

&lt;p&gt;這原因就出在 android:layout_height="wrap_content" 這行描述上。如果將這行改成 android:layout_height="0dip"，結果就像下面這樣，getView() 的呼叫次數，完全符合原先的預期。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
getCount()
getCount()
getCount()
getCount()
getCount()
getView(): nPos=0, vConvert is null
getView(): nPos=1, vConvert is null
getView(): nPos=2, vConvert is null
getView(): nPos=3, vConvert is null
getView(): nPos=4, vConvert is null
getView(): nPos=5, vConvert is null
getView(): nPos=6, vConvert is null
getCount()
getCount()
getCount()
getCount()
&lt;/textarea&gt;

&lt;p&gt;從這個結果中，我們也看到 getCount() 會被呼叫好幾次。在追蹤過原始碼後，我發現原始碼中並沒有存下 getCount() 的傳回結果。因此這 getCount() 會被呼叫這麼多次，並不是我們的問題。那我們唯一能做的事，就是讓 getCount() 執行的速度越快越好。&lt;/p&gt;

&lt;p&gt;如果你有在 ListView 中，套用自己的 ListAdapter。我都會建議你在自己的 ListAdapter 中的每個函數，都加個 Log.d() 追蹤一下這些函數的執行順序與次數，是否都符合你的預期。很簡單的動作，但常會幫你找到不少的問題，分享給你。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4329522005658776552?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4329522005658776552/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/listview-ii.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4329522005658776552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4329522005658776552'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/listview-ii.html' title='使用 ListView 元件時該注意的技巧 - II'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wtBYJw_SzRw/TbKF8b5ZyZI/AAAAAAAAAUg/oxnyvxtH0WQ/s72-c/tricks.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6735862633594872490</id><published>2011-05-23T21:13:00.004+08:00</published><updated>2011-05-23T21:42:19.254+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>Android 應用盈利模式及成功案例 演講</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/-R_L5uM7mLJo/Tdpdj_pJLbI/AAAAAAAAAaQ/0duB_-6v1i0/mobileappads.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這個活動是由 Google 商業合作部主辦，Taipei GTUG 承辦。活動主題為「Android應用盈利模式及成功案例」。&lt;/p&gt;

&lt;p&gt;這次活動的時間是 2011/6/2 7pm-9:30pm，地點在台大進修推廣部 204 教室，活動及報名網頁在 &lt;a href="https://sites.google.com/a/taipei-gtug.org/www/events/mobile-ad-practice-2011"&gt;這&lt;/a&gt;。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這個活動是由 Google 商業合作部主辦，Taipei GTUG 承辦。活動主題為「Android應用盈利模式即成功案例」。在 2 個多小時的活動中，有 Google 講者分享的如何運用 Admob 等廣告服務盈利，與實際的成功案例。接下來是我第一次要和台灣開發者分享如何透過手機小應用，輕鬆賺大錢的心得。最後，還找知名行動應用創投 APPWorks 來分享創投眼中的行動應用程式商機。&lt;/p&gt;

&lt;p&gt;在我這次的演講中，會和大家分享如何在手機應用開發中，掌握賺錢的機會。我希望透過我自身的經驗分享，能鼓勵更多的優秀開發者，在手機應用新經濟潮流中，寫出更多好用的應用，也同時邁向你財務獨立的目標。我相信台灣優秀的軟體開發者，絕對不甘於寫驅動程式，或是沒日沒夜地幫案主接專案。我衷心的希望，透過大家所開發的應用，能讓全世界對台灣的軟體開發能力，有寡目相看的一天。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6735862633594872490?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6735862633594872490/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/android.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6735862633594872490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6735862633594872490'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/android.html' title='Android 應用盈利模式及成功案例 演講'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-R_L5uM7mLJo/Tdpdj_pJLbI/AAAAAAAAAaQ/0duB_-6v1i0/s72-c/mobileappads.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1501049865165075959</id><published>2011-05-23T20:58:00.004+08:00</published><updated>2011-05-29T10:39:41.360+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='honeycomb'/><title type='text'>非手機Android論壇 - x86+平板+Android 3.0 演講</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-Vdxac3Ae3gY/Tdpa8ZbKtMI/AAAAAAAAAaI/tnq9TKZQhBQ/honeycomb.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這次的活動，主要談的是和 Android 相關，但又非關於 Android 手機的話題。非關於 Android 手機，那今年最夯的平板當然是會包含在內的。&lt;/p&gt;

&lt;p&gt;這次的活動的時間是 2011/5/28 1:30pm-5:30pm，地點在台北市中山區民生東路二段161號11樓，活動的網頁在 &lt;a href="http://android.cool3c.com/article/45997"&gt;這&lt;/a&gt;。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;據說這次的活動，從開放報名開始，不到一天的時間，就額滿了。竟然和 Google I/O 一樣的熱門，然不成這活動也有送平板？開玩笑的，千萬別當真。台灣辦活動的主辦者都很辛苦，雖然沒有有錢的贊助單位，可用的經費也不多，可是辦活動的人，都是有心人，都是想促進大家多在 Android 方面交流的人。有報到名的千萬一定要來；沒報到名的，我猜當天到現場，只要有空位，主辦單位應該也會讓你進來的。&lt;/p&gt;

&lt;p&gt;在這次活動中，我演講的題目是「Android 平板應用開發經驗分享」。這演講內容和我在 &lt;a href="http://ysl-paradise.blogspot.com/2011/04/s-club.html"&gt;四月時 S Club&lt;/a&gt; 中所講的是相同的。如果你上次已經聽過的話，這次就多包涵了。&lt;/p&gt;

&lt;p&gt;又忘了要照相，只好借用癮科技的照片。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-LfVjxY5KyW8/TeGxEYt-1gI/AAAAAAAAAaY/ZwTooaJaRHo/s1600/sam.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 281px;" src="http://3.bp.blogspot.com/-LfVjxY5KyW8/TeGxEYt-1gI/AAAAAAAAAaY/ZwTooaJaRHo/s320/sam.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5611961299593254402" /&gt;&lt;/a&gt;

&lt;p&gt;想要知道在這次活動中，各位講者和大家分享的內容，就請點選 &lt;a href="http://chinese.engadget.com/2011/05/28/x-android-android/"&gt;癮科技 x 台灣 Android 中文資源站之第一場非手機 Android 聚會紀錄&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;關於我投影片的內容，就請您點 &lt;a href="http://ysl-paradise.blogspot.com/2011/04/s-club.html"&gt;Android 平板應用開發經驗分享 - 遠傳 S Club 演講&lt;/a&gt;。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1501049865165075959?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1501049865165075959/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/android-x86android-30.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1501049865165075959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1501049865165075959'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/android-x86android-30.html' title='非手機Android論壇 - x86+平板+Android 3.0 演講'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Vdxac3Ae3gY/Tdpa8ZbKtMI/AAAAAAAAAaI/tnq9TKZQhBQ/s72-c/honeycomb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5074537855746622707</id><published>2011-05-10T04:33:00.023+08:00</published><updated>2011-05-16T11:55:24.380+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='googleio'/><title type='text'>2011 Google I/O 見聞</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/-exlFlbx5V9E/TchYqfOadgI/AAAAAAAAAWA/lRLPW8ky1Rc/googleio2011.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;為了今年的 Google I/O sandbox developer demo，我們在大會的前兩天就來到舊金山。這幾天都會住在 Marriott San Francisco。大會前一天的早上，旅館來 check-in 的人明顯多了起來，應該都是來參加 Google I/O 的。&lt;/p&gt;

&lt;p&gt;我有空就多拍些 I/O 的照片，在這分享給大家&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;大會的前一天開始開放註冊，一入 Moscone center west，就看到 I/O 的註冊大廳。提前來註冊的人還不多，我想明天這裡一定是人山人海。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-RBqqnJnhqE4/TchQxKN6twI/AAAAAAAAAVg/PA-PzR94MPo/s1600/IMG_20110509_131630.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-RBqqnJnhqE4/TchQxKN6twI/AAAAAAAAAVg/PA-PzR94MPo/s320/IMG_20110509_131630.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818541749122818" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;這是給非一般身分參觀者註冊的地方，像是媒體，演講者，學生等等。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-dtQbsvcEJbA/TchQ0ndZ_YI/AAAAAAAAAVo/yAtARpeVo7g/s1600/IMG_20110509_131618.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-dtQbsvcEJbA/TchQ0ndZ_YI/AAAAAAAAAVo/yAtARpeVo7g/s320/IMG_20110509_131618.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818601138322818" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;Sandbox developer partners 就在這裡註冊。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-XzzHtLrxZFQ/TchQ4iZFRWI/AAAAAAAAAVw/zTkSebpZYcY/s1600/IMG_20110509_131551.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-XzzHtLrxZFQ/TchQ4iZFRWI/AAAAAAAAAVw/zTkSebpZYcY/s320/IMG_20110509_131551.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818668497487202" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;一般身分參觀者，都是要透過這台 chrome 筆電 (cr-48?) 註冊。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-b70AXg6HR5A/TchQqcpTWvI/AAAAAAAAAVY/raOnqa12ND4/s1600/IMG_20110509_132143.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-b70AXg6HR5A/TchQqcpTWvI/AAAAAAAAAVY/raOnqa12ND4/s320/IMG_20110509_132143.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818426436737778" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;註冊後，可以到這領贈品。綠色 Android 玩偶是送給連續參加 I/O 多次的人。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-IzOMZVtkJ9U/TchQ7poToQI/AAAAAAAAAV4/hF_jzmdOyM8/s1600/IMG_20110509_131521.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-IzOMZVtkJ9U/TchQ7poToQI/AAAAAAAAAV4/hF_jzmdOyM8/s320/IMG_20110509_131521.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818721979998466" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;其他人就只能領到一件 T-shirt。今年 I/O 的大禮到底是甚麼呢？應該要等到明天的 keynote 才會謎題揭曉，我猜應該是 Xoom 平板加 Nexus S 手機。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-U3UbMzTZHAQ/TchQnCWV0eI/AAAAAAAAAVQ/dfLHyTCA3NQ/s1600/IMG_20110509_132950.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-U3UbMzTZHAQ/TchQnCWV0eI/AAAAAAAAAVQ/dfLHyTCA3NQ/s320/IMG_20110509_132950.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818367838278114" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;這是我的 badge。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-b-Jogwz9Tno/TchQjGkE2mI/AAAAAAAAAVI/3yQWqbH8Syo/s1600/IMG_20110509_133012.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://3.bp.blogspot.com/-b-Jogwz9Tno/TchQjGkE2mI/AAAAAAAAAVI/3yQWqbH8Syo/s320/IMG_20110509_133012.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818300250151522" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;badge 後面，都有個 NFC tag。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-QrUgc43vDFg/TchQdjdD9jI/AAAAAAAAAVA/hJJOL4E-Kig/s1600/IMG_20110509_133018.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-QrUgc43vDFg/TchQdjdD9jI/AAAAAAAAAVA/hJJOL4E-Kig/s320/IMG_20110509_133018.jpg" alt="" id="BLOGGER_PHOTO_ID_5604818204926146098" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;Android(手機) 遙控 Android (機器人)&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-oVTI-9b7d1c/TcjBZQoEHrI/AAAAAAAAAWo/ckUmJPZm878/s1600/IMG_20110509_160152.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-oVTI-9b7d1c/TcjBZQoEHrI/AAAAAAAAAWo/ckUmJPZm878/s320/IMG_20110509_160152.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604942375966482098" /&gt;&lt;/a&gt;

&lt;p&gt;這次有三層樓，Android Sandbox developer 在三樓。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-oK1tP2EZcPc/TcjBAeEsQ1I/AAAAAAAAAWY/ujrHScZEKFE/s1600/IMG_20110509_170610.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-oK1tP2EZcPc/TcjBAeEsQ1I/AAAAAAAAAWY/ujrHScZEKFE/s320/IMG_20110509_170610.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604941950079484754" /&gt;&lt;/a&gt;

&lt;p&gt;Android Sandbox 的樓層一眼望去，到處都是 Android 和綠色的機器人。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-TCMzQTGDpVY/TcjBoKlPF1I/AAAAAAAAAWw/yRyRqMZGPVQ/s1600/IMG_20110509_160410.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-TCMzQTGDpVY/TcjBoKlPF1I/AAAAAAAAAWw/yRyRqMZGPVQ/s320/IMG_20110509_160410.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604942632042043218" /&gt;&lt;/a&gt;

&lt;p&gt;連手機充電器都是 Android 機器人。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-iETgKqJGuaI/TcjDcULQyLI/AAAAAAAAAXA/JmTtmLTTf44/s1600/IMG_20110509_170505.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-iETgKqJGuaI/TcjDcULQyLI/AAAAAAAAAXA/JmTtmLTTf44/s320/IMG_20110509_170505.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604944627482282162" /&gt;&lt;/a&gt;

&lt;p&gt;Sony 的 Google TV&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-6ZoLmlgWkA0/TcjBP2M4A9I/AAAAAAAAAWg/Chs0HEJMZhs/s1600/IMG_20110509_170434.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-6ZoLmlgWkA0/TcjBP2M4A9I/AAAAAAAAAWg/Chs0HEJMZhs/s320/IMG_20110509_170434.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604942214254298066" /&gt;&lt;/a&gt;

&lt;p&gt;這就是我的攤位啦！一般攤位叫 booth，這個這麼小的攤位，只能叫 pod。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-vCIAOMOQgjs/TcjAsD4NUoI/AAAAAAAAAWQ/qj0KGWVTBkM/s1600/IMG_20110509_210019.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-vCIAOMOQgjs/TcjAsD4NUoI/AAAAAAAAAWQ/qj0KGWVTBkM/s320/IMG_20110509_210019.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604941599450419842" /&gt;&lt;/a&gt;

&lt;p&gt;7 點就來吃早餐的人也是滿滿的。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-KiNdxH20rGM/TcoM4n20NQI/AAAAAAAAAYQ/rk2CSd3t9HE/s1600/IMG_20110510_074050.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-KiNdxH20rGM/TcoM4n20NQI/AAAAAAAAAYQ/rk2CSd3t9HE/s320/IMG_20110510_074050.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605306853127107842" /&gt;&lt;/a&gt;

&lt;p&gt;正在等待進入大會議事聽第一天的 keynotes。照慣例，會尾會宣布這次 Google I/O 要送的大禮。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-P2wFWgYX8VI/TcoNBQBJgVI/AAAAAAAAAYY/prXU1CIVrp0/s1600/IMG_20110510_082505.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-P2wFWgYX8VI/TcoNBQBJgVI/AAAAAAAAAYY/prXU1CIVrp0/s320/IMG_20110510_082505.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605307001346818386" /&gt;&lt;/a&gt;

&lt;p&gt;關於 keynotes 內容，就不勞我多說，癮科技的 &lt;a href="http://chinese.engadget.com/2011/05/10/live-from-google-i-o-2011s-opening-keynote/"&gt;Google I/O 2011發表會重點總整理&lt;/a&gt; 寫得很詳盡。&lt;/p&gt;

&lt;p&gt;這都是 Andorid Sandbox developer 的 pods&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-wtNzdYPxctw/TcoKfESPUyI/AAAAAAAAAYA/sEa-gpr_Grs/s1600/IMG_20110510_110803.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-wtNzdYPxctw/TcoKfESPUyI/AAAAAAAAAYA/sEa-gpr_Grs/s320/IMG_20110510_110803.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605304215058469666" /&gt;&lt;/a&gt;

&lt;p&gt;這是我的攤位。正在 demo 的人，就在美國的合作夥伴。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-iC4dw9HQPe4/TcoKacaaxzI/AAAAAAAAAX4/J1Tk_sghCXA/s1600/IMG_20110510_110955.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-iC4dw9HQPe4/TcoKacaaxzI/AAAAAAAAAX4/J1Tk_sghCXA/s320/IMG_20110510_110955.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605304135635879730" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-miCVcT7APFs/TcoKR9vJTAI/AAAAAAAAAXw/9oI_vR6aeIE/s1600/IMG_20110510_135751.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-miCVcT7APFs/TcoKR9vJTAI/AAAAAAAAAXw/9oI_vR6aeIE/s320/IMG_20110510_135751.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605303989962361858" /&gt;&lt;/a&gt;

&lt;p&gt;我們輪流看攤位。不過還是沒時間去聽 sessions，我就錯過拿 ADK 的機會。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-cb14sPP0Rmk/TdCfyqy20GI/AAAAAAAAAaA/h9TstxPdyvA/s1600/IMG_0510.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/-cb14sPP0Rmk/TdCfyqy20GI/AAAAAAAAAaA/h9TstxPdyvA/s320/IMG_0510.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5607157228906139746" /&gt;&lt;/a&gt;

&lt;p&gt;每到整點，我就和參觀者玩，看國旗猜國名與匯率代號的遊戲。第一個猜到的，有送  Android 機器人公仔 (當然是自己掏腰包買的)。看到沒，這題是台灣的國旗，大家不是用網路就是用 Goggle 在查。希望透過這個小遊戲，能讓國外的使用者更認識台灣。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-HO2n2L4uByk/TcoKnuKKXXI/AAAAAAAAAYI/REZk5cqtDWE/s1600/IMG_20110510_170208.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-HO2n2L4uByk/TcoKnuKKXXI/AAAAAAAAAYI/REZk5cqtDWE/s320/IMG_20110510_170208.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605304363737832818" /&gt;&lt;/a&gt;

&lt;p&gt;超大型的 Nexus S 手機，這是觸控螢幕的，幾乎包含真手機的所有功能，除了不能打電話之外。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-jAhc0vW7AH8/TcoJyCd4U_I/AAAAAAAAAXo/zBN3yw5BfW0/s1600/IMG_20110510_165758.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://1.bp.blogspot.com/-jAhc0vW7AH8/TcoJyCd4U_I/AAAAAAAAAXo/zBN3yw5BfW0/s320/IMG_20110510_165758.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605303441476310002" /&gt;&lt;/a&gt;

&lt;p&gt;有一區專門展所有的 Android 手機與平板，當然不包含山寨機。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-yTKh-p5OCTs/TcoJg4RNe7I/AAAAAAAAAXg/6Bg_IfAe8Fs/s1600/IMG_20110510_143552.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-yTKh-p5OCTs/TcoJg4RNe7I/AAAAAAAAAXg/6Bg_IfAe8Fs/s320/IMG_20110510_143552.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605303146681039794" /&gt;&lt;/a&gt;

&lt;p&gt;這就是今天送的 Galaxy Tab，右上角有 Google I/O 下面有註明限量版。這是一台 32G Wi-Fi only 的版本。奇怪，沒加送 Nexus S 手機？那 badge 內附的 NFC tag 到底誰會用。NFC 要能普及，首先得先要手機有 tag reader 才行啊。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-ALEiNZnQXZE/TcoIdxTaubI/AAAAAAAAAXI/gYnsksMrjBw/s1600/IMG_20110510_205122.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-ALEiNZnQXZE/TcoIdxTaubI/AAAAAAAAAXI/gYnsksMrjBw/s320/IMG_20110510_205122.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605301993760012722" /&gt;&lt;/a&gt;

&lt;p&gt;第一天晚，有  After Hours party，人還是很多。不外乎就是吃吃喝喝。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-iFplLHRPbks/TcoI4V7smZI/AAAAAAAAAXQ/lEc81uYXO3s/s1600/IMG_20110510_193700.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-iFplLHRPbks/TcoI4V7smZI/AAAAAAAAAXQ/lEc81uYXO3s/s320/IMG_20110510_193700.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605302450269231506" /&gt;&lt;/a&gt;

&lt;p&gt;這就是那台會自己駕駛的 Google 汽車。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-nqIZtCEl3qo/TcoJS0vcJYI/AAAAAAAAAXY/t2r9rxmcA-M/s1600/IMG_20110510_195458.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-nqIZtCEl3qo/TcoJS0vcJYI/AAAAAAAAAXY/t2r9rxmcA-M/s320/IMG_20110510_195458.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5605302905215919490" /&gt;&lt;/a&gt;

&lt;p&gt;第二天的 keynote 主要談的是 chrome。&lt;a href="http://chinese.engadget.com/2011/05/11/google-i-o-2011-round-2/"&gt;Google I/O 2011發表會 Round 2 重點總整理&lt;/a&gt; 這篇有第二天的 keynote 的整理。會後，有宣佈送 cchromebook 大禮，沒說是送 Samsung 還是 Acer 的。也不是當天給，說會後在 email 聯絡遞送日期。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-NrJKyBmj0X0/Tc8KOMrqB2I/AAAAAAAAAZQ/WmS3z1bHuCA/s1600/samsung-chrome-book.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 160px;" src="http://4.bp.blogspot.com/-NrJKyBmj0X0/Tc8KOMrqB2I/AAAAAAAAAZQ/WmS3z1bHuCA/s320/samsung-chrome-book.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5606711300138338146" /&gt;&lt;/a&gt;

&lt;p&gt;第一天送的是 wi-fi only 的平板，那怎麼能達到隨時上網的目的呢？所以第二天又加送一個 3G/4G hotspot 及一張 Verizon 的三個月免費 sim 卡。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-KorlM_0RyiY/Tc8KXi9N9hI/AAAAAAAAAZY/OUhD0f-6fqw/s1600/IMG_20110511_193848.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-KorlM_0RyiY/Tc8KXi9N9hI/AAAAAAAAAZY/OUhD0f-6fqw/s320/IMG_20110511_193848.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5606711460736398866" /&gt;&lt;/a&gt;

&lt;p&gt;這兩天下來，我們都累壞了。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-ajFX9WZ1TBE/Tc8KfaOYRpI/AAAAAAAAAZg/mSkp7b0fVWs/s1600/IMG_20110511_171235.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-ajFX9WZ1TBE/Tc8KfaOYRpI/AAAAAAAAAZg/mSkp7b0fVWs/s320/IMG_20110511_171235.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5606711595831412370" /&gt;&lt;/a&gt;

&lt;p&gt;最後，和攤位一起照張像。還有我和美國夥伴的唯一一張合照，也為這次 Google I/O 參展，畫下完美的句點。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-az7eFd-4GNI/Tc8KoCY_lsI/AAAAAAAAAZo/lYYHorlMlIM/s1600/IMG_20110511_170419.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-az7eFd-4GNI/Tc8KoCY_lsI/AAAAAAAAAZo/lYYHorlMlIM/s320/IMG_20110511_170419.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5606711744052303554" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-EOmHWgS73iw/Tc8Ku8fnaBI/AAAAAAAAAZw/oM3c0qintUg/s1600/IMG_20110511_170403.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-EOmHWgS73iw/Tc8Ku8fnaBI/AAAAAAAAAZw/oM3c0qintUg/s320/IMG_20110511_170403.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5606711862728550418" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-5Qx7PRuuVeY/Tc8K2idsYhI/AAAAAAAAAZ4/7UUI86JQ-80/s1600/IMG_20110511_173700.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-5Qx7PRuuVeY/Tc8K2idsYhI/AAAAAAAAAZ4/7UUI86JQ-80/s320/IMG_20110511_173700.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5606711993180119570" /&gt;&lt;/a&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5074537855746622707?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5074537855746622707/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/2011-google-io.html#comment-form' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5074537855746622707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5074537855746622707'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/2011-google-io.html' title='2011 Google I/O 見聞'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-exlFlbx5V9E/TchYqfOadgI/AAAAAAAAAWA/lRLPW8ky1Rc/s72-c/googleio2011.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-9008648768474003381</id><published>2011-05-03T14:40:00.001+08:00</published><updated>2011-05-03T14:49:16.986+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><title type='text'>2011 年的手機應用大賽</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-LRryWBJIHsY/Tb-grcH59wI/AAAAAAAAAUw/ewd_VezTPug/appnext.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;從 2009 年開始，手機應用大賽突然變得如顯學一般，各單位都想和他扯上關係。因此各式各樣的手機應用大賽，開始出現，而且獎金也都一個比一個多。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;今年，首先由數位時代主辦的「&lt;a href="http://www.bnext.com.tw/edm/2011appcontest/index.htm"&gt;AppNext 2011 應用程式創新大賽&lt;/a&gt;」拉開比賽的序幕。接下來，還有中華電信的「&lt;a href="http://telsoft.hinet.net/news.php"&gt;電信創新應用大賽&lt;/a&gt;」。我猜電腦公會的黃金企鵝獎、經濟部的 MobileHero 通訊大賽及遠傳的 S 市集星光大賞，今年應該也都不會缺席。&lt;/p&gt;

&lt;p&gt;這幾年真的是手機應用開發者的黃金時期，有這麼多比賽可以參加，而且參加的門檻也都很低，幾乎都不用報名費，只要你有應用就可以。&lt;/p&gt;

&lt;p&gt;請問，你準備好要參加了嗎！？&lt;/p&gt;

&lt;p&gt;看到這，你可能會說，不行，我的東西還沒做好，還不能見人。其實，我當過幾次評審，看到不少作品都遠低於水準。不少我認識的朋友，在 Market 上發佈的應用，都比這些參賽應用好很多。他們都可以來比了，你為什麼不行？所以，你根本不用擔心你的應用不好這事。從另一個方向想，如果你已經有現成的應用，反正你也不用花太多的錢，只要花點時間，填好主辦單位要的資料，就可以參加比賽了。如果得獎，對你而言一定是個很大的肯定。就算沒得獎，反正累得是評審大爺還有主辦單位們，你損失的也不多，履歷表上還可加上一筆，何樂而不為。&lt;/p&gt;

&lt;p&gt;這次數位時代辦的比賽，雖然總獎金(品)是目前各個比賽中最少的。不過一旦得名，透過數位時代雜誌的報導，所帶之而來的曝光率，應該是不錯的另類獎品。而且他們的比賽，要你填的資料也很少，不會花你太多無謂的時間在比賽上。如果你手上有不錯的應用，就趕緊準備好來參加比賽。尤其是新創公司，參加比賽，對你而言是最好的曝光機會。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-9008648768474003381?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/9008648768474003381/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/2011.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/9008648768474003381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/9008648768474003381'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/05/2011.html' title='2011 年的手機應用大賽'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LRryWBJIHsY/Tb-grcH59wI/AAAAAAAAAUw/ewd_VezTPug/s72-c/appnext.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5944030126292842872</id><published>2011-04-29T11:45:00.001+08:00</published><updated>2011-05-10T01:33:27.264+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='googleio'/><category scheme='http://www.blogger.com/atom/ns#' term='press'/><title type='text'>我們被選為 Google I/O 2011 Sandbox 開發夥伴</title><content type='html'>&lt;p&gt;We have been selected as a sandbox partner in Google I/O 2011&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/-dylvQbTWx1Y/TbaUCZE5M-I/AAAAAAAAAUo/23ImAwQcjzs/googleio.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;We (AZSoft Technology) are invited to be a Google I/O 2011 developer sandbox partner. So if you want to meet us, talk about our apps, how it works, our up and coming features, please drop by the developer sandbox and have a chat.&lt;/p&gt;

&lt;p&gt;很高興我今年被 Google 選為 Sandbox 合作開發夥伴，並應邀到 &lt;a href="http://www.google.com/events/io/2011/index.html"&gt;Google I/O 2011&lt;/a&gt; 的 &lt;a href="http://www.google.com/events/io/2011/sandbox.html"&gt;Developer Sandbox&lt;/a&gt; 中介紹我的應用給所有參加 Google I/O 的與會者。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;Google I/O Developer Conference 每年都依慣例於五月初在舊金山的 Moscone Center 舉行。在這為期兩天的大會上，主要是和 Android, App Engine, Chrome, Google APIs, Geo 等各種技術相關的研討會。不過除了技術研討會之外，開發者就想要的，就是 Google 送的大禮。&lt;/p&gt;

&lt;p&gt;從 &lt;a href="http://www.google.com/events/io/2009/"&gt;2009 年&lt;/a&gt; 送給每位參加者一台 HTC Magic 手機開始，緊接著又在 &lt;a href="http://www.google.com/events/io/2010/"&gt;2010 年&lt;/a&gt; 更是大手筆的送出 HTC Evo 4G 及 Nexus One 手機。許多開發者也都預期 2011 年，應該會送一台平板或 Nexus S 手機之類。因此在 2011 年開始售票後的 59 分鐘之內，所有的票就已經被一掃而空。&lt;/p&gt;

&lt;p&gt;原先我今年也想參加的，不過想到路程遙遠，再加上在門票想買也買不到的情況下，也就放下了想去的念頭。&lt;/p&gt;

&lt;p&gt;不料就在一個月前，突然收到 Google 的來信，說他們想提名我參加今年的 Google I/O Developer Sandbox。收到這封信，這才又燃起我想去的念頭。經過一番挑選與討論，我們決定拿 &lt;a href="https://market.android.com/details?id=com.a0soft.gphone.aCurrencyPad"&gt;aCurrency Pad&lt;/a&gt; 與 &lt;a href="https://market.android.com/details?id=com.a0soft.gphone.aCompass"&gt;3D Compass&lt;/a&gt; 參加這次的 Google I/O 大會。最後，也順利和全球不到 30 位 sandbox Android 開發者一起，獲選為 Google I/O 2011 Sandbox 開發夥伴。&lt;/p&gt;

&lt;p&gt;aCurrency Pad 是專門為 Android 3.0 平板設計的應用。平板，當然是今年 Android 主推的重點之一。拿這個應用，剛好可以 demo Honeycomb 的各項新功能。而 3D Compass 算是我們的創新應用，到目前為止 Android Market 上也還沒看見類似的應用。這個有用又不失有趣的應用，最適合在這種場合 demo 給參觀者看。&lt;/p&gt;

&lt;p&gt;這次獲邀參加 Google I/O 大會，Google 將會提供兩張門票給我。另一張門票，也就邀請尚未見面過的美國合作夥伴, &lt;a href="http://ysl-paradise.blogspot.com/2010/04/android.html"&gt;John Wang&lt;/a&gt; 一同前往。&lt;/p&gt;

&lt;p&gt;如果你也有參加這次 Google I/O 的話，別忘了到我們的攤位來找我。至於 Google I/O 的見聞，就等我 5/15 號回來後，再分享給大家。&lt;/p&gt;

&lt;p&gt;下圖中，紅色框起來的部分，就是我公司的 logo。&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/-8NTxYSaxlY4/Tcgk-njIrqI/AAAAAAAAAU4/IgkIpQSUwBI/azsoft_google2011_sandbox_partner.jpg" border="0" /&gt;&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5944030126292842872?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5944030126292842872/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/04/google-io-2011-sandbox.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5944030126292842872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5944030126292842872'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/04/google-io-2011-sandbox.html' title='我們被選為 Google I/O 2011 Sandbox 開發夥伴'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-dylvQbTWx1Y/TbaUCZE5M-I/AAAAAAAAAUo/23ImAwQcjzs/s72-c/googleio.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-897413155795582925</id><published>2011-04-26T09:00:00.001+08:00</published><updated>2011-04-26T14:43:07.912+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExpandableListView'/><category scheme='http://www.blogger.com/atom/ns#' term='View'/><category scheme='http://www.blogger.com/atom/ns#' term='ListView'/><category scheme='http://www.blogger.com/atom/ns#' term='BaseAdapter'/><title type='text'>使用 ListView 元件時該注意的技巧 - I</title><content type='html'>&lt;p&gt;The tricks when using ListViews - I&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/-wtBYJw_SzRw/TbKF8b5ZyZI/AAAAAAAAAUg/oxnyvxtH0WQ/tricks.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;綜觀 Android 目前所提供的 UI 元件 (Views)，除了 TextView, Button 等元件之外，ListView 應該是最常被使用到的元件之一。&lt;/p&gt;

&lt;p&gt;這主要是因為手機多是左右窄、上下長的螢幕，當要顯示很多資料時，垂直捲動會比水平捲動來得容易操作許多。另外，為了便利使用者能快速消化你所呈現的資料，你必須將資料以較為有系統與組織的方式呈現。而用 ListView 來以條列式的方式呈現你的資料，就是手機應用的最好選擇。&lt;/p&gt;

&lt;p&gt;如果你有寫過 Android 應用，我想你一定有用過 ListView。不過，你對 ListView 的了解有多少？你知道使用 ListView 元件時，有哪些該注意的技巧嗎？&lt;/p&gt;

&lt;span class="fullpost"&gt;

&lt;p&gt;ListView 最基本的用法就是透過 ArrayAdapter，直接顯示文字的列表。&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/-ACkxlFnCiHE/TbKEIsKMsOI/AAAAAAAAAUI/NI-nY4Of66Q/lv1.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;關於這，你可以閱讀 &lt;a href="http://developer.android.com/resources/tutorials/views/hello-listview.html"&gt;ListView with default ArrayAdapter&lt;/a&gt; 範例，他有很清楚的說明。&lt;/p&gt;

&lt;p&gt;如果 ListView 中的每個項目，不是單純的文字，要有些變化時，那你一定要寫自己的 ListAdapter。&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/-SAvOAIDNaTY/TbKEY69pK6I/AAAAAAAAAUQ/UdLOUmNS6gw/s320/lv2.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;API Demos 範例集中，就有 &lt;a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html"&gt;ListView with a custom ListAdapter&lt;/a&gt; 這個範例，教你如何寫自己的 ListAdapter。&lt;/p&gt;

&lt;p&gt;在上面範例中，雖然已經有處理 convertView 這件事。不過當你的 list item 很複雜 (好幾層的 UI hierarchy 或 Views 很多) 時，每次都呼叫 findViewById() 所浪費的時間，還是會讓捲動變的緩慢。要解決這個問題，這篇 &lt;a href="http://developer.android.com/resources/articles/layout-tricks-efficiency.html"&gt;Layout Tricks: Creating Efficient Layouts&lt;/a&gt; 會教你如何降低你的 UI hierarchy。另外，你也要看一下 &lt;a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html"&gt;ListView with an efficient ListAdapter&lt;/a&gt; 這個範例中所使用的技巧。&lt;/p&gt;

&lt;p&gt;如果你的 list item 並不複雜，但捲動時還是很鈍鈍的。那我建議你看一下 &lt;a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List13.html"&gt;ListView with lazy-loading&lt;/a&gt; 這個範例。&lt;/p&gt;

&lt;p&gt;當你的 ListView 中有成千上百個項目時，除了加 android:fastScrollEnabled="true" 可以方便使用者快速捲動外。更好的解決方式是加上按鍵過濾的功能。如何實現按鍵過濾的功能？你可以參考 &lt;a href="http://ysl-paradise.blogspot.com/2008/12/listview.html"&gt;如何在 ListView 上加上按鍵過濾的功能&lt;/a&gt; 這篇文章。&lt;/p&gt;

&lt;p&gt;除了 ListView 之外，別忘了還有 ExpandableListView 可用。尤其當你的資料是兩層式架構時，用 ExpandableListView 是不錯的選擇。&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-ziuaC_yQLKo/TbKEm7ck-GI/AAAAAAAAAUY/R_Ta_JNQzVA/lv3.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;同樣的 API Demos 中已經有好幾個範例了，你可以從 &lt;a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html"&gt;ExpandableListView&lt;/a&gt; 這個先看起。&lt;/p&gt;

&lt;p&gt;最後，如果你的 ListView 想要有自己的背景圖或顏色。那你要看一下 &lt;a href="http://developer.android.com/resources/articles/listview-backgrounds.html"&gt;ListView Backgrounds: An Optimization&lt;/a&gt; 這篇文章。解法其實非常簡單，但不說你都不會想到原來 android:cacheColorHint 是用在這個地方。另外一個不說你不知道的用法是 setTranscriptMode()。如果你想要讓 ListView 捲到最後一個項目，那你要用 setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL)，相關說明你可以參考 &lt;a href="http://stackoverflow.com/questions/3606530/listview-scroll-to-the-end-of-the-list-after-updating-the-list"&gt;Listview Scroll to the end of the list after updating the list&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;下次我們再來看，用 ListView 時常犯的錯誤有哪些。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-897413155795582925?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/897413155795582925/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/04/listview-i.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/897413155795582925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/897413155795582925'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/04/listview-i.html' title='使用 ListView 元件時該注意的技巧 - I'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wtBYJw_SzRw/TbKF8b5ZyZI/AAAAAAAAAUg/oxnyvxtH0WQ/s72-c/tricks.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1461430071957538558</id><published>2011-04-22T21:40:00.006+08:00</published><updated>2011-05-23T21:04:43.146+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StackView'/><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='honeycomb'/><category scheme='http://www.blogger.com/atom/ns#' term='AppWidgetManager'/><category scheme='http://www.blogger.com/atom/ns#' term='ClipboardManager'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment'/><title type='text'>Android 平板應用開發經驗分享 - 遠傳 S Club 演講</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/-NZ5Sn_CoRaw/TbGGIH18EZI/AAAAAAAAAUA/eWXsf_X6u0I/smarket.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;2011/4/22 應遠傳 S Club 邀請，給一個和 Android 3.0 平板相關的演講。&lt;/p&gt;

&lt;p&gt;這次聚會一開始是 Acer產品行銷經理陳先生，介紹自家的 A500 平板的使用方式與特色。算是從使用者的層面，來看最新的 Android 3.0 平板。而我主要是從應用開發者的角度，來談 Android 平板應用開發的經驗分享。&lt;/p&gt;

&lt;p&gt;底下是這次演講的投影片，分享給有興趣的你。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;歡迎大家引用，但為尊重著作權，引用時請註明出處，也請您勿部分或全部使用於演講或著作等相關用途。&lt;/p&gt;

&lt;iframe width='410' height='342' frameborder=0 src=https://docs.google.com/viewer?a=v&amp;pid=explorer&amp;chrome=false&amp;embedded=true&amp;srcid=0BzsUaCH0kw7QYTQ0ZGE5YTEtZmEzZi00ODNlLTg2YTEtY2Q2MjFiOTQ2MGE4&amp;authkey=CPmgxWo&amp;hl=en&gt;&lt;/iframe&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1461430071957538558?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1461430071957538558/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/04/s-club.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1461430071957538558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1461430071957538558'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/04/s-club.html' title='Android 平板應用開發經驗分享 - 遠傳 S Club 演講'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-NZ5Sn_CoRaw/TbGGIH18EZI/AAAAAAAAAUA/eWXsf_X6u0I/s72-c/smarket.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4438724078540980444</id><published>2011-03-04T09:00:00.001+08:00</published><updated>2011-03-04T09:00:02.185+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntentService'/><category scheme='http://www.blogger.com/atom/ns#' term='app'/><category scheme='http://www.blogger.com/atom/ns#' term='AppInventor'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmManager'/><category scheme='http://www.blogger.com/atom/ns#' term='HttpURLConnection'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><category scheme='http://www.blogger.com/atom/ns#' term='Intent'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncTask'/><title type='text'>讓癮科技 Android 應用登上榜首的秘密</title><content type='html'>&lt;p&gt;How do I make my Engadget(Chinese Version) app to become the most popular app?&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://3.bp.blogspot.com/-_0urWG7tjnE/TW9VIra_NYI/AAAAAAAAATY/H_zzguQMk_g/engadget_app.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;經過將近一個月的測試，2011/2/6 首次發行 &lt;a href="https://market.android.com/details?id=com.a0soft.gphone.Engadget"&gt;癮科技 Android app&lt;/a&gt; 到 Android Market 上。六天後的今天 (2011/3/3)，這個應用很快地爬到「新聞與雜誌」類別排行榜中的第一名位置，同時也是所有應用程式排行榜的第四名。在目前 Android Market 已有 &lt;a href="http://atrackdog.a0soft.com/stats.php"&gt;16 萬個 Android 應用&lt;/a&gt; 一起激烈競爭的情況下，新的應用能這麼快登上排行榜，真的是一件很不容易的事。這中間，癮科技寫的「&lt;a href="http://chinese.engadget.com/2011/02/28/engadget-chinese-news-reader-android-edition-launched/"&gt;不要再叫我們蘋科技！癮科技新聞訂閱程式也有Android版了&lt;/a&gt;」這篇介紹文，當然有很大的幫助。&lt;/p&gt;

&lt;p&gt;除此之外，到底有什麼樣的秘訣，才能讓我的應用程式登上排行榜呢？這是我最常被兩岸開發者問到的問題之一。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;要讓應用程式登上排行榜，可以分成非技術面與技術面兩個面向來談。非技術的部份，我早在 2009/10 一場研討會的「&lt;a href="http://ysl-paradise.blogspot.com/2009/10/2009-sd-20.html"&gt;發現 Android 熱門應用程式的秘密&lt;/a&gt;」的講座中，分享給大家。只不過這場演講主要的對象是對岸的開發者，對於台灣的開發者，只好等下次有人邀請我演講時，我再分享給大家。&lt;/p&gt;

&lt;p&gt;技術面的部份，最主要的除了不能讓你的應用程式輕易當機之外，當然就是要讓使用者用起來很順暢才行。「使用的很順暢」這句話講起來很輕鬆，不過卻是得花最多時間與人力去調整各項細節，才能做到的地方。&lt;/p&gt;

&lt;p&gt;這些細節，使用者當然不會注意到，也不會告訴你。就看你是否知道使用者的痛苦(需求)，以及你如何深入了解這些痛苦的解決方法是甚麼。在這裡我就拿我最近開發的癮科技 app 來當案例。說明我們在技術的層面上，做了哪些努力。&lt;/p&gt;

&lt;p&gt;第一：這不是一個單純的 RSS reader。一般這樣的應用程式開發者，可能都會以 RSS reader 的架構來開發這樣的應用。為了讓這個應用能跑得更順，我們決定走不一樣的路，在 server 端提供專屬的 APIs，在手機端也做了一些一般 RSS reader 做不到的功能。例如，你可以往下一直看過去的 N 篇文章。&lt;/p&gt;

&lt;p&gt;第二：所有抓下來的文章與圖片，都存到 SD 卡上，以節省手機儲存空間的使用。多數的手機，內部儲存空間都是有限的，這造成使用者常要刪除舊的應用，以增加多餘的空間來裝新應用。這從我的 &lt;a href="https://market.android.com/details?id=com.a0soft.gphone.app2sd.pro"&gt;App 2 SD&lt;/a&gt; 與 &lt;a href="https://market.android.com/details?id=com.a0soft.gphone.aCCleaner.free"&gt;aCCleaner&lt;/a&gt; 應用受歡迎的程度，就可以了解使用者在這方面的需求很大。如果你的應用佔的空間太大，在這點就吃虧很多。看到這，你可能會說這有什麼，大家都有這功能。不對，細節就在這裡。如果你有使用其他的新聞閱讀軟體，就可以觀察到他還是吃了不少 data/cache 空間。這原因就在你應用所建立的 Sqlite database 以及 WebView 所建立的 database/cache 都還是存在內部儲存空間。要將這些完全移到 SD 卡上，這可花了我好幾天追蹤原始碼，才知道要怎麼解決這個問題。目前，我只將 preferences 存在內部儲存空間中，其他都移到 SD 卡上。&lt;/p&gt;

&lt;p&gt;第三：自動縮放文章中的文字與圖片大小。水平捲動對手機使用者來說，是一件很痛苦的事，這是千萬要避免發生的事。自動縮圖片，就是要解這問題。另外，多數的新聞閱讀應用的字體大小都太小了，行距也不對。這對要長時間閱讀文章的人，是一種折磨。你現在看到文章中的預設字體大小與行距，可是我們花了好多時間才調校出來的。你說，這不又是一個要在細節下功夫的地方？&lt;/p&gt;

&lt;p&gt;第四：離線也能閱讀文章。離線閱讀的功能，對於這樣的新聞應用是一個很重要的功能，這樣使用者才真的能隨時隨地都可以看文章。文章與圖片都存到 SD 卡上，不是就能實現這個功能了嗎？不對，這只做了一半。另外一半就是你還要實現自動預下載文章的功能，有了這功能使用者才能隨時隨地有「新」文章可看。寫網路程式可算是手機程式中一件非常有挑戰的事，因為手機的 CPU 會進入 sleep 模式，網路可能隨時會中斷，速度可能掉到 GPRS 的速度等等各式各樣的問題都會出現。這些種種你必須要面對的問題，你都得處理，才能讓你的應用跑得很 solid。&lt;/p&gt;

&lt;p&gt;雖然我們做了這麼多的努力，這個應用還有一些沒做好的部分。我們還會繼續在這個應用中奮戰好一段時間，在接下來的新版本中，我們會陸續解決這些問題，敬請期待！&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4438724078540980444?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4438724078540980444/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/03/android.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4438724078540980444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4438724078540980444'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/03/android.html' title='讓癮科技 Android 應用登上榜首的秘密'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-_0urWG7tjnE/TW9VIra_NYI/AAAAAAAAATY/H_zzguQMk_g/s72-c/engadget_app.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-777767033711814715</id><published>2011-02-14T12:47:00.013+08:00</published><updated>2011-11-13T18:42:30.584+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>2011 Android 2.X 手機應用開發課程 @ 台灣</title><content type='html'>&lt;p&gt;2011 mobile app development training courses for Android 2.X @ Taiwan&lt;/p&gt;&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/a.jpg" /&gt;&lt;/p&gt;&lt;p&gt;在 2010 年除了 Android 入門開發課程之外，也開了一門進階課程。我個人覺得在入門課中，最重的要的是幫助入門者打好基礎，尤其是 Android 平台的架構，與在該平台上應用程式運作的基礎觀念與原理。這部分要是清楚了，日後遇到問題，要自己找資料解決，也有個方向。另外就是對 ListView 元件的運行原理，也有深入的介紹，ListView 是 Android 眾多 UI 元件中，最常用到的，也是最好用的一個。透過對 ListView 的了解，其他類似的元件如 GridView, Spinner 等由 AdapterView 所延伸的元件，自然也可觸類旁通。&lt;/p&gt;&lt;p&gt;至於在進階課程中，最重要的部分，就是我會用將近一天的時間來解釋與剖析 Activity &amp; Service 的生命週期。這部分是對已入門的開發者，最最重要的一部分，卻也是最不容易全盤了解與最容易被忽視的一部分。我試玩過很多應用，也看過不少人的程式，與發問的問題，都是源自於對這部分的了解不夠透徹。&lt;/p&gt;&lt;span class="fullpost"&gt; &lt;p&gt;在 2011 年，除了延續 2010 的課程，並將原先的課程內容都改以 Android 2.x 平台為主之外，還加開了雲端/地圖應用開發與原碼解析這門進階課。&lt;/p&gt;&lt;p&gt;在這個新的進階課程中，我會先介紹如何開發存取網路的 Android 應用。行動網路是智慧型手機的重要特色之一，因此開發具有網路存取功能的應用，也是大家常常會接觸的工作之一。我會在課程中提及如何在 Android 手機平台上，正確執行這項工作。智慧型手機的另項特色，就是 GPS (location-based)。接下來，我會介紹如何開發地圖 (LBS, location-based) 應用，如何抓取經緯度座標，寫好地圖應用，都是這課程會教的事。&lt;/p&gt;&lt;p&gt;最後，我會花半天的時間，教大家如何讀 Android 應用的源碼，並實際拿個例子來解說。我個人覺得閱讀及追蹤 Android 的原始碼，是提昇你 Android 程式設計功力最好的方式之一。當你已具備 Android 開發基礎的情況下，想要再進一步提升你的程式設計功力，除了要想辦法讓自己多增加些程式設計經驗外，閱讀及追蹤別人寫的程式碼，更是最好的方法。不過網路上，每個人的程式功力高低不同，寫出來的程式也有好有差。讀到不良的程式，看不懂還不打緊，如果誤導你的觀念，那可就得不償失。因此，當你底子還不足以判斷好壞程式時，研讀 Android 原始碼，就是你學習 Android 程式設計時，最好的導師。&lt;/p&gt;&lt;p&gt;底下是 2011 年計畫開的課程，不管是內容或是其他方面，要提意見的，也都歡迎在這篇文章上留言。&lt;/p&gt;&lt;p&gt;有句話說的好，『師父領進門，修行在個人』。千萬不要期望說，上個課就什麼都會了。天下沒有白吃的午餐，許多東西還是要自己親身走一遭，才會明白與了解。我想上課最大的好處是，透過有系統與組織的解說，降低你學習的門檻與加快進入的速度。我個人估計是 12 個小時的課程，大概可以幫你減少約 0.5~1 個月的自我摸索時間。剩下的，還是要靠自我的練習。&lt;/p&gt;&lt;a name="entry"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;入門課&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;首先，我將課程內容都改以 Android 2.x 平台為主。在這個 Android 入門開發課程中，最重的要的是幫助入門者打好基礎，尤其是 Android 平台的架構，與在該平台上應用程式運作的基礎觀念與原理。這部分要是清楚了，日後遇到問題，要自己找資料解決，也有個方向。另外就是對 ListView 元件的運行原理，也有深入的介紹，ListView 是 Android 眾多 UI 元件中，最常用到的，也是最好用的一個。透過對 ListView 的了解，其他類似的元件如 GridView, Spinner 等由 AdapterView 所延伸的元件，自然也可觸類旁通。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;熟悉 Android 2.X開發環境與Android平台知識&lt;/li&gt;
&lt;li&gt;瞭解Android 2.X程式框架&lt;/li&gt;
&lt;li&gt;如何有效率的偵錯程式&lt;/li&gt;
&lt;li&gt;功能選單之設計與應用&lt;/li&gt;
&lt;li&gt;各式使用者介面元件之設計與應用&lt;/li&gt;
&lt;li&gt;如何支援多國語言與不同的硬體設備&lt;/li&gt;
&lt;li&gt;Intent 的使用&lt;/li&gt;
&lt;li&gt;深入剖析 Activity 之運作行為&lt;/li&gt;
&lt;li&gt;喜好設定之存取&lt;/li&gt;
&lt;li&gt;發佈應用程式與參考資料&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;a name="adv1"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;進階課 I&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;這個課程先帶領你深入研究 Android 三大重要元件 (Actiovity, Service, BroadcastReceiver) 的運作原理，與建立正確的使用觀念。其中我會用將近一天的時間來解釋與剖析 Activity &amp; Service 的生命週期。這部分是對已入門的開發者，最最重要的一部分，卻也是最不容易全盤了解與最容易被忽視的一部分。我試玩過很多應用，也看過不少人的程式，與發問的問題，都是源自於對這部分的了解不夠透徹。BroadcastReceiver e也是最常被使用的元件，在學如何開發桌面小工具之前，如何使用這元件的正確觀念是一定要先建立的。接下來，我會介紹如何開發桌面小工具和多媒體應用。對於已熟悉 Android 應用開發，而想進一步提昇您自身應用開發實力與建立正確觀念的您，這個課程是一定要上的。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;深入研究Android生命週期&lt;/li&gt;
&lt;li&gt;如何開發自訂使用者元件&lt;/li&gt;
&lt;li&gt;各式繪圖功能之使用與應用&lt;/li&gt;
&lt;li&gt;BroadcastReceiver之使用與應用&lt;/li&gt;
&lt;li&gt;深入研究Service之使用與應用&lt;/li&gt;
&lt;li&gt;如何建立桌面小工具&lt;/li&gt;
&lt;li&gt;重力加速感應器的使用與應用&lt;/li&gt;
&lt;li&gt;如何播放與錄製多媒體影音&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;a name="adv2"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;進階課 II&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;在這個進階課程中，我會先介紹如何開發存取網路的 Android 應用。行動網路是智慧型手機的重要特色之一，因此開發具有網路存取功能的應用，也是大家常常會接觸的工作之一。我會在課程中提及如何在 Android 手機平台上，正確執行這項工作。智慧型手機的另項特色，就是 GPS (location-based)。&lt;/p&gt;&lt;p&gt;接下來，我會介紹如何開發地圖 (LBS, location-based) 應用，如何抓取經緯度座標，寫好地圖應用，都是這課程會教的事。&lt;/p&gt;&lt;p&gt;最後，我會花半天的時間，教大家如何讀 Android 應用的源碼，並實際拿個例子來解說。我個人覺得閱讀及追蹤 Android 的原始碼，是提昇你 Android 程式設計功力最好的方式之一。當你已具備 Android 開發基礎的情況下，想要再進一步提升你的程式設計功力，除了要想辦法讓自己多增加些程式設計經驗外，閱讀及追蹤別人寫的程式碼，更是最好的方法。不過網路上，每個人的程式功力高低不同，寫出來的程式也有好有差。讀到不良的程式，看不懂還不打緊，如果誤導你的觀念，那可就得不償失。因此，當你底子還不足以判斷好壞程式時，研讀 Android 原始碼，就是你學習 Android 程式設計時，最好的導師。&lt;/p&gt;&lt;p&gt;在這課程中，也會教授 Android 的第四大重要元件 ContentProvider 的用法，當然也會提及 SQLiteDatabase 這個主題。&lt;/p&gt;&lt;p&gt;&lt;b&gt;課程大綱&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Android雲端應用開發&lt;/li&gt;
&lt;li&gt;- 如何開發以網頁(WebView)為基礎的 Android 應用&lt;/li&gt;
&lt;li&gt;- Android與WebView間的互相呼叫&lt;/li&gt;
&lt;li&gt;- 如何開發Android端網路應用程式，及該注意的要點&lt;/li&gt;
&lt;li&gt;- URL, IntentService, HttpClient, AndroidHttpClient&lt;/li&gt;
&lt;li&gt;- XML 與 JSON parsers 的使用&lt;/li&gt;
&lt;li&gt;Android LBS (地圖)應用開發&lt;/li&gt;
&lt;li&gt;- 如何擷取各式地理座標資訊&lt;/li&gt;
&lt;li&gt;- 如何開發地圖(MapView)應用&lt;/li&gt;
&lt;li&gt;Android原始碼徹底研究&lt;/li&gt;
&lt;li&gt;- 如何研讀Android原碼&lt;/li&gt;
&lt;li&gt;- 深入研讀Android原碼實例&lt;/li&gt;
&lt;li&gt;- SQLiteDatabase, ContentProvider&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;p&gt;底下是 2011 年計畫開的課程：&lt;/p&gt;&lt;p&gt;&lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;&lt;tr style="background-color:#ff9900;color:#000"&gt;&lt;td&gt;日期&lt;/td&gt;&lt;td&gt;地點&lt;/td&gt;&lt;td&gt;課程名稱&lt;/td&gt;&lt;td&gt;難易度&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;5/4,5 星期三四&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110551&amp;msgno=307203" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;5/18,19 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110512&amp;msgno=307167" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;6/1,2 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110513&amp;msgno=307164" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階 I&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;6/29,30 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110515&amp;msgno=307162" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv2"&gt;進階 II&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;7/20,21 星期三四&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110552&amp;msgno=307204" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階 I&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;!--
&lt;tr style="font-weight:bold"&gt;&lt;td&gt;8/24,25 星期三四&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110553&amp;msgno=307205" style="font-weight:bold"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv2"&gt;進階 II&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
--&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;9/14,15 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110982&amp;msgno=307826" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;!--
&lt;tr style="font-weight:bold"&gt;&lt;td&gt;10/5,6 星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110549&amp;msgno=307200" style="font-weight:bold"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#entry"&gt;基礎&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
--&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;10/12,13 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110983&amp;msgno=307827" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階 I&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;!--
&lt;tr style="font-weight:bold"&gt;&lt;td&gt;10/19,20 星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110555&amp;msgno=307206" style="font-weight:bold"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv1"&gt;進階 I&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="font-weight:bold"&gt;&lt;td&gt;11/2,3 星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110556&amp;msgno=307210" style="font-weight:bold"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv2"&gt;進階 II&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
--&gt;
&lt;tr style="color:#555"&gt;&lt;td&gt;11/9,10 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23110984&amp;msgno=307828" style="color:#555"&gt;Android 2.X 手機應用開發實務&lt;/a&gt;&lt;br /&gt;
工研院&lt;/td&gt;&lt;td&gt;&lt;a href="#adv2"&gt;進階 II&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://ysl-paradise.blogspot.com/2009/02/2009-android.html"&gt;2009-2010 在台灣所開的課程&lt;/a&gt;&lt;p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-777767033711814715?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/777767033711814715/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/02/2011-android-2x.html#comment-form' title='10 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/777767033711814715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/777767033711814715'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/02/2011-android-2x.html' title='2011 Android 2.X 手機應用開發課程 @ 台灣'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/s72-c/a.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8291252161735899257</id><published>2011-01-25T09:00:00.004+08:00</published><updated>2011-03-12T11:36:34.533+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='app'/><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>Android 應用的盜版與山寨 - 山寨應用</title><content type='html'>&lt;p&gt;The pirate Android market and shanzhai apps - &lt;b&gt;shanzhai apps&lt;/b&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TTlIYO7JYyI/AAAAAAAAASo/xgxeF10oqG0/shanzhai.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;沒有靈魂的山寨應用&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;之前提過 &lt;a href="http://ysl-paradise.blogspot.com/2011/01/android.html"&gt;Android 盜版市集&lt;/a&gt; 的出現對開發者的威脅，以現階段的發展情況而言，應該還沒到嚴重的程度。不過另一個新現象「山寨應用」的發展，對原創開發者的威脅，我倒是覺得值得關注。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;甚麼叫山寨？你可以參考維基百科中 &lt;a href="http://zh.wikipedia.org/zh-tw/%E5%B1%B1%E5%AF%A8%E6%96%87%E5%8C%96"&gt;山寨文化&lt;/a&gt; 或 &lt;a href="http://en.wikipedia.org/wiki/Shanzhai"&gt;Shanzhai&lt;/a&gt; 的解釋說明。&lt;/p&gt;

&lt;p&gt;所謂的「山寨精神」就是用最低的成本，儘量複製原創產品的外觀；至於產品本質的部分，那當然是不用在意了。一方面這會增加成本，另一方面山寨人也不懂這原創產品的內在精神，又怎有能力在本質上抄襲。山寨者常用來掩護其行為的理由就是，誰不是從模仿學起的。不過以我來看。山寨和模仿還是有程度上的不同，模仿者通常是抄襲產品規格，至於在外觀上，還不至於做到讓消費者傻傻分不清楚的程度。山寨就不同了，山寨產品的唯一目的，就是讓消費者從外觀上分不清楚，哪一個是原版，哪一個是山寨。所以這山寨產品比模仿產品對原創者的威脅，還要大上許多。從另一個角度上看，這山寨文化對原創力的影響，也不容小歔。維基百科中一句話說得很好：「&lt;b&gt;山寨風愈演愈烈，將會加劇中國文化原創力的腦萎縮和腦死亡&lt;/b&gt;」。&lt;/p&gt;

&lt;p&gt;大家都知道目前的中國，已經將這山寨文化發揚光大到無所不在的地步，各式各樣的產品(包含人)，只要是熱門的，就一定伴隨一堆的山寨產品。現在，這股山寨風也吹到 Android apps 上。&lt;/p&gt;

&lt;p&gt;2010 年六月我發現 Android 2.2 手機內建的 &lt;a href="http://developer.android.com/guide/appendix/install-location.html"&gt;install apps on SD&lt;/a&gt; 的功能很難用。一定要每個應用都點一下，才知道可否將此應用移到 SD 卡上。當發現這個問題後，我的第一個動作是到 Market 上尋找，是否有相關的解決方案。發現沒有後，我才開始花一個禮拜的時間著手寫 &lt;a href="http://www.appbrain.com/app/app-2-sd-free-(move-app-to-sd)/com.a0soft.gphone.app2sd"&gt;App 2 SD&lt;/a&gt;。自己也沒想到這個應用，會是這麼的熱門。到目前為止，只花不到半年的時間，下載數就已經突破 50 萬，也破了我先前 &lt;a href="http://www.appbrain.com/app/atrackdog-track-new-version/com.a0soft.gphone.aTrackDog"&gt;aTrackDog&lt;/a&gt; 的紀錄。&lt;/p&gt;

&lt;p&gt;熱門的應用，果然吸引了一堆 Copycat 相繼模仿我的 App 2 SD 應用，&lt;a href="http://www.appbrain.com/app/apps-2-sd-(move-app-2-sd)/com.IQBS.android.app2sd"&gt;Apps 2 SD by Gregory House&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/app-2-sd(move-app-2-sd)/com.wongxming.android.app2sd"&gt;App 2 SD by Bob Chow&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/apps-to-sdcard/com.easyfilter.app2sd"&gt;Apps to sdcard by EasyFilter&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/app-2-sd(app-to-sd-card)/net.lepeng.app2sd"&gt;App 2 SD by PopSoft&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/advanced-sd-card-manager/com.arron.sdCardManager"&gt;Advanced SD Card Manager by Arron La&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/movetosd/com.curvefish.apps.movetosd"&gt;MoveToSD by CurveFish&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/app-to-sd-(free-no-ads)/mobi.mgeek.AppToSD"&gt;App to SD by Dolphin Browser Add-ons&lt;/a&gt; 這些都是。&lt;/p&gt;

&lt;p&gt;而在這些 copycat 中，竟然還出現山寨 apps 的蹤跡。你看一下底下的應用截圖，分別來自三個不同的應用。如果你有用過我的 App 2 SD 應用，你看的出來哪一個是原版的，哪一個是山寨？&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TTlIFNtVT1I/AAAAAAAAASg/GY4gbIxpobM/app2sd.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;答案是最左邊的才是原版，右邊那兩個 &lt;a href="http://www.appbrain.com/app/app-2-sd(move-app-2-sd)/com.wongxming.android.app2sd"&gt;App 2 SD by Bob Chow&lt;/a&gt;, &lt;a href="http://www.appbrain.com/app/apps-2-sd-(move-app-2-sd)/com.IQBS.android.app2sd"&gt;Apps 2 SD by Gregory House&lt;/a&gt; 都是山寨 apps。從這兩個應用的截圖中，可以明顯看出來，都是來自「使用簡體中文」的國家 (截圖中還有中文，明顯不用心)。&lt;/p&gt;

&lt;p&gt;我自認沒有美學的修養，從不覺的我的應用在美學設計上有到達及格的程度。要模仿我的應用，好歹配色或 icon 也改一下。你看到沒，不僅配色都一模一樣，連 icon 也相同。其中 Gregory House 這個開發者(最右邊的應用)，他只山寨配色的部分，中間的顯示方式好歹也從原先的 GridView 換成 ListView，所以目前應該是在腦萎縮的階段。而已經到達腦死程度的，當然是 Bob Chow 這傢伙 (中間的應用)，連 icon 都原封不動抄襲。不仔細看，還真分不出來這是原版，還是山寨。發揚山寨精神的極致，也莫過於此了。再進一步追查，這兩個人還有某種程度的合作關係或關聯，果然是山寨家族一家親。&lt;/p&gt;

&lt;p&gt;保守估計，這兩個山寨 apps 的下載數加起來有 6 萬之多。和盜版應用所造成的損失相比，在比例上應該是差不了多少。不過山寨應用比起盜版應用對原創者的影響可就大多了，除了對營收的影響之外，對你產品形象的影響更是來的大許多。難怪國外大廠，看到這些山寨產品，無不恨的牙癢癢的。可是遇到無「齒」的人，你又能如何？&lt;/p&gt;

&lt;p&gt;後記：這個 &lt;a href="http://coolshell.cn/articles/3820.html"&gt;中国的C2C模式&lt;/a&gt; 裡頭列有山寨網站。&lt;/p&gt;

&lt;p&gt;如果你發現你的應用被侵權，你可透過 &lt;a href="http://market.android.com/support/bin/answer.py?hl=en&amp;answer=141511"&gt;trademark notice of infringement&lt;/a&gt; 及 &lt;a href="http://www.google.com/support/bin/request.py?contact_type=lr_dmca&amp;product=androidmarket"&gt;copyright notice of infringement&lt;/a&gt; 向 Google 提出侵權報告。&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8291252161735899257?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8291252161735899257/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/01/android_25.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8291252161735899257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8291252161735899257'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/01/android_25.html' title='Android 應用的盜版與山寨 - 山寨應用'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/TTlIYO7JYyI/AAAAAAAAASo/xgxeF10oqG0/s72-c/shanzhai.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3539454554875929317</id><published>2011-01-21T09:00:00.003+08:00</published><updated>2011-02-21T16:55:41.251+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proguard'/><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscate'/><title type='text'>Android 應用的盜版與山寨 - 盜版市集</title><content type='html'>&lt;p&gt;The pirate Android market and shanzhai apps - &lt;b&gt;pirate market&lt;/b&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TTg1xh1JRLI/AAAAAAAAASY/etY-4886ZoU/pirate.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Android 盜版應用的崛起&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Android 的盜版應用遲早一定會出現的，這是軟體世界裡不變的真理，而且不管你如何保護都沒有用。就像防盜市場一樣，沒有開不了的鎖，有的只是時間快慢問題而已。&lt;/p&gt;

&lt;p&gt;熟悉門路的人都知道，在通訊行買 iPhone，不僅幫你的手機越獄，還附上一片大補帖，裡面裝滿可以免費使用的 iPhone 付費應用。Android 應用當然也無法免除這被盜版的命運，再加上 Android 應用的開發使用的是 Java 語言，要反組譯這 Java 所編譯出來的 .class 或是 .jar 檔，更是易如反掌。自已 &lt;a href="http://www.google.com/#hl=en&amp;q=java+decompiler"&gt;google 一下 java decompiler&lt;/a&gt;，這類的 java 反組譯工具早就滿天飛。而且反組譯所產生出來的 Java 源碼，還都宛如原著。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;雖然 Android 會再將 .class 轉譯成 .dex，不過這 .dex 的格式既然是公開的，自然要再將他解開，也不是件難事。&lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt;, &lt;a href="http://dedexer.sourceforge.net/"&gt;Dedexer&lt;/a&gt;, &lt;a href="http://code.google.com/p/dex2jar/"&gt;dex2jar&lt;/a&gt;, &lt;a href="http://code.google.com/p/android-apktool/"&gt;android-apktool&lt;/a&gt; 等都有這樣的本事。雖然你可以用 &lt;a href="http://ysl-paradise.blogspot.com/2008/10/android-obfuscation.html"&gt;Proguard&lt;/a&gt; 這類的工具，延長別人看懂你程式所要花費的時間。不過，相信我，&lt;b&gt;只要能還原出原始碼，就一定可以被破解&lt;/b&gt;。加&lt;b&gt;再多的防盜措施，只是找你自己與使用者的麻煩&lt;/b&gt;。因此，盜版 Android 應用的出現，是早晚的事。&lt;/p&gt;

&lt;p&gt;透過 iPhone 的 App Store 或是 Android 的 Android Market 這類的創新營運模式，將手機應用的傳銷成本，幾乎降為 zero。這麼好的創新模式，盜版者當然得將這招學下來，所以專為散佈盜版應用的 Market，自然也就孕育而生。&lt;a href="http://www.applanet.net/"&gt;Applanet&lt;/a&gt; 大概是最有名的一個。&lt;/p&gt;

&lt;p&gt;我試玩了一下，Applanet 本身就像是一個 Android Market，第一印象是這 Applanet 應用，寫的還真不錯，有一定的水準。我的免費應用，多數帶有廣告，自然歡迎盜版市場一起幫忙散佈，付費應用可就不行。找了一下，果然 Applanet 上有我的付費應用。經過分析之後，我發覺目前的破解方法多是直接改你的程式，繞過你原本程式中檢查是否合法的那個點，再將 apk 重新簽名發佈。&lt;/p&gt;

&lt;p&gt;對於不想付錢買應用的人，有免費的付費應用可用，當然是 why not，不過對於真的使用這類破解應用的使用者，這問題可就嚴重了。你怎麼知道破解者不會在程式中植入木馬？在個人電腦上，被植入木馬，除非偷走你的電子銀行密碼，一般來說，還不會有太大的金錢損失。手機上的木馬遠比個人電腦來得可怕許多。偷抓你的聯絡人資料和私密相片，傳遞上網；或是盜發垃圾簡訊等等，一般人平常根本無從察覺，直到你收到帳單的那一刻，才體會甚麼叫做因小而失大。而目前的手機防毒軟體，也多是騙錢的，根本起不了防治作用，你別想靠他幫你抓毒。由於手機付費應用來的相對地低廉，通常都是不到一杯咖啡的價格，再加上手機上有許多的隱私資料。因此，我覺得這盜版市集是否會對開發者收益部分造成大比例的威脅，還需要一段時間的觀察。&lt;/p&gt;

&lt;p&gt;常有人問我，該如何保護應用，避免被盜版等問題。我的回答都是，只要做好基本的保護 Proguard + &lt;a href="http://developer.android.com/guide/publishing/licensing.html"&gt;LVL&lt;/a&gt;，其他就順其自然了。因為我說過，只要能還原出原碼，這樣的程式就一定可以被破解。除了做好基本保護之外，另外一個重要的事，開發者一定要立足台灣，放眼全球。有機會的話，不要做只給小區域人使用的應用，一定要做給全球手機用戶使用的應用。Android Market 的出現，解決了傳統沒效率的軟體銷售經銷問題。現在你的應用，瞬間可以透過 Market 上架到全球用戶的面前 (消費者有沒有看到的你商品，這是下一件事)，為甚麼你還不願跨出台灣？一旦你的應用是面對全球的，這因盜版市場所造成的營收損失，比例上自然也會下降。與其每天想如何保護程式，還不如多花點時間在增強你程式的功能與品質。這樣才會有正向的循環，不是嗎？&lt;/p&gt;

&lt;p&gt;這有一篇 &lt;a href="http://www.androidpolice.com/2010/08/23/exclusive-report-googles-android-market-license-verification-easily-circumvented-will-not-stop-pirates/"&gt;如何破解應用的教學&lt;/a&gt;。我分享這資訊，並不是要你破解別人的程式，而是因為要學會保護你的應用之前，首先你得先知道別人是如何破解應用。再說一次，沒有破解不了的程式，只是破解所要花的時間多少而已。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3539454554875929317?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3539454554875929317/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2011/01/android.html#comment-form' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3539454554875929317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3539454554875929317'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2011/01/android.html' title='Android 應用的盜版與山寨 - 盜版市集'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/TTg1xh1JRLI/AAAAAAAAASY/etY-4886ZoU/s72-c/pirate.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2419245096489751862</id><published>2010-11-09T09:00:00.002+08:00</published><updated>2010-11-13T19:43:49.930+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntentService'/><category scheme='http://www.blogger.com/atom/ns#' term='HashMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Service'/><category scheme='http://www.blogger.com/atom/ns#' term='ThreadPoolExecutor'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncTask'/><title type='text'>並行下載的完美解決方案</title><content type='html'>&lt;p&gt;How to implement the function that supports concurrent downloading?&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/TIc4eTuU32I/AAAAAAAAAPM/R3RucKfT4j0/downlaod.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在看完 &lt;a href="http://ysl-paradise.blogspot.com/2010/09/asynctask.html"&gt;小心，AsyncTask 不是萬能的&lt;/a&gt; 以及 &lt;a href="http://ysl-paradise.blogspot.com/2010/10/intentservice.html"&gt;深入研究 IntentService 原始碼&lt;/a&gt; 這兩篇文章後，我想你應該已經對如何寫個正確處理費時工作的 Android 程式，建立起正確的觀念。&lt;/p&gt;

&lt;p&gt;從這兩篇文章中，我們也了解到，在 IntentServcie 中等待被服務的工作，並不會被一起並行 (Concurrent)，而是循序執行。在多數的案例中，循序執行已能滿足你的需求，而且這樣的程式也比較能夠受控制而不會出錯。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;不過在處理網路下載這件事情上，循序執行可不是最好的方式，每件網路下載的工作，免不了要浪費時間在等待網路的傳輸上。為了要善用 CPU 的資源，加速資料的下載工作（例如下載多張圖片），你今天可能會想要這些等待被服務的工作，能夠一起被並行，而不是循序執行。在研讀完這個 IntentService 的原始碼後，你自己知不知道如何寫個可支援並行工作的 IntentService？&lt;/p&gt;

&lt;p&gt;如果你曾研讀過 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/AsyncTask.java"&gt;AsyncTask 的原始碼&lt;/a&gt;，你應該知道所有的 AsyncTask實例 (instances)，都是由同一個 &lt;a href="http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html"&gt;ThreadPoolExecutor&lt;/a&gt; 在管理。每一個 AsyncTask 的實例，都會由 ThreadPoolExecutor 中分配到一個 thread 來執行。因此所有的 AsyncTask 實例都是並行的。要實現一個可支援並行工作的 IntentService，我們剛好可以利用 Service + AsyncTask 的組合。&lt;/p&gt;

&lt;p&gt;底下是我所實現的 ConcurrentIntentService 的完整程式代碼。&lt;/p&gt;

&lt;textarea name="code" class="java:nocontrols"&gt;
public abstract class ConcurrentIntentService extends Service {
  protected abstract void onHandleIntent(Intent intent);
  
  private boolean m_bRedelivery;
  private ConcurrentHashMap&lt;Intent, MyAsyncTask&gt; m_mapIntent2AsyncTask;
  
  public
  ConcurrentIntentService()
  {
    m_mapIntent2AsyncTask = new ConcurrentHashMap&lt;Intent, MyAsyncTask&gt;(32);
  }
  
  public void 
  setIntentRedelivery(boolean enabled) 
  {
    m_bRedelivery = enabled;
  }
 
  public void 
  cancel() 
  {
    for (MyAsyncTask task: m_mapIntent2AsyncTask.values()) {
      task.cancel(true);
    }
    m_mapIntent2AsyncTask.clear();
    stopSelf();
  }
  
  @Override public void 
  onStart(Intent intent, int startId) 
  {
    super.onStart(intent, startId);
    if (m_mapIntent2AsyncTask.containsKey(intent)) {
    return;
    }
   
    MyAsyncTask task = new MyAsyncTask();     
    m_mapIntent2AsyncTask.put(intent, task);
    task.execute(intent);
  }
  
  @Override public int
  onStartCommand(Intent intent, int flags, int startId) 
  {
    onStart(intent, startId);
    return m_bRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
  }

  @Override public IBinder 
  onBind(Intent intent) 
  {
    return null;
  }
  
  /////////////////////////////////////////////////////////////
  private class MyAsyncTask extends AsyncTask&lt;Intent, Void, Void&gt; {
    protected Void 
    doInBackground(Intent... its) 
    {
       final int nCount = its.length;
       for (int i = 0; i &lt; nCount; i++) {
         Intent it = its[i];
       
         m_mapIntent2AsyncTask.remove(it);
         onHandleIntent(it);
       }
       return null;
    }

    @Override protected void 
    onPostExecute(Void result)
    {
      if (m_mapIntent2AsyncTask.isEmpty())
        stopSelf();
    }

    @Override protected void 
    onCancelled()
    {
      if (m_mapIntent2AsyncTask.isEmpty())
    stopSelf();
    }
  }
}
&lt;/textarea&gt;

&lt;p&gt;要使用這個 ConcurrentIntentService，和使用 IntentService 是相同的，你只要繼承這個 ConcurrentIntentService，並將費時的工作，移到 onHandleIntent() 中處裡即可。onHandleIntent() 是被 non-UI thread 所喚起的。因此在這個函式中，你可以放心地去執行你的下載工作，而不用擔心會產生任何的 ANR 錯誤。&lt;/p&gt;

&lt;p&gt;我們先看 #29~#40 行onStart() 這個函式。&lt;/p&gt;

&lt;p&gt;每當你想執行某件費時的工作，透過 Context.startService() 呼叫到 Service.onStart() 時，我們立即產生一個 MyAsyncTask (AsyncTask 的子類，見 #56~#83) 的實例(#37)，並將他放到 m_mapIntent2AsyncTask 這個 HashMap 中(#38)。&lt;/p&gt;

&lt;p&gt;設計這類的樣式，其中一項重要的工作是決定何時要殺掉 Service。在 IntentService 中，每項工作都是循序執行的，因此他利用 stopSelf(int)，來讓系統判斷是否最後一項工作已執行完畢。系統會在最後一項工作已執行完畢時，自動殺掉 Service。不過在 ConcurrentIntentService 中的所有工作，都是並行的，而且每件工作的執行時間也長短不一。因此，我們不能參考 IntentService 的作法，我們必須借助一個 HashMap 來管理，還有哪些待執行的工作，自己決定要殺掉 Service 的時機。&lt;/p&gt;

&lt;p&gt;在 MyAsyncTask 這個類別 (#56~#83) 的 doInBackground() 函式中，我們先將欲執行的工作從 m_mapIntent2AsyncTask 中移除。接下來，再呼叫你設計的 onHandleIntent(Intent)，每個 AsyncTask 執行完後，最終都會執行 onPostExecute()。因此，我們在這個函式中，判斷 m_mapIntent2AsyncTask 中是否還有待執行的工作。如果沒有，那就是這個 Service 的生命該終結的時候 (#73~#74)。&lt;/p&gt;

&lt;p&gt;其他部份的設計邏輯，和 IntentService 類似，請自行研讀。不過，我們為這個 ConcurrentIntentService，還特別加了 cancel() (#19~27) 介面，讓你可以取消所有正在進行或等待執行的工作。&lt;/p&gt;

&lt;p&gt;如何在 Android 應用中，順利處理雲端資源的存取工作，一直是應用開發者的痛苦。不過，透過系統提供的 IntentService 與我自行設計的 ConcurrentIntentService，應當可以幫助開發者減少在處理網路下載時所遇到的問題。&lt;/p&gt;

&lt;p&gt;要寫 Android 應用，一點都不難，不就是 Java。這是我最常聽到，剛跨過入門檻開發者告訴我的一句話。不過當你曾嘗試寫過 Android 的雲端應用後，你應該有所體會，要寫好的一個 Android 的網路應用，這當中還是有許多門檻需要跨過的。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2419245096489751862?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2419245096489751862/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/11/blog-post.html#comment-form' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2419245096489751862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2419245096489751862'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/11/blog-post.html' title='並行下載的完美解決方案'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/TIc4eTuU32I/AAAAAAAAAPM/R3RucKfT4j0/s72-c/downlaod.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2583521814542242924</id><published>2010-11-06T12:27:00.008+08:00</published><updated>2011-02-21T13:38:34.810+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>手機創新設計大會 2010</title><content type='html'>&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/TNTZTL5JhqI/AAAAAAAAAR8/OyZqJptkbJI/2010_11_19_20.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;11 月應邀到在深圳舉辦的&lt;a href="http://www.elexcon.com/conference/cmkc2010/cmkc2010_agenda.html"&gt;第12屆手機創新設計大會&lt;/a&gt;中發表演說。&lt;/p&gt;

&lt;p&gt;大會的時間是 2010 年 11 月 19-20 日，地點在深圳馬可波羅好日子酒店。
我的演說時間是 11am-12pm, 11/20。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;關於這次的演講，我把題目訂為「內容為王的時代」。演講的內容，主要是這篇「&lt;a href="http://ysl-paradise.blogspot.com/2010/08/blog-post.html"&gt;內容為王的時代&lt;/a&gt;」部落格文章的延伸。由於預期參加的人員，會有做硬體，也會有軟體的從業人員。我希望能帶給硬體廠商一些我看到的發展方向，希望能讓這些硬體廠商透過軟體來增加其產品的價值。對於軟體開發商而言，我也會揭露在未來行動平台上的新趨勢與因應之道。&lt;/p&gt;

&lt;p&gt;如果有要參加這個大會的，別忘了打聲招呼。&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-Qni-TLNK2Nc/TWH6ORJ4ixI/AAAAAAAAATM/ynTYPsN5qbk/s1600/DSC_6224.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://1.bp.blogspot.com/-Qni-TLNK2Nc/TWH6ORJ4ixI/AAAAAAAAATM/ynTYPsN5qbk/s320/DSC_6224.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5576012936691354386" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-gmnuPRUyzIc/TWH6Ehp68rI/AAAAAAAAATE/QHE3a0L0bcI/s1600/DSC_6231.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://4.bp.blogspot.com/-gmnuPRUyzIc/TWH6Ehp68rI/AAAAAAAAATE/QHE3a0L0bcI/s320/DSC_6231.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5576012769322005170" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-DnF7kXnpT9w/TWH56QbaauI/AAAAAAAAAS8/BfNfqKH1IDY/s1600/DSC_6076.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://3.bp.blogspot.com/-DnF7kXnpT9w/TWH56QbaauI/AAAAAAAAAS8/BfNfqKH1IDY/s320/DSC_6076.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5576012592899058402" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dr0Y-KjAZB0/TWH5raaPJ8I/AAAAAAAAAS0/o2Gi3b1r17o/s1600/DSC_6247.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://4.bp.blogspot.com/-dr0Y-KjAZB0/TWH5raaPJ8I/AAAAAAAAAS0/o2Gi3b1r17o/s320/DSC_6247.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5576012337880442818" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2583521814542242924?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2583521814542242924/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/11/2010.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2583521814542242924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2583521814542242924'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/11/2010.html' title='手機創新設計大會 2010'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/TNTZTL5JhqI/AAAAAAAAAR8/OyZqJptkbJI/s72-c/2010_11_19_20.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6302714276257751332</id><published>2010-10-08T18:40:00.001+08:00</published><updated>2010-10-08T19:43:11.807+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>免費講座 - 智慧行動生活新世代系列座談會</title><content type='html'>&lt;p align="center"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/TKsd1F5JwHI/AAAAAAAAAQc/kH5-zOn4ZnQ/bnext_header.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這是數位時代與 Samsung 合辦的座談會。&lt;/p&gt;

&lt;p&gt;新竹場時間是 7pm~9pm, 10/21，地點在老爺酒店。&lt;br&gt;
台北場時間是 7pm~9pm, 11/9，地點在富邦國際會議中心。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_a5fZt60mXGw/TK7ydMuqNyI/AAAAAAAAAQs/Xpj6BpVZzh8/s1600/2010-10-08_132100.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 198px; height: 320px;" src="http://3.bp.blogspot.com/_a5fZt60mXGw/TK7ydMuqNyI/AAAAAAAAAQs/Xpj6BpVZzh8/s320/2010-10-08_132100.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5525620376277235490" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;看到活動 DM，我才發現和我一起在新竹場的講者是&lt;a href="http://worker.bluecircus.net/"&gt;工頭堅&lt;/a&gt;。和工頭堅的認識應該早於 2006，當時是源自休息一夏與天下雜誌的合作。只不過因當時工作的關係，沒時間照料休息一夏的發展，所以當初的合作案，也沒太深入的發展。沒想到這 5 年後，又有機會碰面了。&lt;/p&gt;

&lt;p&gt;活動的頁面在 &lt;b&gt;&lt;a href="http://www.bnext.com.tw/edm/samsung/EDM.html"&gt;這裡&lt;/a&gt;&lt;/b&gt;，參加獎就是一本數位時代雜誌，還有抽獎送一台 i9000，這一台我曾經玩過幾分鐘，我喜歡他的畫面品質，不曉得廠商願不願意送我一台測試機？講到這，就不免抱怨 Android 起來，這寫 Android 的應用，還真得在手上有各家不同的手機才行。因為這每家的手機，都有不同的問題，尤其是照相機及各式的 sensors，行為都不同，都快搞死開發者。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6302714276257751332?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6302714276257751332/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/10/blog-post.html#comment-form' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6302714276257751332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6302714276257751332'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/10/blog-post.html' title='免費講座 - 智慧行動生活新世代系列座談會'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/TKsd1F5JwHI/AAAAAAAAAQc/kH5-zOn4ZnQ/s72-c/bnext_header.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1899193734944055561</id><published>2010-10-05T09:00:00.002+08:00</published><updated>2010-10-05T09:14:37.293+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntentService'/><category scheme='http://www.blogger.com/atom/ns#' term='HandlerThread'/><category scheme='http://www.blogger.com/atom/ns#' term='Thread'/><category scheme='http://www.blogger.com/atom/ns#' term='Service'/><category scheme='http://www.blogger.com/atom/ns#' term='Message'/><category scheme='http://www.blogger.com/atom/ns#' term='Handler'/><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><category scheme='http://www.blogger.com/atom/ns#' term='Looper'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncTask'/><title type='text'>深入研究 IntentService 原始碼</title><content type='html'>&lt;p&gt;IntentService Source Code Internals&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SkA2A6LzdCI/AAAAAAAAAH8/1E1c45L1ulc/internals.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在 &lt;a href="http://ysl-paradise.blogspot.com/2010/09/asynctask.html"&gt;小心，AsyncTask 不是萬能的&lt;/a&gt; 中，我提到 &lt;a href="http://developer.android.com/reference/android/app/IntentService.html"&gt;IntentService&lt;/a&gt; 是你在實現下載功能時，最好用的武器之一。&lt;/p&gt;

&lt;p&gt;這次，我們來深入研究 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/app/IntentService.java;h=7c2d3a091d40c0d19fbf14ad12ef98d17dbb28d7;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;IntentService 的原始碼&lt;/a&gt;，看他是如何用短短幾行代碼，來解決這個問題。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
public abstract class IntentService extends Service {
  ...
}
&lt;/textarea&gt;
&lt;p&gt;從 class 的宣告中，你可以知道 IntentService 就是一般的 Service。&lt;/p&gt;

&lt;p&gt;接著他定義一個 ServiceHandler。一般我們在創建 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/Handler.java;h=2a32e543f19f8facb58d78dbc85f7dec72d33c33;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;Handler&lt;/a&gt; 時，都是用預設的建構式。預設的 Handler 建構式，是依附在當前的 thread 身上。所以一般開發者都以為 Handler 一定是依附在 main-thread 上，這是不對的觀念。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
private final class ServiceHandler extends Handler {
  public ServiceHandler(Looper looper) {
    super(looper);
  }
  ...
}
&lt;/textarea&gt;

&lt;p&gt;這個 ServiceHandler，是依附在一個 non-UI thread 的 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/Looper.java;h=69b35404a61bfef79b976b92b4fec1d7d78979a7;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;Looper&lt;/a&gt; 上。Looper 就是訊息迴圈 (message loop)，這是 Android UI 在處理各式訊息時，最重要的元件之一。而 ServiceHandler 建構式中所傳入的 Looper 物件，是在 onCreate() 中所建立的。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
@Override
public void onCreate() {
  super.onCreate();
  HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
  thread.start();

  mServiceLooper = thread.getLooper();
  mServiceHandler = new ServiceHandler(mServiceLooper);
}
&lt;/textarea&gt;

&lt;p&gt;看到了吧，mServiceLooper 就是 thread 物件中的 Looper 物件。這個 thread 物件就是一個 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/HandlerThread.java;h=911439a122271afb114c59952fd8a473af02eeda;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;HandlerThread&lt;/a&gt;，他是一個 non-UI thread。&lt;/p&gt;

&lt;p&gt;所以現在這個 Service，一個帶有 message loop(mServiceLooper) 的 non-UI thread (mServiceHandler) 正一直在背後執行著，監看是否有任何傳入的 message。&lt;/p&gt;

&lt;p&gt;接著，每當你呼叫 startService(new Intent(this, MyIntentService.class)) 啟動 IntentService 時，其實他只是很簡單地送出一個 message 到 mServiceHandler 上。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
@Override
public void onStart(Intent intent, int startId) {
  Message msg = mServiceHandler.obtainMessage();
  msg.arg1 = startId;
  msg.obj = intent;
  mServiceHandler.sendMessage(msg);
}
&lt;/textarea&gt;

&lt;p&gt;我們知道這個 message 最終會由 Handler.handleMessage() 來處理。由於整個 mServiceHandler 是在 non-UI thread 中執行。當他在 handleMessage() 中呼叫你的 onHandleIntent() 時，你的 onHandleIntent() 自然也是在 non-UI thread 中執行。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
private final class ServiceHandler extends Handler {
  ...
  @Override
  public void handleMessage(Message msg) {
    onHandleIntent((Intent)msg.obj);
    stopSelf(msg.arg1);
  }
}
&lt;/textarea&gt;

&lt;p&gt;onHandleIntent() 執行結束後，接著呼叫 &lt;a href="http://developer.android.com/reference/android/app/Service.html#stopSelf(int startId)"&gt;stopSelf(int)&lt;/a&gt;。由於 IntentService 是設計用來可以在一個 Service 中服務多項工作，因此在這裡，不可以呼叫 stopSelf()。&lt;/p&gt;

&lt;p&gt;如果你呼叫 startService() 多次，每一次的呼叫都會被轉成一個 message，並放在 mServiceLooper 的 message queue 中，等待被服務。一個 message 所對應的工作被完成後，才會繼續服務下一個工作。所以，這些等待被服務的工作，並不是一起並行 (Concurrent) 的，而是循序執行。&lt;/p&gt;

&lt;p&gt;當所有的工作都處裡完時，也是 Service 該結束的時候。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
@Override
public void onDestroy() {
  mServiceLooper.quit();
}
&lt;/textarea&gt;

&lt;p&gt;在 onDestroy() 中，唯一要做的事，就是要將 mServiceLooper 停下來。&lt;/p&gt;

&lt;p&gt;從研究這個 IntentService 的原始碼，我們可以學到如何運用簡單的 pattern (Service + Handler + HandlerThread)，幫我們更簡易與有系統地，完成我們所想要做的事。&lt;/p&gt;

&lt;p&gt;最後我們先前說過，在 IntentServcie 中等待被服務的工作，並不會被一起並行，而是循序執行。如果你今天想要這些等待被服務的工作，能夠一起被並行，在研讀完這個 IntentService 的原始碼後，你自己知不知道如何寫個可支援並行工作的 IntentService？&lt;/p&gt;

&lt;p&gt;提示：可以用 Service + AsyncTask 的組合。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1899193734944055561?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1899193734944055561/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/10/intentservice.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1899193734944055561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1899193734944055561'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/10/intentservice.html' title='深入研究 IntentService 原始碼'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SkA2A6LzdCI/AAAAAAAAAH8/1E1c45L1ulc/s72-c/internals.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8911299273397944951</id><published>2010-09-28T19:18:00.012+08:00</published><updated>2010-10-10T10:22:26.643+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>Google DevFest 2010 @Taipei</title><content type='html'>&lt;p align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TKHPVFCdZ0I/AAAAAAAAAPk/eM8nJ-esPZc/devfest2010-logo.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;為了弭補無法參加 2010 Google Developer Day 開發者的遺憾，Google 今年在&lt;a href="http://code.google.com/events/devfests/2010/sydney.html"&gt;雪梨&lt;/a&gt;、&lt;a href="http://code.google.com/events/devfests/2010/israel.html"&gt;以色列&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/asia1.html"&gt;馬尼拉&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/asia2.html"&gt;新加坡&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/taipei.html"&gt;台北&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/hongkong.html"&gt;香港&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/asia3.html"&gt;吉隆坡&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/jakarta.html"&gt;雅加達&lt;/a&gt;以及&lt;a href="http://code.google.com/intl/zh-TW/events/devfests/2010/bangkok.html"&gt;曼谷&lt;/a&gt;等各地舉辦 DevFest。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;各地演講涵蓋的範圍不外乎是 Android, HTML5/Chrome, Maps, Social 等主題，看來這幾項應該是 Google 這一、兩年的主要發展重點。&lt;/p&gt;
&lt;p&gt;台北場的日期是 2010/10/1 星期五，地點在台大醫院國際會議中心 201 室。&lt;/p&gt;
&lt;p&gt;今年榮幸受到邀請，要給大家一個關於我 Android 應用現況與 Android 開發經經驗分享的演講。底下是台北場的議程，紅色標示的部分，就是要我預計要上台講的那一場。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TKP-nYOea1I/AAAAAAAAAP0/0RfLkNprAqo/agenda.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;你有沒有特別想聽我講什麼的？如果時間允許的話，我可以特別準備你想聽的東西。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2010/10/1 後記&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;我的投影片：&lt;br&gt;
&lt;iframe width=100% height=320px frameborder=0 src=https://docs.google.com/gview?a=v&amp;pid=explorer&amp;chrome=false&amp;api=true&amp;embedded=true&amp;srcid=0BzsUaCH0kw7QNjc5YzgxNWQtZDk0OC00YWZmLTllYjktNWM4YmQ5YmQ4N2Jm&amp;hl=en&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;p&gt;當天的議程：&lt;br&gt;
&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TKaW7F9VG-I/AAAAAAAAAP8/N2uAbN44CmQ/agenda.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Local demo session 的介紹：&lt;br&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_a5fZt60mXGw/TKaXL9TDr3I/AAAAAAAAAQE/NwnPJjSfZv4/s1600/intro.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 48px;" src="http://3.bp.blogspot.com/_a5fZt60mXGw/TKaXL9TDr3I/AAAAAAAAAQE/NwnPJjSfZv4/s320/intro.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5523268224705343346" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Speaker's badge：&lt;br&gt;
&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/TKaXZbotDYI/AAAAAAAAAQM/_TsEyvNLLbA/badge.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;當天來了快 700 人，把 201 會議室都擠爆了：&lt;br&gt;
&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TKaXvtq_RFI/AAAAAAAAAQU/r13dkyRex5U/201.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/TLEiiC0AW2I/AAAAAAAAAQ0/1Cn6Hhf3Pp4/IMG_0122.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TLEjEfwt6EI/AAAAAAAAARU/2rkf_DJWf-o/IMG_0141.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/TLEi_iKOtrI/AAAAAAAAARM/LErblosouik/IMG_0133.JPG" border="0" /&gt;&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8911299273397944951?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8911299273397944951/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/09/google-devfest-2010-taipei.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8911299273397944951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8911299273397944951'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/09/google-devfest-2010-taipei.html' title='Google DevFest 2010 @Taipei'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/TKHPVFCdZ0I/AAAAAAAAAPk/eM8nJ-esPZc/s72-c/devfest2010-logo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-8136272427792427675</id><published>2010-09-21T09:00:00.001+08:00</published><updated>2010-10-24T11:44:18.241+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>2010 Android平台社群開發大會</title><content type='html'>&lt;p align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TI8uX8gcfdI/AAAAAAAAAPU/OGIlzq8gTVA/2010_android_developer.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ctimes.com.tw/"&gt;零組件雜誌&lt;/a&gt;與&lt;a href="http://www.moko365.com/"&gt;仕橙研策&lt;/a&gt; 將於 2010 年 10 月 21/22 兩天在台大應力所國際會議廳舉辦『&lt;a href="http://www.ctimes.com.tw/cf/ShowCF.asp?O=201010210930000151"&gt;2010 Android平台社群開發大會&lt;/a&gt;』。我也應邀於 10/22 (星期五)，給個 Android 與雲端結合之相關講題。&lt;/p&gt;

&lt;p&gt;誠如我一直說的，Android 的應用並不僅限於手機。不管是平板電腦、網路電視或是車載資通娛樂等等設備，只要是需要連網功能，以及一個與人互動的觸控螢幕的嵌入式設備，都很適合應用 Android 系統。因此，這兩年這些嵌入式設備相關廠商無不積極地往 Android 靠攏，讓 Android 的影響力不斷擴大。為凝聚產業與社群力量，零組件雜誌特地舉辦此次 Android 平台社群開發大會，希望提供台灣開發者一個技術交流的機會。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這個活動不是免費的，詳細的時間與地點請見 &lt;a href="http://www.ctimes.com.tw/cf/ShowCF.asp?O=201010210930000151"&gt;這裡&lt;/a&gt;。底下是這兩天的議程：&lt;/p&gt;
&lt;p&gt;2010/10/21 (星期四)&lt;/p&gt;
&lt;table width="90%" border="1" align="center" cellpadding="4" cellspacing="1" bordercolor="#000000" &gt;
  &lt;tbody&gt;&lt;tr &gt;
&lt;td&gt;時間&lt;/td&gt;&lt;td&gt;主題&lt;/td&gt;&lt;td&gt;講師&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;09:00 - 09:30&lt;/td&gt;&lt;td colspan="2" &gt;報到(簽到及領取收據)&lt;br&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;09:30 - 10:00&lt;/td&gt;&lt;td &gt;Android版本發展與市場定位&lt;/td&gt;&lt;td &gt;Google公司&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;10:00 - 10:30&lt;/td&gt;&lt;td &gt;Android Development on New ARM Architecture&lt;/td&gt;&lt;td &gt;ARM&lt;br&gt;應用工程師&lt;br&gt;Leon Chen&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;10:30 - 10:45&lt;/td&gt;&lt;td colspan="2" &gt;Tea Time&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;10:45 - 11:15&lt;/td&gt;&lt;td &gt;Android平台與系統晶片整合開發策略&lt;/td&gt;&lt;td &gt;工研院資通所副所長&lt;br&gt;謝明得博士&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;11:15 - 12:00&lt;/td&gt;&lt;td &gt;中國大陸Android市場與社群發展分析&lt;/td&gt;&lt;td &gt;北京易聯致遠CEO&lt;br&gt;靳岩&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;12:00 - 13:30&lt;/td&gt;&lt;td colspan="2" &gt;午餐時間&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;13:30 - 14:10&lt;/td&gt;&lt;td &gt;中國高階Android智慧手機開發策略&lt;/td&gt;&lt;td &gt;中一無線架構師&lt;br&gt;Jollen Chen&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;14:10 - 14:50&lt;/td&gt;&lt;td &gt;Android多媒體處理技術&lt;/td&gt;&lt;td &gt;福州瑞芯微?子&lt;br&gt;IC &amp;amp; 手機事業部總經理&lt;br&gt;陳鋒&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;14:50 - 15:10&lt;/td&gt;&lt;td colspan="2" &gt;Tea Time&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;15:10 - 15:50&lt;/td&gt;&lt;td &gt;Android無線通訊模組技術&lt;/td&gt;&lt;td &gt;海華科技研發處&lt;br&gt;黃忠諤處長&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;15:50 - 16:30&lt;/td&gt;&lt;td &gt;易於更新及維護的Android系統整合設計要點&lt;/td&gt;&lt;td &gt;台北科技大學&lt;br&gt;資工系助理教授&lt;br&gt;梁文耀博士&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;16:30 - 16:45&lt;/td&gt;&lt;td colspan="2" &gt;Tea Time&lt;/td&gt;&lt;/tr&gt;
&lt;tr &gt;
&lt;td &gt;16:45 - 17:15&lt;/td&gt;&lt;td &gt;Android vs. iPhone開發環境與社群競賽&lt;/td&gt;&lt;td &gt;台灣大學&lt;br&gt;資工系助理教授&lt;br&gt;陳彥仰博士&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;2010/10/22 (星期五)&lt;/p&gt;

&lt;table width="90%" border="1" align="center" cellpadding="4" cellspacing="1" bordercolor="#000000" &gt;
  &lt;tbody&gt;
    &lt;tr &gt; 
      &lt;td&gt;時間&lt;/td&gt;
      &lt;td&gt;主題&lt;/td&gt;
      &lt;td&gt;講師&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;09:00 - 09:30&lt;/td&gt;
      &lt;td colspan="2" &gt;報到(簽到及領取收據)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;09:30 - 10:00&lt;/td&gt;
      &lt;td &gt;Preparing for Connected TV, Google TV and Beyond&lt;/td&gt;
      &lt;td &gt;MIPS&lt;br&gt;
        策略行銷總監&lt;br&gt;
        Kevein Kitagawa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;10:00 - 10:30&lt;/td&gt;
      &lt;td &gt;Android for eReaders and Smartbooks&lt;/td&gt;
      &lt;td &gt;Freescale亞太區&lt;br&gt;
        多媒體應用處理器資深經理&lt;br&gt;
        蔣宏&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;10:30 - 10:45&lt;/td&gt;
      &lt;td colspan="2" &gt;Tea Time&lt;br&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;10:45 - 11:25&lt;/td&gt;
      &lt;td &gt;瞭解你的程式﹣Android平台之Java側寫工具&lt;/td&gt;
      &lt;td &gt;清華大學&lt;br&gt;
        資工系系主任&lt;br&gt;
        金仲達博士&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr bgcolor="#FF9900" &gt; 
      &lt;td &gt;&lt;strong&gt;11:25 - 12:15&lt;/strong&gt;&lt;/td&gt;
      &lt;td &gt;&lt;strong&gt;Android 與雲端運算之整合現況與趨勢
        &lt;/strong&gt;&lt;/td&gt;
      &lt;td &gt;&lt;strong&gt;ysl&lt;br&gt;
        程式天堂主持人&lt;br&gt;
        盧育聖&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;12:15 - 13:30&lt;/td&gt;
      &lt;td colspan="2" &gt;午餐時間&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;13:30 - 14:10&lt;/td&gt;
      &lt;td &gt;Android開放手機研發成果&lt;/td&gt;
      &lt;td &gt;中正大學資工系&lt;br&gt;
        助理教授&lt;br&gt;
        羅習五博士&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;14:10 - 14:50&lt;/td&gt;
      &lt;td &gt;0xdroid成果與發展藍圖&lt;/td&gt;
      &lt;td &gt;0xlab Developer&lt;br&gt;
        Kanru&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;14:50 - 15:10&lt;/td&gt;
      &lt;td colspan="2" &gt;Tea Time&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;15:10 - 15:50&lt;/td&gt;
      &lt;td &gt;Android系統車載娛樂平台技術開發&lt;/td&gt;
      &lt;td &gt;工研院南分院&lt;br&gt;
        家網中心&lt;br&gt;
        程永華&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;15:50 - 16:30&lt;/td&gt;
      &lt;td &gt;Using high-level view on Android Porting&lt;/td&gt;
      &lt;td &gt;仕橙3G教室技術顧問&lt;br&gt;
        鍾文昌&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;16:30 - 16:45&lt;/td&gt;
      &lt;td colspan="2" &gt;Tea Time&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr &gt; 
      &lt;td &gt;16:45 - 17:25&lt;/td&gt;
      &lt;td &gt;Android應用架構的樣式導向設計&lt;br&gt;
        (Pattern-Oriented Design)&lt;/td&gt;
      &lt;td &gt;台灣大學&lt;br&gt;
        電機系教授&lt;br&gt;
        王勝德博士&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;大會的 DM&lt;br&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_a5fZt60mXGw/TMOq5nOIUVI/AAAAAAAAAR0/5NIy8IEmRIU/s1600/dm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 228px;" src="http://4.bp.blogspot.com/_a5fZt60mXGw/TMOq5nOIUVI/AAAAAAAAAR0/5NIy8IEmRIU/s320/dm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5531452674098614610" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我的演講在第二天&lt;br&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_a5fZt60mXGw/TMOq07-JxpI/AAAAAAAAARs/_vI_D9K3J2k/s1600/day2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 201px;" src="http://2.bp.blogspot.com/_a5fZt60mXGw/TMOq07-JxpI/AAAAAAAAARs/_vI_D9K3J2k/s320/day2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5531452593769399954" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;第二天約有1百多位聽眾&lt;br&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TMOqv7g9UOI/AAAAAAAAARk/zn7aujHGcQs/people.jpg" border="0" /&gt;&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-8136272427792427675?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/8136272427792427675/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/09/2010-android.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8136272427792427675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/8136272427792427675'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/09/2010-android.html' title='2010 Android平台社群開發大會'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/TI8uX8gcfdI/AAAAAAAAAPU/OGIlzq8gTVA/s72-c/2010_android_developer.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-849208005293548459</id><published>2010-09-14T09:00:00.004+08:00</published><updated>2010-09-14T09:18:03.700+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntentService'/><category scheme='http://www.blogger.com/atom/ns#' term='Activity'/><category scheme='http://www.blogger.com/atom/ns#' term='Thread'/><category scheme='http://www.blogger.com/atom/ns#' term='Service'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncTask'/><title type='text'>小心，AsyncTask 不是萬能的</title><content type='html'>&lt;p&gt;Don't only use AsyncTask for your download task&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/TIc4eTuU32I/AAAAAAAAAPM/R3RucKfT4j0/downlaod.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;要進入 Android 應用開發之門，真的一點都不難，不就是 Java 嘛。這是我最常聽到，剛跨過入門檻開發者告訴我的一句話。&lt;/p&gt;

&lt;p&gt;這句話其實是沒有錯的，Android 應用開發的入門檻，比起其他平台，已經低了許多。要跨過這門檻，的確是輕鬆容易許多。不過，如果要從入門到進階，邁向下一個關卡，你第一個要了解的是 &lt;a href="http://developer.android.com/guide/topics/fundamentals.html#actlife"&gt;Activity 的生命週期&lt;/a&gt; 和 &lt;a href="http://developer.android.com/guide/topics/fundamentals.html#proclife"&gt;Process 的生命週期&lt;/a&gt;，而且是要『&lt;b&gt;透 . 徹 . 了 . 解&lt;/b&gt;』。這一步很重要，卻被許多開發者輕忽了。&lt;/p&gt;

&lt;p&gt;尤其這 Activity 的生命週期，實際上的行為會比你從文件上看到的說明還來的複雜。也因此，我發現有不少，即使已有多個 Android 應用開發經驗的開發者，在開發 Android 應用時，還是栽了不少跟斗。這第一個問題，就出在這些開發者，還是沒達到我說的『透徹了解』境界。因此，今年的&lt;a href="http://ysl-paradise.blogspot.com/2009/02/2009-android.html"&gt;進階應用開發課程&lt;/a&gt;，特地將這一部分加入進來，希望對想踏入進階之門的開發者，有所助益。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;好了，如果你已經有一段 Android 應用的開發經驗，那應該知道在 Main-thread(UI-thread) 中，你不能執行一件需時 5 秒以上的工作，例如網路或資料庫的存取、音樂的播放等等。要不然你的應用就會產生 &lt;a href="http://developer.android.com/guide/practices/design/responsiveness.html"&gt;ANR 錯誤&lt;/a&gt;。要解決這個 ANR 錯誤，唯一的方法就是自行建立一個新的 Thread 物件，並將該費時的工作放在 Thread.run() 中執行。關於如何解決 ANR 的細節，我建議你先讀 &lt;a href="http://android-developers.blogspot.com/2009/05/painless-threading.html"&gt;Painless threading&lt;/a&gt;，這是一篇值得一讀的好文章。&lt;/p&gt;

&lt;p&gt;在這篇文章中，介紹了從 Android 1.5 才加入的 AsyncTask。AsyncTask 很好用，同時我也建議你研究他的 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/AsyncTask.java;h=d28148c7652a8550580ad1262403d1693ed0f9ff;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;原始碼&lt;/a&gt;。AsyncTask 就是太好用了，有些開發者就認為，單用 AsyncTask 就能解決他的問題。其實，我早在&lt;a href="http://ysl-paradise.blogspot.com/2009/01/service.html"&gt;請將要執行很久的程式碼，放在 Service 中執行&lt;/a&gt;這篇中，就已提過。單將費時的程式碼放在 Thread.run() 中執行，還是不夠的，你只解決一半的問題。不過，多數開發者不是便宜行事，就是不相信我說的。這些便宜行事的開發者，就是在賭這系統強制殺掉你應用的機率有多少；而那些不相信我說的，就是因為他沒有透徹了解 Activity/Process 的生命週期。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;完整解決費時工作的方法，不僅要將費時的工作放在 Thread.run() 中執行，還要將這個 Thread 放在 Service 中執行。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;你要知道 Android 的四大元件，Activity, BroadcastReceiver, Servcice and ContentProvider，除了 ContentProvide 外，全都是在 main-thread 中執行。而這些元件中，就只有 Service 的生命週期是最持續(長久)的。Activity 只要執行到 onPause()，BroadcastReceiver 只要離開 onReceiver()，系統隨時會殺掉這些元件，而且機率還很高。Service 當然也是會被系統砍掉，只不過它的優先順序，排在較低等級。自然被系統砍掉的機率就低很多。你還可以更進一步利用 Serivce.startForeground() 降低你被系統殺掉的優先順序。關於這部分，你要熟讀 &lt;a href="http://developer.android.com/guide/topics/fundamentals.html#proclife"&gt;Process 的生命週期&lt;/a&gt; 與 &lt;a href="http://developer.android.com/reference/android/app/Service.html#WhatIsAService"&gt;What is a Service?&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;其實為了減輕開發者的負擔， Android 1.5 已經加了 &lt;a href="http://developer.android.com/reference/android/app/IntentService.html"&gt;IntentService&lt;/a&gt; 這個新類別。&lt;b&gt;如果你要寫個用到網路的應用，用這個 IntentService 才是你的完美解決方案。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;要使用這個 IntentService 其實很簡單，你只要繼承這個 IntentService 並將該項費時的工作，移到 onHandleIntent() 中即可。onHandleIntent() 是被 non-UI thread 所喚起的。因此在這裏面你可以放心地去執行你的下載工作。&lt;/p&gt;

&lt;p&gt;下次，我們來研究一下這個 IntentService 的原始碼，看他是如何做的。&lt;/p&gt;

&lt;p&gt;參考資料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2009/05/painless-threading.html"&gt;Painless threading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html"&gt;Multitasking the Android Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html"&gt;Multithreading For Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/app/IntentService.java;h=7c2d3a091d40c0d19fbf14ad12ef98d17dbb28d7;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;IntentService.java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/Handler.java;h=2a32e543f19f8facb58d78dbc85f7dec72d33c33;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;Handler.java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/os/Looper.java;h=69b35404a61bfef79b976b92b4fec1d7d78979a7;hb=71beeab14a891297b6658c4aeb47557083091aa1"&gt;Looper.java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-849208005293548459?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/849208005293548459/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/09/asynctask.html#comment-form' title='12 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/849208005293548459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/849208005293548459'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/09/asynctask.html' title='小心，AsyncTask 不是萬能的'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/TIc4eTuU32I/AAAAAAAAAPM/R3RucKfT4j0/s72-c/downlaod.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5314483524777081469</id><published>2010-08-24T09:00:00.003+08:00</published><updated>2010-08-25T09:06:04.532+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>內容為王的時代</title><content type='html'>&lt;p&gt;The era of content is king&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/THI4Ia7BzdI/AAAAAAAAAO0/JVtx9YYOL88/content_is_king.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;你覺得一台 Casio 的計算機和個人電腦相比，差異點有哪些？&lt;/p&gt;

&lt;p&gt;這個問題，應該很好回答，隨便都可以找到差異點。但是如果我將個人電腦上的軟體都移除，只剩下 "小算盤" 這個軟體，並且將個人電腦上可自行安裝軟體的功能也關閉。此時，你覺得這台個人電腦和 Casio 計算機的差異在哪？我猜你的回答可能只剩下，螢幕比較大，外型比較漂亮還有價錢比較貴。是嗎？&lt;/p&gt;

&lt;p&gt;我相信這你很清楚這計算機與個人電腦相比的例子。我再問你，你覺得 &lt;a href="http://www.e-zone.com.hk/tips.php?tipsid=3434"&gt;功能性手機 (feature phone)&lt;/a&gt; 和 &lt;a href="http://zh.wikipedia.org/zh-tw/%E6%99%BA%E8%83%BD%E6%89%8B%E6%9C%BA"&gt;智慧型手機 (smart phone)&lt;/a&gt; 相比，他們的差異點又有哪些？&lt;/p&gt;

&lt;span class="fullpost"&gt;

&lt;p&gt;我想多數人的回答都是，智慧型手機可以讓我自行安裝與移除應用程式。這答案絕對不是比較大台或是比較貴就是智慧型手機，更不是有 Apple, Symbian, Microsoft 或 Android 加持的就叫智慧型手機。&lt;/p&gt;

&lt;p&gt;沒錯！智慧型手機的重點就在&lt;b&gt;可讓使用者自行安裝其所需要的應用程式&lt;/b&gt;。手機只是個載體，在那上面執行的應用才是智慧的來源。舉例來說，手機就像是人的軀體，裡面的 CPU 是人的大腦。但是光這樣，人還是無法變聰明，你必須要接受教育，讀很多書，才會有智慧。而每個人所讀的書，就像是手機上的應用。所以即使你我都是用 Nexus One 的 Android 手機，但因為每個人的需求不同，安裝的應用也會不同。用了一陣子之後，每台 Nexus One 手機，都會是獨一無二的，除非你只用內建的應用。&lt;/p&gt;

&lt;p&gt;不過僅有 "可自行安裝應用" 這點還是不夠的。Windows Mobile 或 Symbian 之類的智慧型手機，好幾年前就有了，問問曾經用過這類智慧型手機的朋友，會自行安裝應用的有多少人？我想這答案應該很清楚，大家都不常自行安裝應用。為什麼？因為他們不知道要去哪裡下載應用，也就是說他們不曉得書店在哪裡，要去哪裡買書。所以，這些人都將一台兩萬多元的智慧型手機，當 0 元功能性手機在使用。&lt;/p&gt;

&lt;p&gt;我想一個智慧型手機的重點應該是，&lt;b&gt;有個單一的入口點，讓使用者找到與安裝應用程式&lt;/b&gt;。iPhone 與 Android 手機透過內建的 Market 應用，解決了這個不知道去哪裡下載應用的問題。一個智慧型手機如果沒有了 Market 應用，就算他有 Android 的加持，哪和功能型手機有甚麼兩樣？聯發科依照其在功能性手機時代的成功模式，就算推出了 Android 解決方案，但是沒有了 Market 應用，那 MTK Android 手機和功能性手機的差別在哪？&lt;/p&gt;

&lt;p&gt;有 Market 應用還不夠。一個 Market 如果不能像是一個甚麼都有的量販店，只能像是你家旁邊的小雜貨店，那有和沒有這個 Marekt，對使用者而言又有何差別？電信商推出的自家 Market，裡面的應用如果沒有數萬個。對使用者而言，如果手機已內建官方的 Market (如 AppStore 和 Android Market)，還需要這個電信商的 Market 嗎？除非你自家的 Market 有獨到的特色。&lt;/p&gt;

&lt;p&gt;我並不是說山寨智慧型手機 (沒有內建 Market 應用的智慧型手機)，和山寨 Market (沒有貶低的意思，純粹是指非官方的 Markets) 沒有出路。單打獨鬥，我還沒看到成功的機會點。只有互相合作，才有成功的可能。這怎麼說？&lt;/p&gt;

&lt;p&gt;會成功的山寨 Market，我個人覺得只有兩種。一種是專門做盜版的市場，那就真的是山寨 Market 了。不過，這只有在特定地區才有生存的空間。另一種會成功的山寨 Market，就是在手機內建應用市場上，能占有最高的市占率。要寫個 Market 應用，不是一件很困難的工作，困難的是如何能擁有數萬個應用，並能持續地更新和成長。如果 Market 的經營者，還想靠寄送 email 的方式，邀請開發者來免費支援的話。我可以說，這方式一點都不可行。我曾經有一個月，收到數十封這樣的 emails，他們的下場全是進了垃圾桶。我會這樣做，多數的開發者也是如此。&lt;/p&gt;

&lt;p&gt;這道理，其實 Market 經營者也知道。只不過，他們還是以舊時代 (通路是王) 的思維在經營 Market。他們不知道的是，一個以內容 (應用及應用開發者) 為王的時代，已經悄悄開始了。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;山寨 Market 必須結合山寨智慧型手機，才有機會。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;對山寨智慧型手機製造商來說，只有內建 Market 應用，才能彰顯這智慧型手機的價值。山寨手機沒機會內建官方的 Market，如果能內建一個內容豐富的山寨 Market ，也算達到目的。對山寨 Market 經營者而言，只要能讓所有的山寨智慧型手機，都內建你的 Markete 應用。你根本不用去一一拜託眾多的應用開發者，只要你的 Market 有一定的市佔率，開發者自然會將應用放上來。要如何才能讓所有的山寨手機內建你的山寨 Market？我想這唯一的控球權，還是掌握在提供山寨手機平台解決方案提供者的那一方。&lt;/p&gt;

&lt;p&gt;看完了手機，pad 與電子書也都有同樣的問題。pad 與電子書在硬體功能上，我覺得兩岸的廠商一定可以把他們發揮到極致，這是無庸置疑的。可是一個沒有 Market 的 pad，對使用者而言，這一台 pad 和 Casio 的計算機相比有何兩樣？在深圳，多數的 pads 多是執行 Android 系統。Google 短期內看來也不會將 Android Market 授權給 pad 廠商。所以這些 pad 和山寨智慧型手機都有相同的問題。沒有 Market 和沒有內容是相同的，沒有新應用，使用者很快就玩膩了。就電子書來說，一個只能下載有限書籍的電子書，他能在使用者的手上能用多久？台灣如果沒有一個獨立的書籍內容發行商來整合眾家的出版社，我不覺得這電子書會有市場。&lt;/p&gt;

&lt;p&gt;山寨智慧型手機、pad 與電子書，他們的問題，最終都會在內容上。&lt;b&gt;只有手上握有內容的才是老大。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;一個以&lt;b&gt;內容為王的時代，已經悄悄開始了&lt;/b&gt;，這是個趨勢。最後的結果會是如何，我也不知道。不過，這世界就是因為有不斷的改變，才變得有趣。就讓我們一起拭目以待，一起走過。&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5314483524777081469?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5314483524777081469/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/08/blog-post.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5314483524777081469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5314483524777081469'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/08/blog-post.html' title='內容為王的時代'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/THI4Ia7BzdI/AAAAAAAAAO0/JVtx9YYOL88/s72-c/content_is_king.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-865438021105753507</id><published>2010-08-23T09:00:00.001+08:00</published><updated>2010-08-24T11:34:48.001+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>新竹 Android 整合開發之夜</title><content type='html'>&lt;p&gt;Android Party @Hsinchu&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/THMjLL9-ejI/AAAAAAAAAO8/wGgwodWMFnQ/android_ice.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在台灣要辦社群活動，幾乎都會選在台北。新竹地區很難得有主辦單位，想辦這樣吃力不討好，又沒錢賺的活動。&lt;/p&gt;

&lt;p&gt;不過這次難得高煥堂老師願意挺身，出面主辦這次的新竹 Android 之夜活動，加上自強基金會提供的免費場地，讓處在新竹地區的廠商或工程師們，也能在星期三小周末的夜晚，有個不同的知識盛宴。在這次的活動中，我當然也贊助一個講題－『&lt;b&gt;Android結合雲端之發展趨勢&lt;/b&gt;』。&lt;/p&gt;

&lt;p&gt;底下是這次活動的詳細內容：&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;活動議程：&lt;br&gt;
6:30 ~ 7:00PM 入場(簽名報到)&lt;br&gt;
7:00 ~ 7:05PM 開幕致歡迎詞&lt;br&gt;
7:05 ~ 7:45PM Java與C/C++整合開發工具及用法&lt;br&gt;
7:45 ~ 8:00PM Tea Time&lt;br&gt;
8:00 ~ 8:25PM 應用框架(Framework)整合開發要點&lt;br&gt;
8:25 ~ 8:50PM 產業實例探討：從MTK + Android看主動型API的威力&lt;br&gt;
&lt;b&gt;8:50 ~ 9:10PM 產業趨勢：Android結合雲端之發展趨勢&lt;/b&gt;(盧育聖)&lt;br&gt;
9:10 ~ 9:30PM Tea Time(聯誼交流)&amp; 散會&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;時間：9/8(三)，19:00-21:30&lt;/p&gt;

&lt;p&gt;地點：新竹市光復路二段101 號研發大樓&lt;/p&gt;

&lt;p&gt;這個活動是免費的，不過要先&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=99C105"&gt;到這裡報名&lt;/a&gt;。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-865438021105753507?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/865438021105753507/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/08/android_23.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/865438021105753507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/865438021105753507'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/08/android_23.html' title='新竹 Android 整合開發之夜'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/THMjLL9-ejI/AAAAAAAAAO8/wGgwodWMFnQ/s72-c/android_ice.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5557962452984233897</id><published>2010-08-11T09:00:00.007+08:00</published><updated>2012-01-06T14:13:39.871+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='press'/><title type='text'>我與 Android 之媒體相關報導文章</title><content type='html'>&lt;div align="center"&gt;&lt;p&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_a5fZt60mXGw/TGDVLW601SI/AAAAAAAAAOs/AcWjTIEVCxw/mm_report.jpg" /&gt;&lt;/div&gt;我永遠記得，2008 年 5 月我開始與 Android 結下不解之緣。&lt;br /&gt;
剛開始時，覺得很孤單，因為當時在台灣或是兩岸，研究 Android 的人不多。絕大數的使用者，對於甚麼是 Android，更是連聽都沒聽過。雖然孤單，不過那時的我，心倒是快樂的。沒有雜事的煩擾，純粹研究新的趨勢與技術；對我而言，是自在與愉悅。如果有天堂，應該也是如此而已 (這也是我取這部落格名的主要原因之一)。&lt;/p&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;p&gt;隨著研究一步一步地深入，對 Android 也越來越有感覺了。當時，我心裡常想，這次 Google 真的是佛心大發了，釋出這整個 Android 的原始碼。如果拿這 Android，只用在手機平台上，還真是小看他了；其最大的商機，以當時的我來看，反而是在各式的嵌入式設備。對於這個應用 Android 到嵌入式設備趨勢的想法，我到目前為止，還是沒變。從 2010 以來，也很高興看到兩岸嵌入式廠商，終於開始看到這塊，也逐漸轉移研發重心在 Android 上頭。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;除此之外，我對於這個智慧型手機平台上的應用，也有許多想法。有了想法，總得要驗證一下這想法或預測是否正確。因此，這兩年也寫了不下 10 多個 Android 應用。多數的應用，都是我的實驗品，用來驗證我的想法。從實驗的結果來看，幸運的是，多數想法還是正確的。所以這段時間，也透過社群的活動，媒體的訪問或是公開的演講，分享我的實驗結果與心得。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;不過這些心得，透過口傳的速度還是太慢了。還是媒體朋友的文筆功力了得，能將我的想法轉化成文章分享給更多人看。因此，最近開始整理，這幾年我自己與 Android 相關的報章雜誌報導。除了整理，主要的目的，還是想對未來的自己，有個交代。&lt;/p&gt;&lt;br /&gt;
&lt;b&gt;2012/01&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;非凡58 新聞台 - 手機 App 專輯報導&lt;/b&gt;&lt;br /&gt;
2012 1/1 非凡58台新聞特攻隊節目，關於手機 App 的報導。訪問人物：癮科技/吳顯二, 聖星科技/盧育聖 (Sam Lu)&lt;br /&gt;
&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/cLcMqtTjFxM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2011/07&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;商業週刊 No.1235 - 找到消費者痛點　一人月入三十萬&lt;/b&gt;&lt;br /&gt;
想不到記者還跑去問簡立峰關於我獲邀參加 Google I/O 一事，我自己都不曉得我是台灣唯一一個通過邀請的&lt;br /&gt;
&lt;a href="https://picasaweb.google.com/a0soft/eZSBJG#5632390217200938898"&gt;1/2&lt;/a&gt;, &lt;a href="https://picasaweb.google.com/a0soft/eZSBJG#5632390391374516530"&gt;2/2&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;壹週刊 No.529 - app 掏金術&lt;/b&gt;&lt;br /&gt;
希望藉由我的成績，鼓舞更多台灣 app 開發者，也希望大家立足台灣，放眼全球&lt;br /&gt;
&lt;a href="https://picasaweb.google.com/a0soft/eZSBJG#5629948788768618946"&gt;1/4&lt;/a&gt;, &lt;a href="https://picasaweb.google.com/a0soft/eZSBJG#5629948858525644274"&gt;2/4&lt;/a&gt;, &lt;a href="https://picasaweb.google.com/a0soft/eZSBJG#5629948931270267954"&gt;3/4&lt;/a&gt;, &lt;a href="https://picasaweb.google.com/a0soft/eZSBJG#5629948999985122050"&gt;4/4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2011/01&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.udn.com/cbk118628/4827077"&gt;策略行銷／雲端軟體好創意 抓得住眼球&lt;/a&gt; 2011/1/25&lt;br /&gt;
經濟日報的報導。記者說是台灣 Google 介紹她來採訪我的，何時我變成 Google 開發者的代言人了?&lt;br /&gt;
我覺得這篇文章將 mobile app store 硬扯上 cloud 實在有點牽強。&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2010/07&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dev.10086.cn/upload/developers_mag/vol7/#"&gt;中國移動開發者雜誌 Vol. 7&lt;/a&gt; 2010/07&lt;br /&gt;
第一次上電子雜誌的封面。&lt;br /&gt;
&lt;a href="http://dev.10086.cn/news/interview/5038.html"&gt;隨興工作快樂生活：盧育聖與Android的不解之緣&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2010/05&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5475453959390210914"&gt;蘋果日報 - 手機玩導遊軟體&lt;/a&gt; 2010/05/20&lt;br /&gt;
上頭有介紹休息一夏的 Android 手機應用。&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2010/04&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5461789194131884738"&gt;iThome No. 445 - IT 人甘苦談&lt;/a&gt; 2010/04/03-04/09&lt;br /&gt;
放棄百萬年薪，投身 Android&lt;/li&gt;

&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5458359423162038082"&gt;網路資訊 - Community People&lt;/a&gt; 2010/04&lt;br /&gt;
盧育聖：新的人生，從 Android 開始    &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5458359423162038082"&gt;Page 1&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5458359425933282674"&gt;Page 2&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5458359432035112178"&gt;Page 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2010/03&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ic975.com/Main/Rundown.ic?id=223"&gt;IC 之音電台 - 一人.COM&lt;/a&gt; 2010/03/30&lt;br /&gt;
第一次接受電台的訪問，主持人是數位時代的總編林文玲小姐。原來錄音室是這麼地擁擠。&lt;/li&gt;

&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5447632799231639730"&gt;Yahoo - 隨身鼓應用&lt;/a&gt; 2010/03&lt;br /&gt;
這個隨身鼓的點子我的，怎麼記者寫文章與新聞報導時，都會掐頭去尾。最後這報導的內容感覺應用是我夥伴想的。Orz&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=J0_sXNIlkTE"&gt;民視台語新聞報導&lt;/a&gt;   &lt;a href="http://www.youtube.com/watch?v=bCGPhuA2Byo"&gt;華視國語新聞報導&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2010/02&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439133247243721426"&gt;數位時代 No. 189 - 中文手機應用程式 30 強&lt;/a&gt; 2010/02&lt;br /&gt;
辭職玩 Android，中年危機變轉機   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439133247243721426"&gt;Page 1&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439133252077463538"&gt;Page 2&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439133255315343554"&gt;Page 3&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439132796936491922"&gt;iThome No. 437 - IT 部落客大直擊&lt;/a&gt; 2010/02/06-02/12&lt;br /&gt;
學 Android 程式不能錯過的專家部落格&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2009/09&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439132802731686754"&gt;商業週刊 No. 137&lt;/a&gt; 2009/09&lt;br /&gt;
金融海嘯後，最強富翁製造機   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439132802731686754"&gt;Page 1&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439132803690016994"&gt;Page 2&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439132807715412578"&gt;Page 3&lt;/a&gt;   &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439133240807866210"&gt;Page 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2009/06&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/a0soft/eZSBJG#5439132800282751570"&gt;蘋果日報 - 雙方各有優劣&lt;/a&gt; 2009/06/26&lt;br /&gt;
突然接到蘋果日報打來，要邀稿。奇怪，蘋果怎麼知道我的手機號碼。&lt;/li&gt;
&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5557962452984233897?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5557962452984233897/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/08/android.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5557962452984233897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5557962452984233897'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/08/android.html' title='我與 Android 之媒體相關報導文章'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/TGDVLW601SI/AAAAAAAAAOs/AcWjTIEVCxw/s72-c/mm_report.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2317647012264238032</id><published>2010-07-13T10:00:00.000+08:00</published><updated>2010-07-13T10:00:02.286+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAD'/><category scheme='http://www.blogger.com/atom/ns#' term='AppInventor'/><title type='text'>App Inventor - 不會寫程式也能寫 Android 手機應用</title><content type='html'>&lt;p&gt;App Inventor - Web-based WYSIWYG Android App Editor&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TDvGOqf9ndI/AAAAAAAAAOc/Bag-yxwehas/ScreenShotAbout1.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Google 最近推出了 &lt;a href="http://appinventor.googlelabs.com/about/"&gt;App Inventor&lt;/a&gt;。這個工具推出的目的，就是要讓沒有受過程式設計訓練的一般使用者，也能完成他自己的 Android 手機應用。&lt;/p&gt;

&lt;p&gt;這是一個基於瀏覽器上執行的 Android 應用產生器。你只要在瀏覽器上，拖拉你想要的功能元件，以及利用各種控制方塊來連結這些功能元件，就像組合樂高積木一樣，就在拖拉與堆兜之間，你的 Android 手機應用就完成了。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;用拖拉元件的方式來完成應用，並不是新鮮事。各式的 &lt;a href="http://en.wikipedia.org/wiki/Rapid_application_development"&gt;RAD&lt;/a&gt; 工具，早已充斥在各個電腦語言領域中。不過，在 Android 領域上，App Inventor 倒是第一個先行者。&lt;/p&gt;

&lt;p&gt;有了 App Inventor，一些簡單的 Android 應用，應該可以更容易與快速地被寫出來。這個工具的推出，應該就預告其他 RAD 工具供應商，在 Android 這條路上，會更加艱辛 (要與 Google 與免費工具對打)。不過，如果 App Inventor 日後能支援 plug-in 的機制，讓個開發商能開發更多功能元件與控制方塊，並透過 plug-in 的機制，整合到 App Inventor 中，這倒不失為一個好方向。&lt;/p&gt;

&lt;p&gt;App Inventor 看來也是 Google 眾多免費服務之一，目前還在 beta 階段，尚未全面開放。不過，你只要有 gmail 帳號，現在就可以到 &lt;a href="https://services.google.com/fb/forms/appinventorinterest/"&gt;這裡免費申請&lt;/a&gt;。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2317647012264238032?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2317647012264238032/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/07/app-inventor-android.html#comment-form' title='9 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2317647012264238032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2317647012264238032'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/07/app-inventor-android.html' title='App Inventor - 不會寫程式也能寫 Android 手機應用'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/TDvGOqf9ndI/AAAAAAAAAOc/Bag-yxwehas/s72-c/ScreenShotAbout1.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3166744674246921232</id><published>2010-06-22T09:00:00.004+08:00</published><updated>2010-06-22T09:30:44.636+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ContentProvider'/><category scheme='http://www.blogger.com/atom/ns#' term='Uri'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmClock'/><category scheme='http://www.blogger.com/atom/ns#' term='ContentResolver'/><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><title type='text'>Android 原始碼徹底研究系列 - 鬧鐘程式, ContentProvider (5)</title><content type='html'>&lt;p&gt;Android Source Code Internals - Alarm Clock, ContentProvider (5)&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/TB8ml2ruU9I/AAAAAAAAAOU/lOykntbi_xM/contentprovider.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這一系列的 &lt;a href="http://ysl-paradise.blogspot.com/search/label/AlarmClock"&gt;鬧鐘應用原始碼的剖析研究&lt;/a&gt;，這一篇應該是壓軸了。在這鬧鐘應用原始碼系列研究的最後，要和大家介紹的是，在鬧鐘應用中如何建立與使用 ContentProvider 這個元件。&lt;/p&gt;

&lt;p&gt;剛學 Android 的人，應該都看過這個關於 &lt;a href="http://developer.android.com/guide/topics/fundamentals.html#appcomp"&gt;Android 4 大元件&lt;/a&gt; 的相關文件。從這個文件中，我們知道這 4 大元件，分別是 Activities, Services, Broadcast receivers 和 Content providers。在程式中，只要你有用到這 4 大元件，都必須要在 AndroidManifest.xml 中宣告。從鬧鐘應用的 AndroidManifest.xml 內容來看，除了 Service 之外，他涵蓋了其他三大 Android 元件，這也是為何我先挑他出來介紹的主要原因之一。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;因此，依照慣例，我們先打開 AlarmClock 的 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=AndroidManifest.xml;h=c6c0b6f3b66bae62a21a5c15a370496f32e177fd;hb=donut"&gt;AndroidManifest.xml&lt;/a&gt; 檔案，你會看到 #13 有宣告 AlarmProvider 這個 content provider。&lt;/p&gt;

&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
&lt;provider android:name="AlarmProvider" android:authorities="com.android.alarmclock" /&gt;
&lt;/textarea&gt;

&lt;p&gt;如果你對甚麼是 ContentProvider 還不了解的話，建議你一定要先看看下列文章：
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/providers/content-providers.html"&gt;The Developer's Guide - Content Providers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ysl-paradise.blogspot.com/2008/11/content-provider.html"&gt;如何使用 Content Provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/content/ContentProvider.html"&gt;References - ContentProvider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/content/ContentResolver.html"&gt;References - ContentResolver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;為了資料的隱密與保護性，在 Android 中，各個應用程式所儲存的資料，都在自己的保護區內。就算你知道他的檔案名稱與路徑，你也會因為權限的關係，無法存取別人的資料。這樣的作法，資料保護的目的性是達到了，可是卻犧牲了合作性。怎麼說？例如，在手機上，所有聯絡人的資料，都是由聯絡人這個應用所創建與管理的。如果你想寫個寄信程式，並且想讓使用者從現有的聯絡人中，挑選  email 地址。好了，這問題來了，這聯絡人的資料是由另一個應用所掌管的，你的應用想要存取別的應用所掌管的資料，看來是行不通的。在 Android 上，這樣的功能，應該怎麼做？&lt;/p&gt;

&lt;p&gt;為了解決這資料互通的需求，Android 提出了 ContentProvider。簡單地說，ContentProvider 的出現，就是要讓某個應用所儲存的資料，可以被其他應用所讀取或寫入。而且 ContentProvider 本身還提供了權限管理的機制，讓只有獲得授權的第三方應用，可以透過他來存取資料。&lt;/p&gt;

&lt;p&gt;ContentProvider 並沒有規定後台的資料儲存媒介。你可以用 SQL 資料庫，當然也可以用檔案，或其他你方便使用的方式。因此，規定一個統一存取的介面是必要的。ContentProvider 為這統一的存取介面，定義了以 URI 為基礎的 &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; 存取方式。而所有要透過 ContentProvider 存取資料的應用，都必須要先透過 ContentResolver，幫你找到適合的 ContentProvider 才行。&lt;/p&gt;

&lt;p&gt;最上面那個圖，就是鬧鐘應用中，和 ContentProvider 相關的方塊圖。鬧鐘應用將使用者所設定的所有鬧鈴，都儲存在一個 SQLite 資料庫 (alarms.db) 中。為了讓自己與其他應用也可存取這鬧鈴設定，&lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/AlarmProvider.java;h=74fdd2e8904e19aec2b98fbed4b718b5e8a0feaa;hb=donut-release"&gt;AlarmProvider.java&lt;/a&gt; 是 ContentProvider 的實作，並提供底下兩種 REST 存取 APIs。&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#40 ~ #43
static {
  sURLMatcher.addURI("com.android.alarmclock", "alarm", ALARMS);
  sURLMatcher.addURI("com.android.alarmclock", "alarm/#", ALARMS_ID);
}
/*
content://com.android.alarmclock/alarm      //返回所有的鬧鈴 ID
content://com.android.alarmclock/alarm/&lt;id&gt; //返回所指定鬧鈴 ID 的設定
*/
&lt;/textarea&gt;

&lt;p&gt;例如，處理這兩個 REST APIs 的查詢關鍵地方就在：&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#100 ~ #113
// Generate the body of the query 
int match = sURLMatcher.match(url); 
switch (match) { 
  case ALARMS: 
    qb.setTables("alarms"); 
    break; 
  case ALARMS_ID: 
    qb.setTables("alarms"); 
    qb.appendWhere("_id="); 
    qb.appendWhere(url.getPathSegments().get(1)); 
    break; 
  default: 
    throw new IllegalArgumentException("Unknown URL " + url); 
}
&lt;/textarea&gt;

&lt;p&gt;要實作出一個 ContentProvider，除了要自行定義可供外部使用的 REST APIs 外，你還要定義底下函式：&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Cursor query(Uri url, String[] projectionIn, String selection, String[] selectionArgs, String sort);
int update(Uri url, ContentValues values, String where, String[] whereArgs);
Uri insert(Uri url, ContentValues initialValues);
int delete(Uri url, String where, String[] whereArgs);
String getType(Uri url);
&lt;/textarea&gt;
&lt;p&gt;關於這些函式的實作細節，就請你就自行參閱 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/AlarmProvider.java;h=74fdd2e8904e19aec2b98fbed4b718b5e8a0feaa;hb=donut-release"&gt;AlarmProvider.java&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;好了，你已經看到鬧鐘應用如何實作 ContentProvider，以及他所提供出來的 APIs。接下來，我們來看看要如何透過 ContentProvider，來存取這些鬧鈴設定。&lt;/p&gt;

&lt;p&gt;在鬧鐘應用中，所有和 ContentProvider 相關的存取，都在 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/Alarms.java;h=8e718366af13798fb19dda0a3a753bf01e01da9a;hb=donut-release"&gt;Alarms.java&lt;/a&gt; 中。&lt;/p&gt;

&lt;p&gt;我們來看殺掉鬧鈴設定的功能是如何實現的：&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//Alarms.java #331 ~ #334
private synchronized static void 
deleteAlarm(ContentResolver contentResolver, Uri uri) 
{
  contentResolver.delete(uri, "", null); 
}
&lt;/textarea&gt;

&lt;p&gt;看到這，我們可以了解，即使要在自己的應用中殺掉 ID 為 5 的鬧鈴設定，你只要用底下方式呼叫即可：&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Uri uri = Uri.withAppendedId(
  Uri.parse("content://com.android.alarmclock/alarm"), 
  5);
getContentResolver().delete(uri, "", null);
&lt;/textarea&gt;

&lt;p&gt;在鬧鐘應用中，看似提供 ContentProvdier 這樣的介面是多餘的，畢竟只有他自己一個人在用。不過，在 Android 中，強調的是大家分工合作，透過 Intent 及 ContentProvdier 的機制，讓各個應用程式之間，能更完美無縫地的整合在一起。因此在知道鬧鐘應用的 ContentProvdier 介面後，如果日後你想在你的程式中，加上增減鬧鈴的功能，你就不用自己做了，完全可以透過現有的鬧鐘應用來完成，這樣的模式對使用者也好。反過來想，如果你的應用也能提供 Intent 與 ContentProvider 的話，這樣是不是也能讓別人和你更容易地整合在一起呢？&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3166744674246921232?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3166744674246921232/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/06/android-contentprovider-5.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3166744674246921232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3166744674246921232'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/06/android-contentprovider-5.html' title='Android 原始碼徹底研究系列 - 鬧鐘程式, ContentProvider (5)'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/TB8ml2ruU9I/AAAAAAAAAOU/lOykntbi_xM/s72-c/contentprovider.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1429330412671631241</id><published>2010-05-12T09:00:00.003+08:00</published><updated>2010-06-18T14:17:18.571+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>智慧終端軟體平台與應用發展 - 免費參加</title><content type='html'>&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/S__TZKRmD5I/AAAAAAAAAN8/mRDObfKdUbM/ICT.jpg" border="0" /&gt;

&lt;p&gt;這是資訊工業策進會產業支援處辦的第 16 場 ICT 創意與應用發展交流會，這次是以研討會的形式舉行。我和 Android中文資源站的 Jimmy 也分別支援了一個議題。&lt;/p&gt;

&lt;p&gt;底下是這研討會的主題：&lt;br&gt;ICT(資訊通訊科技)應用首重創新加值，台灣資訊產業在硬體與技術研發之外，服務設計規劃與內容發展整合為重要課題。為促進軟體、硬體、設計、應用、服務、系統整合業者跨業交流合作，將陸續邀請各體系領域專家進行主題式講座，內容方向包含國內外趨勢、需求與應用、創意案例、服務設計等，作為創意交流與產品需求及應用發展討論之引導，會後並將就政府研發補助資源進行概略說明，歡迎有意願跨業合作交流之業者參與，期能促成軟硬體資源整合與產品應用創新研發。&lt;/p&gt;

&lt;span class="fullpost"&gt;

&lt;p&gt;這個研討會是免費的，有興趣參加的你，趕緊到底下網址報名。&lt;br&gt;
&lt;a href="http://www.ociid.org.tw/modules/news/article.php?storyid=143"&gt;ICT創意與應用發展交流會--智慧終端軟體平台與應用發展&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;這次研討會的活動議程如下：&lt;/p&gt;
&lt;p&gt;&lt;table border="1" bordercolor="#000000"&gt;
&lt;tr&gt;&lt;td&gt;時間&lt;/td&gt;&lt;td&gt;主題 / 主講人&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14:30-14:40&lt;/td&gt;&lt;td&gt;開場致歡迎詞 資策會鄭春來&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14:40-15:20&lt;/td&gt;&lt;td&gt;Android 裝置結合雲端運算之發展趨勢 聖星科技盧育聖&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15:20-15:40&lt;/td&gt;&lt;td&gt;Break&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15:40-16:20&lt;/td&gt;&lt;td&gt;LBS在Android應用案例與趨勢分享 Android中文資源站黃雋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16:20-16:30&lt;/td&gt;&lt;td&gt;政府研發補助資源簡要說明資策會產業支援處&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16:30-17:00&lt;/td&gt;&lt;td&gt;與會者自由交流討論&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;

&lt;iframe src="http://docs.google.com/present/embed?id=dfcsjjs_23cm34crcs" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;

&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/S__ToMxe2GI/AAAAAAAAAOE/MVKDo9sJ6Ec/ICT_full.jpg" border="0" /&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TBsPLZ57TCI/AAAAAAAAAOM/NvQNIUjKlKk/100528_s6.JPG" border="0" /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1429330412671631241?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1429330412671631241/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/05/blog-post_12.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1429330412671631241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1429330412671631241'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/05/blog-post_12.html' title='智慧終端軟體平台與應用發展 - 免費參加'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/S__TZKRmD5I/AAAAAAAAAN8/mRDObfKdUbM/s72-c/ICT.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6186151977499315737</id><published>2010-05-10T10:00:00.029+08:00</published><updated>2011-10-14T20:29:03.742+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>校園演講</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/Si9wH6Co9fI/AAAAAAAAAHk/yzfVs62h_gc/a.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;從 2009 年以來，一直有校園的授課或演講邀請。不過，多數都被我婉拒了。因為，'09年我主要將重點設定在業界的輔導與授課上，就是希望能先提昇業界在 Android 端的研發能量與競爭力。今年，我則將重點轉移到校園內。不過因為個人的時間還是有限，因此我主要是以校園的演講為主。目前為國內的一些大專院校，規劃 1 ~ 2 個小時的 Android 介紹，或是 Android 應用的創意設計演講。&lt;/p&gt;&lt;p&gt;底下是目前規畫的演講行程，日後有新增的話，也會在此更新。&lt;/p&gt;&lt;span class="fullpost"&gt; &lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;&lt;tr style="background-color:#ff9900;color:#000"&gt;&lt;td&gt;日期&lt;/td&gt;&lt;td&gt;地點&lt;/td&gt;&lt;td&gt;演講議題&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10/27/2010, 13:10p-15:00p&lt;/td&gt;&lt;td&gt;中原大學 教學大樓105多媒體教室&lt;/td&gt;&lt;td&gt;手機應用的創意設計與發展契機&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10/7/2011, 2:30p-4p&lt;/td&gt;&lt;td&gt;成功大學資工所 資工系館4263(成功校區)&lt;/td&gt;&lt;td&gt;手機應用的創意設計與發展契機&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9/28/2011, 6:30p-9:30p&lt;/td&gt;&lt;td&gt;台灣科技大學 RB105 國際演講廳&lt;/td&gt;&lt;td&gt;開發手機應用的必勝法則&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9/22/2011, 3p-5p&lt;/td&gt;&lt;td&gt;中央大學 E1-102 (電機館)&lt;/td&gt;&lt;td&gt;手機應用的創意設計與發展契機&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8/9/2011, 2p-5:30p&lt;/td&gt;&lt;td&gt;中央研究院資訊所106演講廳&lt;/td&gt;&lt;td&gt;Android 簡介與應用的設計創意&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=3&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12/16/2010, 1:30p-3:30p&lt;/td&gt;&lt;td&gt;國立台北教育大學 至善樓101室&lt;/td&gt;&lt;td&gt;手機應用的創意設計與發展契機&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12/15/2010, 3p-5p&lt;/td&gt;&lt;td&gt;中央大學 電機館E1-102&lt;/td&gt;&lt;td&gt;手機應用的創意設計與發展契機&lt;br /&gt;
http://www.ce.ncu.edu.tw/cae/schedule.php&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9/24/2010, 9:10a-12:00p&lt;/td&gt;&lt;td&gt;中原大學 電學410&lt;/td&gt;&lt;td&gt;Android 簡介與應用的設計創意&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7/9/2010, 10:30a-11:50a&lt;/td&gt;&lt;td&gt;亞東技術學院&lt;/td&gt;&lt;td&gt;Android 應用開發經驗分享&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5/25/2010, 2p-5p&lt;/td&gt;&lt;td&gt;建國科技大學 電機系演講廳 EEB01&lt;/td&gt;&lt;td&gt;An Introduction to Android&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5/12/2010, 3:40p-5:30p&lt;/td&gt;&lt;td&gt;輔仁大學 聖言樓 SF648 室&lt;/td&gt;&lt;td&gt;Android 應用的設計創意與思維&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4/14/2010, 3:40p-5:30p&lt;/td&gt;&lt;td&gt;交通大學 工程四館 219 室&lt;/td&gt;&lt;td&gt;An Introduction to Android&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=3&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9/10/2009, 11a-12p&lt;/td&gt;&lt;td&gt;清華大學資訊電機館 328 室&lt;/td&gt;&lt;td&gt;Android Market Stats&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6/12/2009, 1:30p-2:20p&lt;/td&gt;&lt;td&gt;成功大學自強校區令洋廳&lt;/td&gt;&lt;td&gt;開發 Android 應用程式該具備的思維與技巧&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/TLEkQb5QbKI/AAAAAAAAARc/DZ4Qvi810us/IMG_20100525_133658.jpg" border="0" /&gt;&lt;br /&gt;
我沒念到博士啊！&lt;/p&gt;&lt;p&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/TJyt7wT-hZI/AAAAAAAAAPc/9_CseKN9k-o/IMG_20100924_085436.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/TQgtU3dQnJI/AAAAAAAAASI/GkQmyXs8gss/1215%2B-1.jpg"/&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6186151977499315737?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6186151977499315737/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/05/blog-post.html#comment-form' title='9 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6186151977499315737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6186151977499315737'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/05/blog-post.html' title='校園演講'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/Si9wH6Co9fI/AAAAAAAAAHk/yzfVs62h_gc/s72-c/a.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6971406206849820662</id><published>2010-04-26T13:00:00.006+08:00</published><updated>2010-04-26T13:26:20.581+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>Android 應用大賽 - 台北市電腦公會</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/S9UgItLYt_I/AAAAAAAAANs/k3PU26U4e9Q/tca.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;去年國內最大的一場 Android 應用競賽，是由經濟部通訊產業發展推動小組辦的通訊大賽。今年看起來，不只通推小組想繼續辦比賽，連台北市電腦公會，也一同加入推動國內 Android 應用的設計熱潮。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;在 4/30 號，電腦公會為了這個比賽，要先辦個「Android開發者研討會」。我在這次的研討會中，會和大家一起分享 Android 應用開發與參加比賽的經驗與知識。&lt;/p&gt;

&lt;p&gt;有興趣參加這次比賽的你，趕緊到底下網址報名。&lt;br&gt;
&lt;a href="http://seminar.tca.org.tw/D17p00025.asp"&gt;Android開發者研討會&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;這次研討會的活動議程如下：&lt;/p&gt;
&lt;p&gt;&lt;table border="1" bordercolor="#000000"&gt;
  &lt;tr&gt;&lt;td&gt;時間&lt;/td&gt;&lt;td&gt;主題&lt;/td&gt;&lt;td&gt;主講人&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13:30-13:40&lt;/td&gt;&lt;td&gt;開場引言&lt;/td&gt;&lt;td&gt;黃昭龍&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13:40-14:20&lt;/td&gt;&lt;td&gt;雲端救援平台開發經驗分享&lt;/td&gt;&lt;td&gt;世新資管 林宏遠&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14:20-15:00&lt;/td&gt;&lt;td&gt;Android 嵌入式系統的發展趨勢&lt;/td&gt;&lt;td&gt;台大電機 王勝德&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15:00-15:10&lt;/td&gt;&lt;td&gt;開放平台行動裝置應用大賽介紹&lt;/td&gt;&lt;td&gt;TCA 謝宜均、高莉雅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15:10-15:30&lt;/td&gt;&lt;td colspane=2&gt;Break&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td nowrap&gt;&lt;b&gt;15:30-16:10&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;開發 Android 應用該具備的思維與技巧&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;盧育聖(Sam)&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16:10-16:50&lt;/td&gt;&lt;td&gt;Android 的發展與應用趨勢&lt;/td&gt;&lt;td&gt;劉文山&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16:50-17:30&lt;/td&gt;&lt;td&gt;A Discussion on Android Integration of the Application, Framework, and Library Layers&lt;/td&gt;
    &lt;td&gt;台北科技大學 梁文耀&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6971406206849820662?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6971406206849820662/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/04/android_26.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6971406206849820662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6971406206849820662'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/04/android_26.html' title='Android 應用大賽 - 台北市電腦公會'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/S9UgItLYt_I/AAAAAAAAANs/k3PU26U4e9Q/s72-c/tca.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4111101797609548362</id><published>2010-04-19T09:00:00.002+08:00</published><updated>2010-04-19T09:12:39.822+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><category scheme='http://www.blogger.com/atom/ns#' term='john'/><title type='text'>個人軟體開發者在 ANDROID 開發中的優勢</title><content type='html'>&lt;p&gt;An Individual Developer's Advantages in Android Market&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/S8qSKrEC6SI/AAAAAAAAANk/I-W4xLIMbrU/market.png" border="0"&gt;&lt;/p&gt;

&lt;p&gt;前陣子，開始和現住在美國的 John ，合寫一個新的 Android 的應用 - &lt;a href="http://www.cyrket.com/p/android/com.a0soft.sag.autotaskfree/"&gt;Auto Task&lt;/a&gt;。這個應用，從無到有，我們只花了一個月的時間，也再次證明我提倡的 "虛擬團隊" 模式，套用在這手機應用開發上，有無可比擬的工作效率與成本優勢。&lt;/p&gt;

&lt;p&gt;John 對於知識的分享，也有很大的熱忱。我很高興看到，他願意在我的部落格中，與我一起共筆，分享他個人對於手機應用開發的經驗與看法。底下就是他的自我介紹，與他的第一篇文章。由於他在美國，正好可以幫台灣的開發者解開這目前無法上架付費應用的難題，有興趣的你，可以找 John 幫忙。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;hr /&gt;
&lt;p&gt;王家君（John Wang, greythinker(at)gmail.com), 前半生碌碌無為，不學無術，學過地理學，生態學，遙感學，以學習研究的借口走遍中國大陸，曾經在天池上摸過火山巖，在內蒙古的沙漠里露營，也曾經站在蘇州的街頭看過美女。十三年前流浪到美國，為生計所迫，改學計算機科學，獲得碩士學位后進入 MOTOROLA 成為一名軟件工程師，十年間從小到大做過很多通訊項目，逐漸在大公司里被磨平了以往的銳氣，淹沒了曾經有的夢想。所謂經驗不過是因為混得太久知道怎么應對各種人物。感覺很窒息卻沒有勇氣跳出。 直道有一天有個朋友塞了一個 DROID 在我的手中，說“機會來了“，從此一發不可收拾，廢寢忘食的開始在 Android 上鑽研。我在為自己的夢想而努力，希望能夠和更多的朋友交流和互相鼓勵，一起努力利用所有新的機會。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;隨著手機平臺開發商走向 Open Source, Open Market 模式，給個人軟體開發者提供了一個以前從未有過的機會。 使個人開發者，可以在集中的 Market 上和軟體開發公司一同平等地競爭， 並顯示出更多的優勢。&lt;/p&gt;

&lt;p&gt;這種趨勢，將慢慢改變以往由大公司所壟斷的軟體市場，變成主要由個人或是小團體所占據的市場。作為一個獨立的軟體開發者，這種機會是你所不能忽略的。&lt;/p&gt;

&lt;p&gt;我們來看看個人軟體開發者，在這種軟體開發模式下，具備有哪些的優勢。你只有充分利用自己的優勢，才能在市場中持續發展並獲取利益。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;起步成本低： 能夠在 Android Market 上開始自己的銷售，作為個人開發者，成本之低，對以往的軟體公司而言，簡直是不可想像的。如果不考慮你在獲得技術知識時的花費，你在 Android Market 上的起步成本，是一臺電腦和 25 美金的註冊費。在從前，用這樣低的成本開軟體公司，根本是不可能。&lt;/li&gt;
&lt;li&gt;開發周期短：個人開發者在開發過程當中，可以避免很多軟體公司在專案管理中，所要遵守的繁文縟節，而可以自由地決定計劃和進度。最近的一個我們親身經歷的開發案例，由兩個開發者合作，從創意到將成品放到 Android Market 上，只用了短短一個月的時間，而且是大家利用工作之餘的時間來開發的。這對於現今軟體公司來說，是很難做到的。&lt;/li&gt;
&lt;li&gt;平等競爭：Android Market 給每個開發者提供了公平競爭的機會和環境，沒有人可以壟斷，獲利與否並不取決於開發者的規模或是有多少資金。一個獨立開發者可以比一個軟體公司想出更好的創意，並且能夠更快地把創意變成產品。&lt;/li&gt;
&lt;li&gt;使用者支持：一個軟體產品成功與否一半決定於軟體的品質，另一半決定於售後的服務，再好的軟體如果沒有使用者的支持也不會成功。在軟體開發的領域裡從來不會有 100% Bug Free 的產品。而且要知道，絕大多數手機使用者是不會有任何相關的知識的，有些問題你可能會覺得很幼稚，但是對使用者來說卻是很難理解的東西。個人開發者相比於大公司來說，可以更加近距離的接觸使用者，並提供更快更好的售後服務。因為是你自己開發的產品，你會更加注重使用者給的的所有評論。&lt;/li&gt;
&lt;li&gt;開發計劃：個人開發者在軟體的開發過程中有更高的自由度。可以根據自己的情況，制訂計劃和進度，不受公司裡大小老闆的約束，使軟體開發這件事，轉身變成了一種很愉快的工作。&lt;/li&gt;
&lt;li&gt;風險系數：任何一個企業在開始投資一個專案的時候，都會考慮到風險的問題。失敗的專案，有時會造成毀滅性的後果。但是作為一個 Android 個人軟體開發者，這種風險系數低得不能再低。由於成本很低，一個失敗的軟體幾乎對個人開發者，不會有太大的經濟上損失。有可能會在你的心靈上，造成一點創傷。但是要記住的是，沒有人會一下就成功，成功的人都是那些經歷過了很多失敗後，沒有放棄，吸取經驗繼續努力的人。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;能夠做自己有興趣的事並得到回報，是每個人的夢想。能夠自己做老闆，給自己發薪水，可以一覺睡到中午，也不用擔心被炒魷魚，這樣的環境，是每個上班族的天堂。只要你努力抓住機會，夢想都可以實現。Android Market 可以說給每個人提供了這樣一個公平的機會，你是否能夠抓住機會，全在於你自己的努力。&lt;/p&gt;

&lt;p&gt;我的老師曾經講過一句話：「每個人的一生都有很多機會，有人看見了，有人忽略了；有人看見了沒有利用，有人珍惜地利用每個來臨機會，一旦有個成功的機會，就可以造就一個成功的人」，共勉之。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4111101797609548362?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4111101797609548362/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/04/android.html#comment-form' title='30 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4111101797609548362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4111101797609548362'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/04/android.html' title='個人軟體開發者在 ANDROID 開發中的優勢'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/S8qSKrEC6SI/AAAAAAAAANk/I-W4xLIMbrU/s72-c/market.png' height='72' width='72'/><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4746363969331847443</id><published>2010-03-24T09:00:00.002+08:00</published><updated>2010-03-24T21:00:01.896+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image_effect'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix'/><category scheme='http://www.blogger.com/atom/ns#' term='Camera'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>幫圖片加上影像特效 (IV) - 3D 投射效果</title><content type='html'>&lt;p&gt;Create simple effects for your images (IV) - 3D Projection&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/S6gah9wVf6I/AAAAAAAAANU/pb3Ck6b8-sk/camera.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在 Android SDK 中有兩種 Camera classes。一個是 android.hardware.Camera，這是用來操控相機功能的類別。另一個是 android.graphics.Camera，這是什麼東西？今天我們就要來研究一下，這個類別能幫我們做些什麼事。&lt;/p&gt;

&lt;p&gt;android.graphics.Camera 是一個可以讓你將 2D 物件在 3D 空間中移動，並將在其移動後的結果，畫在螢幕上的類別。&lt;/p&gt;

&lt;p&gt;聽起來很有趣，是嗎？例如，最上面那張美女圖，你可以看出來，他是將原本的圖，以 Y 軸為軸心，旋轉約 30 度後，所畫出來的結果。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;打開 &lt;a href="http://developer.android.com/reference/android/graphics/Camera.html"&gt;android.graphics.Camera 的說明文件&lt;/a&gt;，你會發現，這個文件中只有下面這些 APIs 列表，什麼說明都沒有。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//Public Constructors 
  Camera()
//Public Methods
  void  applyToCanvas(Canvas canvas)
  float  dotWithNormal(float dx, float dy, float dz)
  void  getMatrix(Matrix matrix)
  void  restore()
  void  rotateX(float deg)
  void  rotateY(float deg)
  void  rotateZ(float deg)
  void  save()
  void  translate(float x, float y, float z)
&lt;/textarea&gt;

&lt;p&gt;不過，從這些 APIs 的名稱與參數，你應該可以猜出一些端倪。沒錯，&lt;b&gt;這個 Camera class，其實是個 helper class。他提供一些 APIs ，讓你控制要如何在 3D 空間中移動，最後再產生出合適的 Matrix ，讓你套用到 Canvas 的座標體系上&lt;/b&gt;。關於 Matrix，我在 &lt;a href="http://ysl-paradise.blogspot.com/2009/12/i.html"&gt;幫圖片加上影像特效 (I) - 陰影特效&lt;/a&gt; 已經介紹過他的強大，還不知道的，先讀一下這篇。&lt;/p&gt;

&lt;p&gt;用個例子來解釋這個 Camera 類別的用法，是最適當的。底下這個簡單的程式片段的結果，就是最上面那張圖。其中的 m_bmp 就是原本的美女圖。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
camera = new Camera();
camera.translate(0, 0, 50);
camera.rotateY(30);
Matrix matrix3D = new Matrix();
camera.getMatrix(matrix3D);

canvas.save();
canvas.translate(100, 100);
canvas.concat(matrix3D);

canvas.drawBitmap(m_bmp, 0, 0, null);
canvas.restore();
&lt;/textarea&gt;

&lt;p&gt;從這個範例程式中，我們知道，你可以利用 Camera.translate() 及 Camera.rotateXXX() 等 APIs 在 3D 空間中移動。其實，這些 APIs 就是在操作 Matrix 的內容。最後，你只要呼叫 Camera.getMatrix() 即可將這 Matrix 的內容抓出，並套到 Canvas 上。&lt;/p&gt;

&lt;p&gt;在 Android ，要做出 3D 的效果，你當然可以用 OpenGL 的函式。不過，如果你需要更快的顯示速度，或者只是要做個簡單的 3D 特效，那千萬不要忘了這個 android.graphics.Camera。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4746363969331847443?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4746363969331847443/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/03/iv-3d.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4746363969331847443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4746363969331847443'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/03/iv-3d.html' title='幫圖片加上影像特效 (IV) - 3D 投射效果'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/S6gah9wVf6I/AAAAAAAAANU/pb3Ck6b8-sk/s72-c/camera.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2576019973061478261</id><published>2010-02-18T09:00:00.003+08:00</published><updated>2010-02-18T12:22:51.201+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><title type='text'>中文應用優選 30 強出列！</title><content type='html'>&lt;p&gt;Top 30 Mobile Apps&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/S3vRfQ5xgQI/AAAAAAAAANE/oKDtC4ReB8A/top30apps.jpg" border="0" /&gt;&lt;/p&gt;
 
&lt;p&gt;數位時代雜誌辦的 "&lt;a href="http://ysl-paradise.blogspot.com/2010/01/60.html"&gt;60 大 Smartphone 應用軟體募集&lt;/a&gt;" 活動，結果已經出爐，就刊在 2010/02 月號的雜誌上。詳細排名及分數請 &lt;a href="http://picasaweb.google.com/lh/photo/lhOm_aes-CelSI0dEIpYCQ?feat=directlink" target=_blank&gt;看這&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;這次總共選出前 30 中文手機應用，我參加比賽的三個應用，全都入選為前 30 名應用。分別是「aPortaDrum - 隨身鼓」第 4 名，「休息一夏 - 我的遊樂地圖」第 10 名，而「3D Compass─實境立體羅盤」則是第 24 名。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;由於有三個應用同時入選至前 30 強，還獲選為「單一參賽者入選最多 APPs」的殊榮。在數位時代二月份的雜誌上，有篇關於這次參賽的專訪。有興趣的，可以到書局買本雜誌來看。&lt;/p&gt;

&lt;p&gt;由這次的比賽，看出幾個很有趣的結果。&lt;/p&gt;

&lt;p&gt;首先，3D Compass 竟然網友票選票數只有一票，這難道就是我自己投自己的的那一票？不太可能吧！不過，只有一票，還能入選，傑克這真是太神奇了。&lt;/p&gt;

&lt;p&gt;剛好這三個應用也都有在 Android Market 上發佈，你猜猜看，這 Android Market 的下載數和這次比賽結果的關聯性，會是如何？我告訴你，幾乎成相反的趨勢。在 Android Market 上下載數最高的是「3D Compass」，有 74000+；「aPortaDrum」有 14000+；而「休息一夏」有12000+。休息一夏只針對台灣區發行，其他兩個應用都是針對全球的。因此，如果將地區因素也考慮進去，這比賽的結果，剛好和 Market 的下載數成相反的趨勢。&lt;/p&gt;

&lt;p&gt;買不到數位時代二月份雜誌的，可以 &lt;a href="http://picasaweb.google.com/a0soft/eZSBJG?feat=directlink" target=_blank&gt;到這看看&lt;/a&gt;。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2576019973061478261?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2576019973061478261/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/02/30.html#comment-form' title='12 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2576019973061478261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2576019973061478261'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/02/30.html' title='中文應用優選 30 強出列！'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/S3vRfQ5xgQI/AAAAAAAAANE/oKDtC4ReB8A/s72-c/top30apps.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5453164171168781660</id><published>2010-01-25T09:00:00.001+08:00</published><updated>2010-01-25T09:00:01.744+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ColorMatrix'/><category scheme='http://www.blogger.com/atom/ns#' term='image_effect'/><category scheme='http://www.blogger.com/atom/ns#' term='ColorMatrixColorFilter'/><category scheme='http://www.blogger.com/atom/ns#' term='Paint'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='Drawable'/><category scheme='http://www.blogger.com/atom/ns#' term='Bitmap'/><title type='text'>幫圖片加上影像特效 (III) - 負片與灰階效果</title><content type='html'>&lt;p&gt;Create simple effects for your images (III) - Negative &amp; Grayscale Effects 

&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/S1xS6zvqgFI/AAAAAAAAAM0/hVGCiw9Jnl4/neg_gray.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;前兩次提過，簡單地利用 Matrix ，就可以輕易做出 &lt;a href="http://ysl-paradise.blogspot.com/2009/12/i.html"&gt;陰影特效&lt;/a&gt; 及 &lt;a href="http://ysl-paradise.blogspot.com/2009/12/ii.html"&gt;鏡像特效&lt;/a&gt;。

&lt;p&gt;這次，我將向大家分享，如何利用另一種 Matrix - ColorMatrix，來做出負片與灰階效果。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;最上面那張圖的上半部，是原來的影像，一個美麗的地球。下半部的左邊，就是這地球影像的負片效果。右邊，則是灰階效果的呈現。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;負片效果&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;負片效果的演算法，很簡單。就像底下這樣。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
R' = 255 - R;
G' = 255 - G;
B' = 255 - B;
&lt;/textarea&gt;

&lt;p&gt;算法很簡單，可是在 Android 中要如何做到呢？難不成要用 &lt;a href="http://developer.android.com/reference/android/graphics/Bitmap.html#getPixel(int, int)"&gt;Bitmap.getPixel()&lt;/a&gt; 及 &lt;a href="http://developer.android.com/reference/android/graphics/Bitmap.html#setPixel(int, int, int)"&gt;Bitmap.setPixel()&lt;/a&gt;，逐一針對每個像素來改他的顏色值？！&lt;/p&gt;

&lt;p&gt;當然不是！這樣的做法，太沒效率，速度一定很慢。在 Android 中，針對這樣的需求，你可以透過 &lt;a href="http://developer.android.com/reference/android/graphics/ColorMatrixColorFilter.html"&gt;ColorMatrixColorFilter&lt;/a&gt; 來完成。在建構一個 ColorMatrixColorFilter 時，你得傳給他一個 &lt;a href="http://developer.android.com/reference/android/graphics/ColorMatrix.html"&gt;ColorMatrix&lt;/a&gt;。因此，重點就在這個 ColorMatrix。&lt;/p&gt;

&lt;p&gt;ColorMatrix 文件一開頭的註釋，就已經將他的功能講得很清楚。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//5x4 matrix for transforming the color+alpha components of a Bitmap.
//The matrix is stored in a single array, and its treated as follows:
//[ a, b, c, d, e,
//  f, g, h, i, j,
//  k, l, m, n, o,
//  p, q, r, s, t ]
//
//When applied to a color [r, g, b, a], the resulting color is computed as
//(after clamping)
// R' = a*R + b*G + c*B + d*A + e;
// G' = f*R + g*G + h*B + i*A + j;
// B' = k*R + l*G + m*B + n*A + o;
// A' = p*R + q*G + r*B + s*A + t;
&lt;/textarea&gt;

&lt;p&gt;讓我們看一下，這負片效果的原始碼，你會更加清楚。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
ColorMatrix cm = new ColorMatrix(new float[] {
  -1f,  0f,  0f, 0f, 255f,
   0f, -1f,  0f, 0f, 255f,
   0f,  0f, -1f, 0f, 255f,
   0f,  0f,  0f, 1f,   0f});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(m_bmp, 0, 0, paint);
&lt;/textarea&gt;

&lt;p&gt;將一個地球的圖片設給 m_bmp，透過上面這個程式範例，畫出來的樣子，就是一張具有負片效果的圖。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;灰階效果&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;負片會了，灰階應該也很簡單了吧！我告訴你，要完成灰階效果，更簡單。ColorMatrix 都幫你將算法寫好了。你只要呼叫 ColorMatrix.setSaturation(0) 即可。&lt;/p&gt;

&lt;p&gt;等等，學東西，可不能這樣就含混帶過。別忘了，Android 的原始碼都給你了，我們得利用他追根究柢，一探究竟才行。&lt;/p&gt;

&lt;p&gt;打開 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=graphics/java/android/graphics/ColorMatrix.java;h=c22cda1cbf511db575eb56f3fee87ff2fb96cce6;hb=HEAD"&gt;ColorMatrix.java 的原始碼&lt;/a&gt;，翻到 setSaturation()。這個函式的實現如下：&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
public void setSaturation(float sat) {
  reset();
  float[] m = mArray;

  final float invSat = 1 - sat;
  final float R = 0.213f * invSat;
  final float G = 0.715f * invSat;
  final float B = 0.072f * invSat;

  m[0] = R + sat; m[1] = G;       m[2] = B;
  m[5] = R;       m[6] = G + sat; m[7] = B;
  m[10] = R;      m[11] = G;      m[12] = B + sat;
}
&lt;/textarea&gt;

&lt;p&gt;透過 android.graphics.ColorFilter 與 android.graphics.ColorMatrix，你還可以玩出更多的效果，別忘了 ApiDemos 的範例程式中，也有用到。&lt;/p&gt;

&lt;p&gt;很多好東西，就在你身旁，千萬別捨近求遠了。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5453164171168781660?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5453164171168781660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/01/iii.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5453164171168781660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5453164171168781660'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/01/iii.html' title='幫圖片加上影像特效 (III) - 負片與灰階效果'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/S1xS6zvqgFI/AAAAAAAAAM0/hVGCiw9Jnl4/s72-c/neg_gray.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4411233027326561474</id><published>2010-01-11T18:00:00.001+08:00</published><updated>2010-01-11T18:00:05.565+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><title type='text'>60 大手機應用軟體募集</title><content type='html'>&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/S0rv-0np70I/AAAAAAAAAMk/VgayP-1M6Co/smartappcontest.png" /&gt;

&lt;p&gt;數位時代雜誌，今年辦個 "&lt;a href="http://www.bnext.com.tw/edm/appcontest/"&gt;60 大 Smartphone 應用軟體募集&lt;/a&gt;" 活動。第一輪，就是要報導使用者票選出的前 30 名應用。&lt;/p&gt;

&lt;p&gt;這次我拿三個應用去參加。好朋友要幫忙投的，或是想參加抽獎的，請在 1/17 (星期日) 前到 &lt;a href="http://www.bnext.com.tw/edm/appcontest/"&gt;http://www.bnext.com.tw/edm/appcontest/&lt;/a&gt; 投票。&lt;/p&gt;

&lt;p&gt;我這三個應用在：
&lt;ul&gt;
&lt;li&gt;工具類: 第 2 行第 3 列的 "3D Compass─實境立體羅盤"&lt;/li&gt;
&lt;li&gt;娛樂類: 第 1 行第 1 列的 "aPortaDrum - 隨身鼓"&lt;/li&gt;
&lt;li&gt;娛樂類: 第 4 行第 2 列的 "休息一夏 - 我的遊樂地圖"&lt;/li&gt;
&lt;/ul&gt;
也就是最上頭圖片中的那三個應用。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4411233027326561474?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4411233027326561474/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2010/01/60.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4411233027326561474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4411233027326561474'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2010/01/60.html' title='60 大手機應用軟體募集'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/S0rv-0np70I/AAAAAAAAAMk/VgayP-1M6Co/s72-c/smartappcontest.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5964170344567003784</id><published>2009-12-29T09:00:00.004+08:00</published><updated>2009-12-29T09:00:00.430+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PorterDuff'/><category scheme='http://www.blogger.com/atom/ns#' term='PorterDuffXfermode'/><category scheme='http://www.blogger.com/atom/ns#' term='image_effect'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix'/><category scheme='http://www.blogger.com/atom/ns#' term='LinearGradient'/><category scheme='http://www.blogger.com/atom/ns#' term='Paint'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='Drawable'/><title type='text'>幫圖片加上影像特效 (II) - 鏡像特效</title><content type='html'>Create simple effects for your images (II) - Reflection Effect

&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SyWtRfThmiI/AAAAAAAAALk/45OrtHWl2hs/main.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ysl-paradise.blogspot.com/2009/12/i.html"&gt;上次介紹過如何實現陰影特效&lt;/a&gt;，這次我將介紹如何實現 iMac 上常見的鏡像特效。&lt;/p&gt;

&lt;p&gt;鏡像特效最近還蠻流行的，尤其在 HTC 的 Sense 介面上，常常都可以見到。最上面的那張圖，就是來自 HTC Sense 介面，所自帶瀏覽器程式中的『我的最愛』截圖。看到沒，加了個鏡像特效後，那感覺就很立體，感覺上好像是這些圖片擺立在一個玻璃桌面上。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;我想你一定想知道，在 Android 上要幫圖片加上鏡像特效，會不會很麻煩？我告訴你，一點也不麻煩。和陰影特效相似，同樣地，只要幾行程式，就可以搞定。&lt;/p&gt;

&lt;p&gt;因此，在開始看答案之前，我會建議你要先有 Photoshop 的使用經驗。想想，如果用 Photoshop 要幫圖片加上鏡像特效，要如何做？我想一般不外乎是先複製個圖片，並將其垂直翻轉，接著再對這翻轉的圖片，加個由灰到黑的漸層 mask 即可。&lt;/p&gt;

&lt;p&gt;如果你沒 Photoshop 的使用經驗，自己上網找一下，應該不難找到說明，像 &lt;a href="http://www.scribd.com/doc/12246566/Photoshop-Mirror-Effect"&gt;這&lt;/a&gt;，還有 &lt;a href="http://www.rnel.net/tutorial/Photoshop/7251"&gt;這&lt;/a&gt; 都有。&lt;/p&gt;

&lt;p&gt;好了，讓我們來看一下答案。底下就是幫圖片加上鏡像特效的程式範例。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
private void
_Init()
{
  m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  LinearGradient lg = new LinearGradient(
    0, 0, 0, m_nShadowH, 
    0xB0FFFFFF, 0x00000000,
    Shader.TileMode.CLAMP);
  m_paint.setShader(lg);
  m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
}

@Override protected void 
onDraw(Canvas canvas)
{
  super.onDraw(canvas);

  int nX = 0;
  int nY = 20;

  _DrawNormalImg(canvas, nX, nY);
  _DrawMirror(canvas, nX, nY);
} 

private void
_DrawNormalImg(Canvas canvas, int nX, int nY)
{
  canvas.save(Canvas.MATRIX_SAVE_FLAG);
  canvas.translate(nX, nY);   
  m_dw.draw(canvas);
  canvas.restore();
}

private void
_DrawMirror(Canvas canvas, int nX, int nY)
{
  int nW = m_dw.getIntrinsicWidth();
  int nH = m_dw.getIntrinsicHeight();

  ///////////////////////////////////
  //draw mirror image
  canvas.save(Canvas.MATRIX_SAVE_FLAG);
  canvas.scale(1.0f, -1.0f);
  canvas.translate(nX, -(nY + nH * 2));
  canvas.clipRect(0, nH, nW, nH - m_nShadowH);
  m_dw.draw(canvas);
  canvas.restore();

  //////////////////////////////
  //draw mask
  canvas.save();
  canvas.translate(nX, nY + nH);
  canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);
  canvas.restore();
}
&lt;/textarea&gt;

&lt;p&gt;_DrawMirror() 函式是關鍵。還記得我剛剛說，用 Photoshop 要如何做出鏡像特效？第一步是先畫出垂直翻轉的圖片。&lt;/p&gt;

&lt;p&gt;Android 繪圖座標體系預設的原點在左上角，X 軸往右是越來越大的正值，而 Y 軸往下，則是越來越大的正值。要畫出垂直翻轉的圖片，其實也就是要垂直翻轉整個繪圖座標體系。在 Android 中，要如何做？答案就是 canvas.scale(1.0f, -1.0f)。很簡單吧，沒想到給 scale() 函式一個負值，就可以翻轉相對應的軸。&lt;/p&gt;

&lt;p&gt;在 Photoshop 中，做鏡像特效的第二步是要對這翻轉的圖片，加個由灰到黑的漸層 mask。&lt;/p&gt;

&lt;p&gt;在 Android 中，要畫漸層色，那就一定得用 LinearGradient 這個類別。至於要對背景圖加上個 mask，就請參考一下 Paint 的 setXfermode() 函式。_Init() 這個函式，就是負責生成一個由灰到黑漸層 mask 的 m_paint 物件。&lt;/p&gt;

&lt;p&gt;將一個地球的圖片設給 m_dw，透過上面這個程式範例，畫出來的樣子，就像下面這樣。是不是感覺這地球，放在一塊玻璃桌面上？&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SyWtRowlBgI/AAAAAAAAALs/oGmhMaogwKo/mirror.png" /&gt;&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5964170344567003784?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5964170344567003784/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/12/ii.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5964170344567003784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5964170344567003784'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/12/ii.html' title='幫圖片加上影像特效 (II) - 鏡像特效'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/SyWtRfThmiI/AAAAAAAAALk/45OrtHWl2hs/s72-c/main.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-512713733898644570</id><published>2009-12-18T17:00:00.000+08:00</published><updated>2009-12-18T17:00:00.822+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='ADC'/><title type='text'>Android Wednesday Party @ 蛙咖啡</title><content type='html'>Android Wednesday Party on 12/16

&lt;p align="center"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SytBdggTGlI/AAAAAAAAAMM/rT-l7lSm70I/DSC_0061.JPG" /&gt;&lt;/p&gt;

&lt;p&gt;與 &lt;a href="http://ysl-paradise.blogspot.com/2009/04/android-wednesday-party-google.html"&gt;上次 Google 辦公室的 Android Party&lt;/a&gt; 相隔了半年多，癮科技辦的 &lt;a href="http://android.cool3c.com/article/14256"&gt;第三次 Android Wednesday Party&lt;/a&gt; 終於在 12/16 的晚上，在 Android 迷的期待下，揭開精彩的序幕。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;當晚，應該來了有超過 40 人。儘管沒有上次 Google 場地的加持，不過我覺得這次的聚會還是超級的成功。因此，外面雖然是飄著細雨的寒夜，不過蛙咖啡裡面，卻是擠滿著 Android 愛好者的熱情。&lt;/p&gt;

&lt;p&gt;除了延續上次精采的 Android 應用開發者分享外，這次還加了使用者體驗分享，及一些 Android 硬體的發表。其中的這台 &lt;a href="http://www.camangi-webstation.com"&gt;Android Tablet&lt;/a&gt;，據說當晚，還是他首度在台灣亮相的日子。&lt;/p&gt;

&lt;p&gt;底下就是當天有來分享的應用程式，紅色框起來的程式，就是入圍 2009 Google ADC 2 決賽的應用。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SytCKR8b_fI/AAAAAAAAAMU/Rnm3c3LGH1o/apps.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;而我這次，就和 Spencer 一起分享這次參加 Google ADC 2 大賽的經驗，與入圍決賽的程式。&lt;/p&gt;

&lt;p&gt;底下就是我這次的投影片。&lt;/p&gt;

&lt;iframe src="http://docs.google.com/present/embed?id=dfcsjjs_1cfqfqnhk" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;

&lt;p&gt;如果我沒算錯的話，這次入圍 Google ADC 2 決賽的前 200 名參賽者，住在台灣地區的參賽者就有三位。我的 aPortaDrum，Spencer 的 FlingTap Done，還有 AtmWorker 的 AirPainter。當天我才知道，原來 AirPainter 的開發者，還曾經上過我的 Android 應用開發課程。哈，知道這消息，真的比我自己得獎還快樂。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://android.cool3c.com/article/15261"&gt;這裡&lt;/a&gt; 有當晚的精彩照片與花絮報導&lt;/p&gt;

&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SytCjEc3zdI/AAAAAAAAAMc/cAQ9iT99kC8/android_091217_16.jpg" /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-512713733898644570?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/512713733898644570/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/12/android-wednesday-party.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/512713733898644570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/512713733898644570'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/12/android-wednesday-party.html' title='Android Wednesday Party @ 蛙咖啡'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/SytBdggTGlI/AAAAAAAAAMM/rT-l7lSm70I/s72-c/DSC_0061.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3513346993468573070</id><published>2009-12-15T09:00:00.003+08:00</published><updated>2009-12-17T15:10:27.583+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PorterDuff'/><category scheme='http://www.blogger.com/atom/ns#' term='image_effect'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='Drawable'/><category scheme='http://www.blogger.com/atom/ns#' term='ColorFilter'/><title type='text'>幫圖片加上影像特效 (I) - 陰影特效</title><content type='html'>Create simple effects for your images (I) - Shadow Effect

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SyWo2ZdqyYI/AAAAAAAAALc/bQuZ_UFgZps/main1.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Android 從 1.0 開始，他提供給開發者的各式繪圖函式，就比同時期其他手機平台來的強大與好用。&lt;/p&gt;

&lt;p&gt;有 Android 基礎的你，應該都知道，在 Android 中繪圖，必須得要透過 Canvas 這個物件。在 Canvas 中，我最欣賞的功能就是，他讓開發者可以透過 matrix，來操作整個繪圖座標體系的位移、旋轉、傾斜等等功能。另外就是 Android 的 2D 繪圖功能，也開始支援 alpha，alpha 也就是透明度，這是要做一張美圖時，不可或缺的功能。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;有了 matrix，加上 alpha，再配合比 bitmap 更為抽象的 drawable 物件，那你要將圖形做各式各樣的變形，甚至於將上影像的特效，都將會是輕而易舉的事。回想在 Windwos 3.1 的那個年代，要做到我要介紹的這些特效，那真的很辛苦，你必須要將影像中的像素，一個一個抓出來，再透過一些影像處理的演算法，才有辦法做到。&lt;/p&gt;

&lt;p&gt;我就舉兩個影像特效例子，來說明這 Android 的繪圖功能有多強大。首先，我先介紹陰影特效要如何做。&lt;/p&gt;

&lt;p&gt;在寫地圖程式時，通常會加個 Overlay 物件在地圖上，用來標示某個景點的所在位置。要在地圖上畫個 Overlay，Overlay 這個類別已經提供一個很好用的 drawAt() 函式給你。你只要負責給他一個沒有陰影的 Drawable，他會自動幫你製造出陰影的效果。結果就像最上面這張圖一樣，每個圖案標示，都有個陰影，這讓這些標示，看起來就像立在地圖上一般。&lt;/p&gt;

&lt;p&gt;drawAt() 這個函式的宣告如下：&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
void drawAt(Canvas canvas, Drawable drawable, int x, int y, boolean shadow)
&lt;/textarea&gt;

&lt;p&gt;從實際的使用中，我們可以發現當你傳入 false 給 shadow 時，他就會幫你製造出陰影的效果。&lt;/p&gt;

&lt;p&gt;這個函式，怎麼這麼神奇！今天我將幫你們翻出他的原始碼，讓我們來看看這個 drawAt() 是如何實現的。&lt;/p&gt;

&lt;p&gt;底下就是 drawAt() 的原始碼。你看，短短不到 20 行，就可以幫任何的圖片做出陰影的效果。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
protected static void 
drawAt(Canvas canvas, Drawable drawable, int x, int y, boolean shadow)
{
  ...
  if (shadow)
    drawable.setColorFilter(0x7F000000, PorterDuff.Mode.SRC_IN);
  canvas.save();
  canvas.translate(x, y);
  if (shadow) {
    canvas.skew(-0.9F, 0.0F);
    canvas.scale(1.0F, 0.5F);
  }
  drawable.draw(canvas);
  if (shadow)
    drawable.clearColorFilter();
  canvas.restore();
}
&lt;/textarea&gt;

&lt;p&gt;為了幫助大家理解他是如何做到的，我將他整理成下面的程式範例。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
@Override protected void 
onDraw(Canvas canvas)
{
  super.onDraw(canvas);

  int nX = 100;
  int nY = 50;

  _DrawShadowImg(canvas, nX, nY);
  _DrawNormalImg(canvas, nX, nY);
} 

private void
_DrawNormalImg(Canvas canvas, int nX, int nY)
{
  canvas.save(Canvas.MATRIX_SAVE_FLAG);
  canvas.translate(nX, nY);
  m_dw.draw(canvas);
  canvas.restore();
}

private void
_DrawShadowImg(Canvas canvas, int nX, int nY)
{
  canvas.save(Canvas.MATRIX_SAVE_FLAG);
  m_dw.setColorFilter(0x7f000000, PorterDuff.Mode.SRC_IN);
  canvas.translate(nX, nY);
  canvas.skew(-0.9F, 0.0F);
  canvas.scale(1.0F, 0.5F);
  m_dw.draw(canvas);
  m_dw.clearColorFilter();
  canvas.restore();
}
&lt;/textarea&gt;

&lt;p&gt;_DrawShadowImg() 就是負責製造出陰影效果的函式。&lt;/p&gt;

&lt;p&gt;這畫出陰影的函式，主要就是運用 matrix 與 drawable 的 color filter 這兩個功能。首先是 m_dw.setColorFilter()，將整個圖片的顏色都轉成半透明的黑色。接著 canvas.translate() 將座標體系原點移到 nX, nY 的位置，而 canvas.skew() 與 canvas.scale() 則是將座標體系做個 x 軸方向的傾斜，與 y 軸方向的大小壓縮。最後，呼叫 m_dw.draw() 將圖片畫上，陰影就這麼產生出來了。&lt;/p&gt;

&lt;p&gt;底下這張圖，就是上面這個程式片段的執行結果。&lt;/p&gt;

&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SyT6Lt8O4EI/AAAAAAAAALI/X9fu-NxDUFE/shadow.png" /&gt;

&lt;p&gt;下回，我將介紹要如何實現 iMac 上常見的鏡像特效。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3513346993468573070?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3513346993468573070/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/12/i.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3513346993468573070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3513346993468573070'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/12/i.html' title='幫圖片加上影像特效 (I) - 陰影特效'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/SyWo2ZdqyYI/AAAAAAAAALc/bQuZ_UFgZps/s72-c/main1.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2525645379266135271</id><published>2009-11-06T11:17:00.004+08:00</published><updated>2009-11-06T11:22:33.725+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='ADC'/><title type='text'>雙喜臨門，雙雙入圍決賽</title><content type='html'>&lt;p&gt;Move into ADC round 2, and enter Taiwan Android game final round!&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SvOVkJAfV9I/AAAAAAAAAK4/u9pcah9TX_I/game.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;今年真的是 Android 元年，不論是國內外，各式各樣的 Android 活動，總是不斷。&lt;/p&gt;

&lt;p&gt;首先是，Google 在去年 ADC (Android Developer Challeng) 的成功經驗下，今年繼續開辦 &lt;a href="http://code.google.com/android/adc/"&gt;ADC 2&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;於此同時，台灣地區也在經濟部的支持下，開辦 &lt;a href="http://www.mobilehero.com/"&gt;Android 手機軟體設計競賽&lt;/a&gt;。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;於是我先和 Yi-Chun 合作，開發 &lt;a href="http://android.a0soft.com/?url=aPortaDrum.htm"&gt;aPortaDrum&lt;/a&gt;。並將這個極具創意的軟體，拿去參加 Google ADC 2 比賽。&lt;/p&gt;

&lt;p&gt;另外和 Jimmy 合作開發『休息一夏』Android 手機版。而這個 LBS 應用程式，則是主攻台灣區的 Android 比賽。&lt;/p&gt;

&lt;p&gt;嘿！想不到結果還不錯，雙雙都有入圍決賽。有這樣的結果，我已經很滿意了。接下來的結果，真的就只能順天意而行了。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mobile01.com/topicdetail.php?f=423&amp;t=1250507"&gt;這有關於 aPortaDrum 的討論&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.mobile01.com/topicdetail.php?f=423&amp;t=1292403"&gt;關於休息一夏的討論在此&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;從一開始以來，為了和台灣地區的開發者一起成長，我總是選個台灣地區的開發者，一起合作寫個 Android 程式。這樣的兩人小組，經過幾次實際實行下來，我覺得效果很好。也透過這樣實際的合作，倒是了解這些 7 年級生，不同於外界所了解的另外一面，而我自己也收穫不少。&lt;/p&gt;

&lt;p&gt;不管接下來，有否得獎，我都以平常心待之。不過這決定拿什麼去參加比賽等這些要如何贏取比賽的策略，印證這次的結果，個人倒是有點小小心得，可以分享給大家。不過我文筆實在太差了，用寫的實在太花時間。就等下次有人要邀請我，在公開場合講這故事時，我再和大家一起交流，分享。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2525645379266135271?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2525645379266135271/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/11/blog-post.html#comment-form' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2525645379266135271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2525645379266135271'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/11/blog-post.html' title='雙喜臨門，雙雙入圍決賽'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SvOVkJAfV9I/AAAAAAAAAK4/u9pcah9TX_I/s72-c/game.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5742569084341686667</id><published>2009-10-19T09:00:00.007+08:00</published><updated>2009-10-19T09:00:00.309+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>9 月 Android Market 現況</title><content type='html'>&lt;p&gt;Android Market Stats - September report&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/StPgq2o5pHI/AAAAAAAAAKQ/OGxmzOnTiB0/market_sep_apps.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;自從上次公佈 6 月之 Android Market 現況後，一直到現在，都還沒有公佈最新的 Market 數據。其實我一直都在統計著每月的數據變化，只是這數據並沒有甚麼令人驚艷的變化，因此也就將這事一直擱著，沒有每個月定期向大家公佈。今天，就趁著 Market 周年慶前夕，和大家一起分享最新的統計數據。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;還記得 Android Market 是在 2008 年的 10/22 開市的。時到今日，都已經快滿一年了，不過這 &lt;a href="http://ysl-paradise.blogspot.com/2009/03/android-market-2.html"&gt;Market 上的問題&lt;/a&gt;還是依舊，因此這 Market 數據，即使已經快到周年慶，也還是好看不到哪去。雖說，在最新的 OS 1.6 (Donut) 更新中，Market 也有了新的版本。不過就我這陣子的使用經驗來說，這一版的 Market ，只能說是個小改版，一些大問題，還是沒有改善。&lt;/p&gt;

&lt;p&gt;底下是最新的 Market 畫面截圖，最有用的新增功能應該就是多了這個，應用程式的預覽畫面。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/StPffZtk8GI/AAAAAAAAAKI/AAH9zPPqvVY/new_market.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;和往常慣例一樣，讓我們先檢視到 9 月底為止，目前 Android Market 的現況與成長情形。&lt;/p&gt;

&lt;p&gt;到 9 月底為止，目前的應用程式總數有 11000+，其中應用軟體有 82%，遊戲軟體則有 18%。付費的軟體有 35%，免費軟體則有 65%。這樣的比例分配，從今年 4 月以來，都是維持著相同的比例，只是中間過程中有一兩個百分點的上下。同樣地，這樣的比例，和 iPhone 的 AppStore 相比，問題還是出在付費軟體比例實在太少了。這個問題，也導致了軟體開發者一直不願向 Android 靠攏。目前，Android 的開發者數 (只統計有上架軟體到 Market 上的人數) 約有四千個，而 iPhone 的開發者數，則已經堂堂邁向兩萬大關了。&lt;/p&gt;

&lt;p&gt;開頭的那張圖，說明了目前 Market 上各項資料的成長情形。&lt;/p&gt;

&lt;p&gt;底下這一張圖則是每月所新增的軟體數，這是唯一看起來最有希望的一張圖。看到這圖，你可能會心想，如果每個月的新增軟體數，都能像這樣越來越多，看來要超過 AppStore ，應該是指日可待的。別傻了， AppStore 也不是省油的燈。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/StPh8mU8fOI/AAAAAAAAAKY/7o4wtXERn0w/market_sep_new_apps.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;讓我們來看看下面這張 Apple AppStore 與 Android Market 同期，總軟體數的 PK 圖。明顯地，這 Market 的成長動能和 AppStore 相比，差了有 4.6 倍之多。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/StPjf98RQ5I/AAAAAAAAAKg/vuSukGmp-iE/appstore_market.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;PS: 這裡所謂的同期，是指從各自開市，經過相同時間，來相互比較的結果。例如 "4th month" 就是拿 AppStore 在 2008/10/E 的數目，對上 Market 在 2009/2/E 的數目。&lt;/p&gt;

&lt;p&gt;最後的這張，就是例行各個類別的免費及付費軟體數比較圖。在免費軟體上，Tool 類別的競爭還是最激烈的，其次是 Entertainment。在付費軟體上，軟體總數前三名，分別是 Entertainment, Tools 及 Lifestyle。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/StPk3zykTuI/AAAAAAAAAKo/YtinHqCN5Vs/market_sep_app_cat.jpg" border="0" /&gt;&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5742569084341686667?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5742569084341686667/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/10/9-android-market.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5742569084341686667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5742569084341686667'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/10/9-android-market.html' title='9 月 Android Market 現況'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/StPgq2o5pHI/AAAAAAAAAKQ/OGxmzOnTiB0/s72-c/market_sep_apps.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-7452513890940721210</id><published>2009-10-05T09:00:00.004+08:00</published><updated>2009-10-05T09:00:02.279+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>2009 SD 軟件開發 2.0 技術大會 @ 北京</title><content type='html'>&lt;p&gt;2009 Software Development 2.0 Conference @ Beijing&lt;/p&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SsBR3TLm_WI/AAAAAAAAAJ4/wagHQbsS9_o/2009sd.jpg" border="0" /&gt;

&lt;p&gt;今年受 CSDN 的邀請，將在 CSDN 與『程序員』雜誌社主辦的 『&lt;a href="http://sd2china.csdn.net"&gt;2009 SD 軟體開發 2.0 技術大會&lt;/a&gt;』上，給個和 Android 相關的講題－『&lt;a href="http://sd2china.csdn.net/track6#a12"&gt;發現 Android 熱門應用程式的秘密&lt;/a&gt;』。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這是個和軟體開發相關的技術大會，會期一共是三天的時間，日期是 10 月 22-24 日。主要的議題有『移動開發』、『企業應用技術』、『語言與工具』、『新一代互聯網』、『軟體工程管理』、『軟體創富』等六大主題。我主講的『&lt;a href="http://sd2china.csdn.net/track6#a12"&gt;發現 Android 熱門應用程式的秘密&lt;/a&gt;』議程就在『&lt;a href="http://sd2china.csdn.net/track6"&gt;移動開發&lt;/a&gt;』這個主題中。&lt;/p&gt;

&lt;p&gt;講題：發現 Android 熱門應用程式的秘密&lt;br&gt;摘要：您知道在 Android 手機上開發應用程式，除了得具備『紮實技術』這個不可或缺的要素之外，還應該具備哪些的思維與技巧，才能讓你應用程式，擠入熱門排行榜，並獲得高評價？&lt;br&gt;首先，我們將從技術之外的角度，以案例分析的方式，從產品面的方向，共同探討開發 Android 手機應用程式時，所應該具備的思維與技巧。&lt;br&gt;之後，我將為您深入剖析 Android Market，這個全球的銷售平台的現況。讓我們同時從市場面向，掌握在發佈應用程式前，所應該執行的策略與方案。&lt;/p&gt;

&lt;p&gt;到時會到會場的朋友們，見到面時，別忘了和我打聲招呼。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-7452513890940721210?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/7452513890940721210/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/10/2009-sd-20.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7452513890940721210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7452513890940721210'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/10/2009-sd-20.html' title='2009 SD 軟件開發 2.0 技術大會 @ 北京'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/SsBR3TLm_WI/AAAAAAAAAJ4/wagHQbsS9_o/s72-c/2009sd.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3114486145241394897</id><published>2009-09-28T10:00:00.001+08:00</published><updated>2009-10-02T16:53:13.896+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>2009 Android 應用程式進階開發課程 @ 台灣</title><content type='html'>&lt;p&gt;Android application advance development training courses at 2009&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/a.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;2009 年陸陸續續開了些 Android 的應用入門課程，我相信有上過這課程的人，應該都已順利跨入 Android 應用開發的第一個門檻。在此同時，我也從過去這些課程中，了解不少學員都有更進一步上各式進階課程的需求。&lt;/p&gt;

&lt;p&gt;由於，結合 GPS 之 LBS 應用，與結合網際網路等各式手機應用的趨勢，將會是未來智慧型手機應用程式發展的主要方向。因此，首先我將規畫的進階課程是『Android 網際網路與地圖應用開發』。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這個課程主要介紹 Android 平台之網路應用基礎知識與架構，並教你如何在 Android 平台上，開發網路應用程式。課程中，我也會傳授 Android 內建之網頁元件的進階使用技巧；如何透過 GPS 抓取地理座標，與結合地圖元件之應用應如何有效開發的秘訣。有興趣上這方面課程的你，請點 &lt;a href="http://ysl-paradise.blogspot.com/2009/02/2009-android.html#adv"&gt;Android 應用程式開發課程&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3114486145241394897?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3114486145241394897/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/09/2009-android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3114486145241394897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3114486145241394897'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/09/2009-android.html' title='2009 Android 應用程式進階開發課程 @ 台灣'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/s72-c/a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-7635004777011725627</id><published>2009-09-21T09:00:00.000+08:00</published><updated>2009-09-21T11:30:40.279+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BroadcastReceiver'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmManager'/><category scheme='http://www.blogger.com/atom/ns#' term='Intent'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmClock'/><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><category scheme='http://www.blogger.com/atom/ns#' term='PendingIntent'/><title type='text'>Android 原始碼徹底研究系列 - 鬧鐘程式, Alarm Reminder (4)</title><content type='html'>Android Source Code Internals - Alarm Clock, Alarm Reminder (4)

&lt;p align="center"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SrG4Oybw46I/AAAAAAAAAJg/fH9UBPDIEPA/device.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在了解&lt;a href="http://ysl-paradise.blogspot.com/search/label/AlarmClock"&gt;鬧鐘程式各個功能是如何實現&lt;/a&gt;後，這次我們要來追蹤『提醒鬧鈴時間到達』這個功能是如何實現的。&lt;/p&gt;

&lt;p&gt;要追蹤應用程式的原始碼，先觀察 AndroidManifest.xml 通常是最好的方式。&lt;/p&gt;

&lt;p&gt;首先，我們先打開 AlarmClock 的 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=AndroidManifest.xml;h=c6c0b6f3b66bae62a21a5c15a370496f32e177fd;hb=donut"&gt;AndroidManifest.xml&lt;/a&gt; 檔案。注意看 #52~#64 這兩個 broadcast receivers。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
&lt;receiver android:name="AlarmReceiver"&gt;
  &lt;intent-filter&gt;
   &lt;action android:name="com.android.alarmclock.ALARM_ALERT" /&gt;
  &lt;/intent-filter&gt;
&lt;/receiver&gt;

&lt;receiver android:name="AlarmInitReceiver"&gt;
  &lt;intent-filter&gt;
    &lt;action android:name="android.intent.action.BOOT_COMPLETED" /&gt;
    &lt;action android:name="android.intent.action.TIME_SET" /&gt;
    &lt;action android:name="android.intent.action.TIMEZONE_CHANGED" /&gt;
  &lt;/intent-filter&gt;
&lt;/receiver&gt;
&lt;/textarea&gt;

&lt;p&gt;AlarmReceiver 應該就是當鬧鈴時間到達時，要執行的程式。而 AlarmInitReceiver 則是當手機重開機，時間被重新設定，或是時區改變時，所要執行的程式。&lt;/p&gt;

&lt;p&gt;讓我們先打開 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/AlarmInitReceiver.java;h=77549b07a4472b59ebdac82578511220adb53c57;hb=donut"&gt;AlarmInitReceiver.java&lt;/a&gt; 看看。#31~#42 這個 onReceive() 內的程式就是關鍵。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//onReceive()
String action = intent.getAction();
...
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
    Alarms.disableSnoozeAlert(context);
    Alarms.disableExpiredAlarms(context);
}
Alarms.setNextAlert(context);
&lt;/textarea&gt;

&lt;p&gt;從其呼叫的函式名稱，不難理解出這段程式的主要工作，就是重新設定下一個鬧鈴。在這裡的 Intent.ACTION_BOOT_COMPLETED ，就是手機重開機時，所發出的系統 Intent。&lt;/p&gt;

&lt;p&gt;接著，我們打開 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/Alarms.java;h=8e718366af13798fb19dda0a3a753bf01e01da9a;hb=donut"&gt;Alarms.java&lt;/a&gt; 看看 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/Alarms.java;h=8e718366af13798fb19dda0a3a753bf01e01da9a;hb=donut#l582"&gt;setNextAlert()&lt;/a&gt; 這個函式到底在做些甚麼事。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//setNextAlert()
int snoozeId = getSnoozeAlarmId(context);
if (snoozeId == -1) {
    AlarmCalculator ac = calculateNextAlert(context);
    int id = ac.getIndex();
    long atTime = ac.getAlert();

    if (atTime &lt; Long.MAX_VALUE) {
        enableAlert(context, id, ac.getLabel(), atTime);
    } else {
        disableAlert(context, id);
    }
} else {
    enableSnoozeAlert(context);
}
&lt;/textarea&gt;

&lt;p&gt;看起來，&lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/Alarms.java;h=8e718366af13798fb19dda0a3a753bf01e01da9a;hb=donut#l612"&gt;enableAlert()&lt;/a&gt; 就是負責設定下一個鬧鈴的主要函式。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//enableAlert()
AlarmManager am = (AlarmManager)
  context.getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(ALARM_ALERT_ACTION);
intent.putExtra(ID, id);
intent.putExtra(LABEL, label);
intent.putExtra(TIME, atTimeInMillis);
PendingIntent sender = PendingIntent.getBroadcast(
        context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);

setStatusBarIcon(context, true);
&lt;/textarea&gt;

&lt;p&gt;從程式中，我們了解到他先透過 &lt;a href="http://developer.android.com/reference/android/app/AlarmManager.html"&gt;AlarmManager&lt;/a&gt; 的 &lt;a href="http://developer.android.com/reference/android/app/AlarmManager.html#set(int, long, android.app.PendingIntent)"&gt;set()&lt;/a&gt; 函式，設定鬧鈴時間，以及鬧鈴時間到達時，所要喚起的程式。由於是透過 &lt;a href="http://developer.android.com/reference/android/app/PendingIntent.html#getBroadcast(android.content.Context, int, android.content.Intent, int)"&gt;PendingIntent.getBroadcast()&lt;/a&gt; 取得 &lt;a href="http://developer.android.com/reference/android/app/PendingIntent.html"&gt;PendingIntent&lt;/a&gt; 的 instance，因此我們知道這個被喚起的程式應該是個 broadcast receiver。&lt;/p&gt;

&lt;p&gt;那到底是那個 broadcast receiver 會被喚起呢？從程式看來，應該就是喚起會接收 ALARM_ALERT_ACTION action 的 broadcast receiver。在此的 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/Alarms.java;h=8e718366af13798fb19dda0a3a753bf01e01da9a;hb=donut#l43"&gt;ALARM_ALERT_ACTION&lt;/a&gt; 就是 "com.android.alarmclock.ALARM_ALERT" 字串。&lt;/p&gt;

&lt;p&gt;讓我們再翻開 AndroidManifest.xml 瞧瞧，會接收 com.android.alarmclock.ALARM_ALERT 的 broadcast receiver，不就是 AlarmReceiver？！&lt;/p&gt;

&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
&lt;receiver android:name="AlarmReceiver"&gt;
  &lt;intent-filter&gt;
   &lt;action android:name="com.android.alarmclock.ALARM_ALERT" /&gt;
  &lt;/intent-filter&gt;
&lt;/receiver&gt;
&lt;/textarea&gt;

&lt;p&gt;打開 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/AlarmReceiver.java;h=218db980f1ddc3c826caabc9301d78f9fb040b3b;hb=donut"&gt;AlarmReceiver.java&lt;/a&gt;。仔細研讀一下，不難理解這段程式的主要工作就是：&lt;ol&gt;&lt;li&gt;先喚醒可能正在沉睡中的 CPU 與螢幕&lt;/li&gt;&lt;li&gt;暫時解開鍵盤或螢幕鎖&lt;/li&gt;&lt;li&gt;執行 AlarmAlert 這個 Activity，也就是你最終看到的鬧鈴提醒對話框。&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;最後，你有沒有發現，一般我們設定的 notification icon 都是出現在 status bar 的左手邊。而 AlarmClock 的鬧鈴 icon 卻是出現在右手邊的系統 icon 區？想要知道他是如何做到的？再回頭看 Alarms.java 中的 enableAlert()，其最後會呼叫 setStatusBarIcon() ，我想答案應該就在其中。&lt;/p&gt;

&lt;p&gt;打開 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/Alarms.java;h=8e718366af13798fb19dda0a3a753bf01e01da9a;hb=donut#l714"&gt;setStatusBarIcon()&lt;/a&gt;，其內容如下：&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
private static void setStatusBarIcon(Context context, boolean enabled) {
  Intent alarmChanged = new Intent(Intent.ACTION_ALARM_CHANGED);
  alarmChanged.putExtra("alarmSet", enabled);
  context.sendBroadcast(alarmChanged);
}
&lt;/textarea&gt;

&lt;p&gt;竟然是透過送出 ACTION_ALARM_CHANGED Intent，來設定 notification icon 的。看來，這是個未公開的用法。了解這些特別的用法，這不就是你研讀系統原始碼的好處之一嗎？&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-7635004777011725627?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/7635004777011725627/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/09/android-alarm-reminder-4.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7635004777011725627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7635004777011725627'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/09/android-alarm-reminder-4.html' title='Android 原始碼徹底研究系列 - 鬧鐘程式, Alarm Reminder (4)'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/SrG4Oybw46I/AAAAAAAAAJg/fH9UBPDIEPA/s72-c/device.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5773507801090190085</id><published>2009-08-24T09:00:00.002+08:00</published><updated>2009-09-17T12:21:15.429+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AdapterView'/><category scheme='http://www.blogger.com/atom/ns#' term='AnalogClock'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmClock'/><category scheme='http://www.blogger.com/atom/ns#' term='BaseAdapter'/><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><category scheme='http://www.blogger.com/atom/ns#' term='Gallery'/><title type='text'>Android 原始碼徹底研究系列 - 鬧鐘程式, Gallery &amp; Adapter (3)</title><content type='html'>Android Source Code Internals - Alarm Clock, Gallery &amp; Adapter (3)

&lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SpDv30KaQ_I/AAAAAAAAAJA/K24PxcII9Cs/gallery.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在 AlarmClock 這個程式中，點一下主畫面上的時鐘，他會在下面列出一些鐘面圖樣，讓使用者更換時鐘的鐘面。上圖，就是這個選擇鐘面功能的執行畫面。水平拖移底下的鐘面清單，你可以看到上面的時鐘也會跟著換成新的鐘面。&lt;/p&gt;

&lt;p&gt;這次我們就花點時間來研究看看，這樣的功能是如何實現出來的。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;要追蹤這樣的功能是如何實現的，還是得先從主畫面的 layout 設計檔著手。打開 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=res/layout/alarm_clock.xml;h=b56067dcea9a676ec3ca2165c7c55bbbbff6082c;hb=95833ecaf707d4d83d1da3e1e0d0b780839d37d8"&gt;res/layout/alarm_clock.xml&lt;/a&gt; 檔案，你可以發現主畫面的時鐘應該是放在 clock_layout 這個 LinearLayout 中。&lt;/p&gt;

&lt;p&gt;因此接著，我們打開主畫面的 Activity 檔 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/AlarmClock.java;h=f8902b9673bf8837c452779fdc7937adabd8f99b;hb=95833ecaf707d4d83d1da3e1e0d0b780839d37d8"&gt;AlarmClock.java&lt;/a&gt; ，尋找 clock_layout 這個關鍵字。果然在 #234~#241 中，發現如下的程式片段：&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
mClockLayout = (ViewGroup) findViewById(R.id.clock_layout);
mClockLayout.setOnClickListener(new View.OnClickListener() {
  public void onClick(View v) {
    final Intent intent = new Intent(AlarmClock.this, ClockPicker.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
  }
});
&lt;/textarea&gt;

&lt;p&gt;原來，這個選擇鐘面的功能，是由 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/ClockPicker.java;h=039f5b8a3cc2b5b4c8e73910e951daea88af0739;hb=95833ecaf707d4d83d1da3e1e0d0b780839d37d8"&gt;ClockPicker&lt;/a&gt; 這個 Activity 所負責實現的。&lt;/p&gt;

&lt;p&gt;接著，在 ClockPicker 的 onCreate() 函式中，我們可以知道這個 Activity 所使用的畫面設計檔就是 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=res/layout/clockpicker.xml;h=2e2c3b9c7c51d6eaf6c4e82ed49c7c003463c9e4;hb=95833ecaf707d4d83d1da3e1e0d0b780839d37d8"&gt;res/layout/clockpicker.xml&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;同樣地，只要觀察這個 clockpicker.xml layout 設計檔，你可以發現原來選擇鐘面畫面下的鐘面清單，就是由 &lt;a href="http://developer.android.com/reference/android/widget/Gallery.html"&gt;Gallery&lt;/a&gt; 這個元件所實現出來的。&lt;/p&gt;

&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
&lt;Gallery android:id="@+id/gallery"
  android:background="#70000000"
  android:layout_width="fill_parent"
  android:layout_height="80dip"
  android:layout_alignParentBottom="true"
  android:layout_alignParentLeft="true"
  android:gravity="center_vertical"
  android:spacing="16dp"
/&gt;
&lt;/textarea&gt;

&lt;p&gt;原來，Galley 不僅僅用來顯示圖片，他也可以用來當成類似 horizontal ListView ，當成一種選單元件的功能。&lt;/p&gt;

&lt;p&gt;先查看一下 Gallery 的繼承樹，原來他也是從 AdapterView 繼承下來。因此要對 Gallery 客製化，方法應該和 ListView 相同。&lt;/p&gt;

&lt;p&gt;在 Android 中，所有的 AdapterView 子類，都允許你透過繼承 BaseAdpater 的方式，塞一個自己客製化過的 Adapter 給 AdapterView。&lt;/p&gt;

&lt;p&gt;要如何寫一個自己的 Adapter？有興趣繼續研究的你，建議你打開這個不到 120 行的程式，&lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/ClockPicker.java;h=039f5b8a3cc2b5b4c8e73910e951daea88af0739;hb=95833ecaf707d4d83d1da3e1e0d0b780839d37d8"&gt;ClockPicker.java&lt;/a&gt;，好好讀一下。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5773507801090190085?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5773507801090190085/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/08/android-gallery-adapter-3.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5773507801090190085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5773507801090190085'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/08/android-gallery-adapter-3.html' title='Android 原始碼徹底研究系列 - 鬧鐘程式, Gallery &amp; Adapter (3)'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/SpDv30KaQ_I/AAAAAAAAAJA/K24PxcII9Cs/s72-c/gallery.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6339248639857624309</id><published>2009-08-03T09:00:00.003+08:00</published><updated>2009-08-05T07:58:58.987+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BroadcastReceiver'/><category scheme='http://www.blogger.com/atom/ns#' term='AnalogClock'/><category scheme='http://www.blogger.com/atom/ns#' term='AppWidgetProvider'/><category scheme='http://www.blogger.com/atom/ns#' term='AppWidgetManager'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmClock'/><category scheme='http://www.blogger.com/atom/ns#' term='RemoteViews'/><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><title type='text'>Android 原始碼徹底研究系列 - 鬧鐘程式, App Widgets (2)</title><content type='html'>Android Source Code Internals - Alarm Clock, App Widgets (2)

&lt;p align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SmaESn2K06I/AAAAAAAAAIs/p3hTTzDOyQk/widget.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;從 Android v1.5 開始，終於開放 APIs，讓第三方開發者可以寫些 widgets，讓使用者可以放在手機的桌面上。一般手機就有內建幾個小 widgets，其中的 "Analog Clock" widget，就是由 Alarm Clock 這隻鬧鐘程式所提供的。&lt;/p&gt;

&lt;p&gt;這次我們就來研究一下，這個 Analog Clock widget 是如何寫出來的。&lt;/p&gt;

&lt;p&gt;不過，如果你對如何寫 App Widgets 一點概念都沒有的話，底下有幾個很好的參考資料，一定要先讀過：&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/appwidgets/index.html"&gt;App Widgets Developer Guide&lt;/a&gt; - 這有很詳細的入門介紹與說明，建議你先讀這篇。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html"&gt;Introducing home screen widgets and the AppWidget framework&lt;/a&gt; - 這篇以一個實例來說明如何寫 App Widgets。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/guide/practices/ui_guidelines/widget_design.html"&gt;Widget Design Guidelines&lt;/a&gt; - 這篇說明的是，設計 widget UI 時，應該要注意的事項，及所要遵循的法則。&lt;/li&gt;
&lt;li&gt;另外，在 API Demos 這個範例程式中，也有個 App Widgets 的範例。&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;要寫個 App Widget，首先你要先用 XML 寫個 AppWidgetProviderInfo，而且這個檔案建議放在 res/xml 中。在鬧鐘程式中，你可以找到 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=res/xml/analog_appwidget.xml;h=d87b484e9853a923e7e8fb05b40f493b4a3f53c2;hb=refs/heads/cupcake"&gt;res/xml/analog_appwidget.xml&lt;/a&gt; 這個檔案。它的內容如下：&lt;/p&gt;
 
&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
//res/xml/analog_appwidget.xml
&lt;appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="146dip"
  android:minHeight="146dip"
  android:updatePeriodMillis="0"
  android:initialLayout="@layout/analog_appwidget" &gt;
&lt;/appwidget-provider&gt;
&lt;/textarea&gt;

&lt;p&gt;由 minWidth 及 minHeight 這兩個屬性來看，就可以了解，這個 App Widget 要佔桌面 2x2 cells 大小的空間。&lt;/p&gt;

&lt;p&gt;updatePeriodMillis 的值為 0？那這個時鐘是如何自己動的呢？這我在 &lt;a href="http://ysl-paradise.blogspot.com/2009/07/android-analogclock-1.html"&gt;Android 原始碼徹底研究系列 - 鬧鐘程式, AnalogClock (1)&lt;/a&gt; 一文中，就已經解釋過 Analog Clock 是如何自我更新的。還不清楚的，先讀一下這篇。&lt;/p&gt;

&lt;p&gt;initialLayout 這個屬性，從名字看起來，就知道它是用來描述這個 App Widget 的畫面設計。由其值我們可以知道，這個 App Widget 的畫面設計，是在 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=res/layout/analog_appwidget.xml;h=7a32477e9e8de4f8b3509da6f50049420729b2fb;hb=refs/heads/cupcake"&gt;res/layout/analog_appwidget.xml&lt;/a&gt; 中。它的內容如下：&lt;/p&gt;

&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
//res/layout/analog_appwidget.xml
&lt;AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
  android:dial="@drawable/appwidget_clock_dial"
  android:hand_hour="@drawable/appwidget_clock_hour"
  android:hand_minute="@drawable/appwidget_clock_minute"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" /&gt;
&lt;/textarea&gt;

&lt;p&gt;果然不出我們所料，這個 App Widget 的畫面設計，就只是一個簡單的 AnalogClock 。時鐘與時，分針圖檔就是分別透過 dial, hand_hour, hand_minute 這三個屬性來指定。&lt;/p&gt;

&lt;p&gt;要注意的是，目前在 App Widget 的畫面設計檔中，你只能使用 FrameLayout, LinearLayout, RelativeLayout, AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar, TextView 等元件，其他元件都不能用。&lt;/p&gt;

&lt;p&gt;寫好 AppWidgetProviderInfo XML 檔與 App Widget 畫面設計檔，別忘了，還要在 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=AndroidManifest.xml;h=0e1c94e4bb0829218f3136b25329241cb506990e;hb=refs/heads/cupcake"&gt;AndroidManifest.xml&lt;/a&gt; 中，宣告你的 App Widget Provider。&lt;/p&gt;

&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
//AndroidManifest.xml, #55~#60
&lt;receiver android:name="AnalogAppWidgetProvider" 
          android:label="@string/analog_gadget"&gt;
  &lt;intent-filter&gt;
    &lt;action android:name="android.appwidget.action.APPWIDGET_UPDATE" /&gt;
  &lt;/intent-filter&gt;
  &lt;meta-data android:name="android.appwidget.provider" 
             android:resource="@xml/analog_appwidget" /&gt;
&lt;/receiver&gt;
&lt;/textarea&gt;

&lt;p&gt;在這裡，他指明了這個 App Widget Provider 是要由 AnalogAppWidgetProvider 這個類別來處理。這個類別的原始碼就是 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=src/com/android/alarmclock/AnalogAppWidgetProvider.java;h=524b1d22c4109c05d83cffb61469c4ab18aeff7e;hb=refs/heads/cupcake"&gt;AnalogAppWidgetProvider.java&lt;/a&gt;。&lt;/p&gt;
    
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#49~#65
public class AnalogAppWidgetProvider extends BroadcastReceiver {
  static final String TAG = "AnalogAppWidgetProvider";

  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
        
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
      RemoteViews views = new RemoteViews(context.getPackageName(),
                                          R.layout.analog_appwidget);
      
      int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
            
      AppWidgetManager gm = AppWidgetManager.getInstance(context);
      gm.updateAppWidget(appWidgetIds, views);
    }
  }
}
&lt;/textarea&gt;

&lt;p&gt;在這個類別中，主要的工作就是建立 App Widget，並透過 AppWidgetManager 發佈到桌面上。&lt;/p&gt;

&lt;p&gt;鬧鐘程式所提供的 "Analog Clock" widget，其實功能很陽春，也沒有用到所有 App Widgets 提供的所有功能。不過，對於想要了解如何寫個 App Widget 的你，應該是有很大的幫助。如果你想要找個較為完整的 App Widget 範例，我建議你看一下 API Demos 這個範例程式。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6339248639857624309?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6339248639857624309/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/08/android-app-widgets-2.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6339248639857624309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6339248639857624309'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/08/android-app-widgets-2.html' title='Android 原始碼徹底研究系列 - 鬧鐘程式, App Widgets (2)'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SmaESn2K06I/AAAAAAAAAIs/p3hTTzDOyQk/s72-c/widget.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5267268868670168401</id><published>2009-07-28T09:37:00.020+08:00</published><updated>2010-09-06T10:18:48.925+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>Android 應用程式開發課程 @ 中國</title><content type='html'>&lt;p&gt;Android Application Development Training @ Mainland China&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/Sm5b2tVUinI/AAAAAAAAAI0/nb_QSkQedf4/china_training.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;從 2009 第三季開始和大陸一些合作單位，一起規劃了一個「Android應用開發與底層技術」的課程。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;目前這個課程，由我、高煥堂、及 Jollen 一起合開該門課程。我們三位講師的專長分別在 Android 最上層的應用程式 (Application)、中介層 (Middleware)、及底層作業系統 (OS kernel layer)，剛好可以涵蓋目前 Android 架構上的所有部份。&lt;/p&gt;

&lt;p&gt;這是第一次我們三位講師合開這樣課程，我們希望透過這樣的合作方式，能夠讓學員在短短幾天內，對於 Android 的開發上有一個全方位與通盤的了解，而不再僅侷限於某一方面的知識與訓練。&lt;/p&gt;

&lt;p&gt;由於原先我都是在台灣開 Android 課程，為了服務中國的開發者，也從第三季開始，計畫在中國地區開一些 Android 課程。有興趣的開發者，請逕行向主辦單位洽詢與報名。&lt;/p&gt;

&lt;p&gt;如果想要開企業包班或廠訓，則請直接向我聯絡即可。&lt;/p&gt;

&lt;p&gt;底下是計畫在中國開的課程：&lt;/p&gt;

&lt;p&gt;
&lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;
&lt;tr style="background-color:#ff9900;color:#000"&gt;&lt;td&gt;日期、課程名稱與地點&lt;/td&gt;&lt;td&gt;難易度&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#808080"&gt;&lt;td&gt;2010/4/1~2010/4/4 &lt;a href="http://www.miiceic.org.cn/gongkaike/zuixin/2010/0308/279.html" style="color:#808080"&gt;Android 應用開發@深圳&lt;/a&gt;&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#808080"&gt;&lt;td&gt;2010/3/26~2010/3/29 &lt;a href="http://miiceic.org.cn/03/0305/201003031316215.asp" style="color:#808080"&gt;Android 應用開發@北京&lt;/a&gt;&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#808080"&gt;&lt;td&gt;2009/9/26~2009/9/29 &lt;a href="http://www.miiceic.org.cn/03/0305/200907031053479.asp" style="color:#808080"&gt;Android 應用開發與底層技術@北京&lt;/a&gt;&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="color:#808080"&gt;&lt;td&gt;2009/7/31~2009/8/3 &lt;a href="http://www.miiceic.org.cn/03/0305/200907031053479.asp" style="color:#808080"&gt;Android 應用開發與底層技術@深圳&lt;/a&gt;&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/S7nhmSYzOxI/AAAAAAAAANc/ZWPuBWBJApw/1_100402155742_1.jpg" border="0" /&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SpccUsM2EsI/AAAAAAAAAJI/CYoK2CDWQOE/20098691129299.jpg" border="0" /&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SpccVcmv-EI/AAAAAAAAAJQ/S-1UtAVEJBw/20098691413171.jpg" border="0" /&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SpccV0SpYFI/AAAAAAAAAJY/aa-J1IpV8No/20098691841963.jpg" border="0" /&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5267268868670168401?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5267268868670168401/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/2009-android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5267268868670168401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5267268868670168401'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/2009-android.html' title='Android 應用程式開發課程 @ 中國'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/Sm5b2tVUinI/AAAAAAAAAI0/nb_QSkQedf4/s72-c/china_training.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6627208284655166020</id><published>2009-07-13T09:00:00.004+08:00</published><updated>2009-08-05T07:58:58.989+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BroadcastReceiver'/><category scheme='http://www.blogger.com/atom/ns#' term='AnalogClock'/><category scheme='http://www.blogger.com/atom/ns#' term='IntentFilter'/><category scheme='http://www.blogger.com/atom/ns#' term='View'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix'/><category scheme='http://www.blogger.com/atom/ns#' term='Intent'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmClock'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><title type='text'>Android 原始碼徹底研究系列 - 鬧鐘程式, AnalogClock (1)</title><content type='html'>&lt;p&gt;Android Source Code Internals - Alarm Clock, AnalogClock (1)&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SkmBvvR3NeI/AAAAAAAAAIE/gGPAvWsD0_A/AnalogClock.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;鬧鐘的原始程式碼在 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=tree;h=refs/heads/cupcake;hb=refs/heads/cupcake"&gt;這裡&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;一執行這個鬧鐘程式，畫面上第一眼看到的，就是一個大大的時鐘。因此我們今天，就先從這個時鐘下手。讓我們一探究竟，看他是如何實現的。&lt;/p&gt;

&lt;p&gt;要了解這個時鐘，是用什麼元件做出來的。有兩個方法，第一個就是用 SDK 內自帶的 &lt;a href="http://developer.android.com/guide/developing/tools/hierarchy-viewer.html"&gt;Hierarchy Viewer&lt;/a&gt; 工具；另一個，就是直接觀察 res/layout 中的畫面設計檔。這次，我們直接用第二個方法。&lt;/p&gt;

&lt;span class="fullpost"&gt;

&lt;p&gt;翻開 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=tree;f=res/layout;h=8486d6a595a8fee92a9b2a1c0b353579139b70a5;hb=refs/heads/cupcake"&gt;AlarmClock/res/layout&lt;/a&gt; 目錄的內容，你會發現有好幾個 clock_xxx.xml 的檔案。打開其中的 &lt;a href="http://android.git.kernel.org/?p=platform/packages/apps/AlarmClock.git;a=blob;f=res/layout/clock_droid2.xml;h=336efd358bec3d281474dd04bd8a0ed3fed46f35;hb=refs/heads/cupcake"&gt;clock_droid2.xml&lt;/a&gt; 檔。內容如下所示：&lt;/p&gt;

&lt;textarea name="code" class="xml:nogutter:nocontrols"&gt;
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;AnalogClock 
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/clock"
 style="@style/analogClock"
 android:dial="@drawable/clockdroid2_dial"
 android:hand_hour="@drawable/clockdroid2_hour"
 android:hand_minute="@drawable/clockdroid2_minute"/&gt;
&lt;/textarea&gt;
    
&lt;p&gt;嗯，看起來，這個時鐘就是用 android.widget.AnalogClock 這個元件直接實現的。只要透過 android:dial, android:hand_hour, android:hand_minute 這三個 XML 屬性，指定鐘面，時針與分針的圖檔，一個完整的時鐘，就會顯現出來。最上方的圖片，就是這個時鐘顯示的樣子。&lt;p&gt;

&lt;p&gt;都不需要任何額外的設定，這個時鐘元件就會自己依照目前的時間，將時、分針顯示在正確的位置，那他是如何定時更新時、分針位置？另外，注意到了嗎，時、分針的圖檔，只有一份。從這就猜到，這個時鐘還會自動將時、分針圖旋轉至正確的角度，貼在螢幕上。讓我們來看看，這個 AnalogClock 元件是如何實現這些功能的。&lt;/p&gt;

&lt;p&gt;打開 &lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/widget/AnalogClock.java;h=f847bc399b5a97237ae237ca4ca1ef649c0f5cbc;hb=cupcake"&gt;AnalogClock 元件原始碼&lt;/a&gt;，扣掉最前面的註解不算，整個原始碼也才不到 230 行。這麼少的程式碼，卻能將這個時鐘功能做得這麼完整。這也是我常最推薦，一定要看的元件原始碼之ㄧ。

&lt;p&gt;這次，我們要看的重點有兩個。&lt;/p&gt;
&lt;p&gt;&lt;ol&gt;&lt;li&gt;在元件程式中，要如何隨時都知道時間的改變？&lt;/li&gt;
&lt;li&gt;在 Android 中，要如何將圖片做任意角度的旋轉，並貼在螢幕上？&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;在元件程式中，要如何隨時都知道時間的改變？&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;原來在 &lt;a href="http://developer.android.com/reference/android/view/View.html#onAttachedToWindow()"&gt;onAttachedToWindow()&lt;/a&gt; 中，AnalogClock 透過 registerReceiver() 註冊了三個由系統發出的 Actions，&lt;a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK"&gt;ACTION_TIME_TICK&lt;/a&gt;, &lt;a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_CHANGED"&gt;ACTION_TIME_CHANGED&lt;/a&gt; 及 &lt;a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_TIMEZONE_CHANGED"&gt;ACTION_TIMEZONE_CHANGED&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;在 Android 中，系統會透過 Intent 傳送某些系統通知訊息，這些通知訊息又稱為 Action。在 &lt;a href="http://developer.android.com/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt; 類別的說明中，你可以找到所有的 Action 定義。&lt;/p&gt;

&lt;p&gt;在你的程式中，想要收到這些系統通知訊息，有兩個方法。第一個方法就是在 AndroidManifest.xml 中定義 receiver 的類別，這個方法在日後的介紹中會提到。第二種方法就是利用 registerReceiver()，向系統註冊接收的類別。由於 AnaloClock 是以元件的方式存在，如果每次使用這個元件，都還要在 AndroidManifest.xml 中定義，那就太麻煩了。因此， AnaloClock 採用的是第二種方法。&lt;/p&gt;

&lt;p&gt;其中，ACTION_TIME_TICK，就是由系統在每分整，傳送出來的 Action。ACTION_TIME_CHANGED 則是當使用者更改系統時間時，所送出的 Action。當你的手機跨越時區，系統則會送出 ACTION_TIMEZONE_CHANGED 給有註冊的程式。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#100 ~ #106
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
getContext().registerReceiver(mIntentReceiver, filter, null, mHandler);
&lt;/textarea&gt;

&lt;p&gt;一但這些 Actions 發生時，他會呼叫在程式最後 new 出來的 &lt;a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html"&gt;BroadcastReceiver&lt;/a&gt; 物件, mIntentReceiver，中的 onReceive() 回呼函式。

&lt;p&gt;首先，在 onReceive() 中，先檢查如果是時區有改變的話，當然你要重新設定 mCalendar 變數。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#233 ~ #245
private final BroadcastReceiver mIntentReceiver = 
new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
  if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {
   String tz = intent.getStringExtra("time-zone");
   mCalendar = new Time(TimeZone.getTimeZone(tz).getID());
  }

  onTimeChanged();
        
  invalidate();
 }
};
&lt;/textarea&gt;
&lt;p&gt;onTimeChanged() 函式，只是重新抓出最新的時、分資料。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#221 ~ #231
private void onTimeChanged() {
 mCalendar.setToNow();

 int hour = mCalendar.hour;
 int minute = mCalendar.minute;
 int second = mCalendar.second;

 mMinutes = minute + second / 60.0f;
 mHour = hour + mMinutes / 60.0f;
 mChanged = true;
}  
&lt;/textarea&gt;

&lt;p&gt;在 onReceive() 的最後，再呼叫 View.invalidate()。這個動作，會觸發 View.onDraw() 函式的呼叫，並在螢幕上畫上最新的時，分針。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;在 Android 中，要如何將圖片做任意角度的旋轉，並貼在螢幕上？&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Android 的 2D 繪圖功能，其實是很強的，尤其是 &lt;a href="http://developer.android.com/reference/android/graphics/Matrix.html"&gt;matrix&lt;/a&gt; 這部份。透過 matrix，你就可以輕易地，控制整個繪圖座標體系的位移、旋轉、傾斜，放大等功能。舉個例子來說，如果你要將圖片旋轉 30 度後，再貼在螢幕上。傳統的作法，都是直接先將圖片的內容，逐點旋轉 30 度。但是在 Android 平台上，你不用這麼麻煩。你只要將整個座標系統轉個 30 度，之後不管你是畫線，還是貼圖，最後呈現在螢幕上的都是轉 30 度的效果。&lt;/p&gt;

&lt;p&gt;想要了解 AnalogClock 是如何選轉時、分針圖片，那看 onDraw() 這個函式就對了。我將 onDraw() 中，和這部份選轉時、分針圖片相關的，列在下面。其中的 &lt;a href="http://developer.android.com/reference/android/graphics/Canvas.html#rotate(float, float, float)"&gt;canvas.rotate()&lt;/a&gt; 是關鍵，這個函式就是在將座標系統轉個角度。看完這個例子，有沒有發覺要在 Android 上旋轉、放大或縮小圖片，其實都是只要兩三行程式，就可搞定的事。&lt;/p&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//#159 ~ #219
@Override
protected void onDraw(Canvas canvas) {
 ...
 canvas.save();
 canvas.rotate(mHour / 12.0f * 360.0f, x, y);
 final Drawable hourHand = mHourHand;
 if (changed) {
     w = hourHand.getIntrinsicWidth();
     h = hourHand.getIntrinsicHeight();
     hourHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
 }
 hourHand.draw(canvas);
 canvas.restore();

 canvas.save();
 canvas.rotate(mMinutes / 60.0f * 360.0f, x, y);
 final Drawable minuteHand = mMinuteHand;
 if (changed) {
     w = minuteHand.getIntrinsicWidth();
     h = minuteHand.getIntrinsicHeight();
     minuteHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
 }
 minuteHand.draw(canvas);
 canvas.restore();
 ...
}
&lt;/textarea&gt;

&lt;p&gt;AnalogClock 就剩 constructors，與其他 onMeasure(), onSizeChanged(), onDetachedFromWindow() 等函式還沒提到，我想這部份就留給你自己去發掘。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6627208284655166020?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6627208284655166020/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/android-analogclock-1.html#comment-form' title='22 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6627208284655166020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6627208284655166020'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/android-analogclock-1.html' title='Android 原始碼徹底研究系列 - 鬧鐘程式, AnalogClock (1)'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SkmBvvR3NeI/AAAAAAAAAIE/gGPAvWsD0_A/s72-c/AnalogClock.png' height='72' width='72'/><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-7122928684285188868</id><published>2009-07-06T09:00:00.002+08:00</published><updated>2009-08-05T07:58:58.990+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>蜜月期過後，Market應用程式的現況</title><content type='html'>&lt;p&gt;Android Market Stats, 8 months later&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SknBAmk_bKI/AAAAAAAAAIk/eIWfXJLSStY/total_apps.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;從 10/22 開市到現今，Android Market 已經歷經了 8 個月的蜜月期。目前市面上也已經有三款 Android 手機，全球 Android 手機總數，應該有 3、4 百萬支，大約是 iPhone 手機數的 1/8。和往常慣例一樣，讓我們先檢視目前 Android Market 的現況。&lt;/p&gt;

&lt;p&gt;到 6 月底為止，目前的應用程式總數有 5970+，其中應用軟體有 81%，遊戲軟體則有 19%。付費的軟體有 36%，免費軟體則有 64%。這樣的比例分配，大致還是和 &lt;a href="http://ysl-paradise.blogspot.com/2009/04/android-wednesday-party-google.html"&gt;兩個月前&lt;/a&gt; 一樣。唯一有差別的，只在付費軟體部分上，在經過了兩個月的努力後，總算增加了 1%。不過這樣的比例，和 iPhone 的 AppStore 相比，問題還是出在付費軟體比例實在太少了。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;PS: 想了解 AppStore 的應用、遊戲及付費、免費軟體比例分配，請參考 &lt;a href="http://ysl-paradise.blogspot.com/2009/04/android-wednesday-party-google.html"&gt;Android Wednesday Party @ Google&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;底下這一張是，Apple AppStore 與 Android Market 同期，總軟體數的 PK 圖。結果如何，我想這曲線圖，已經說明了一切。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SknBAUvLl-I/AAAAAAAAAIc/bsKb05UVNNw/market_appstore.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;PS: 這裡所謂的同期，是指從各自開市，經過相同時間，來相互比較的結果。例如 "4th month" 就是拿 AppStore 在 2008/10/E 的數目，對上 Market 在 2009/2/E 的數目。&lt;/p&gt;

&lt;p&gt;付費軟體機制自從 2/13 開放以來，至今已經有四個半月的時間。從底下這張圖可以看出，成長動能已經明顯趨緩。我想這裡面的問題，還是和我 &lt;a href="http://ysl-paradise.blogspot.com/2009/03/android-market-2.html"&gt;在這裡提了好些 Market 問題點&lt;/a&gt; 脫不了關係。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SknBAfZTmGI/AAAAAAAAAIU/a0TCpkR-Oe8/free_priced.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;最後的這張，就是例行各個類別的免費及付費軟體數比較圖。在免費軟體上，Tool 類別的競爭還是最激烈的，其次是 Entertainment。在付費軟體上，軟體總數前三名，分別是 Entertainment, Tools 及 Lifestyle。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SknBABt_q-I/AAAAAAAAAIM/ZdkYsB4OqZs/category.jpg" border="0" /&gt;&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-7122928684285188868?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/7122928684285188868/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/market.html#comment-form' title='9 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7122928684285188868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/7122928684285188868'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/market.html' title='蜜月期過後，Market應用程式的現況'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SknBAmk_bKI/AAAAAAAAAIk/eIWfXJLSStY/s72-c/total_apps.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-51628411803362033</id><published>2009-07-01T09:00:00.010+08:00</published><updated>2010-07-27T21:00:34.561+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>企業客製化訓練課程</title><content type='html'>&lt;p&gt;除了我所開的 Android 各式公開標準課程外，針對各企業殷切需求，我們也為企業量身訂製各式客製化訓練課程。有這方面需求的企業，請聯絡 &lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SyrwfxGtC6I/AAAAAAAAAL0/JXEgd7zlJRE/sam.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;底下是已接受我們企業內訓的客戶名單。&lt;/p&gt;

&lt;a href="http://www.itri.org.tw/"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SsHGDD6Tn3I/AAAAAAAAAKA/gO_hODD9O-Q/logo_neu.gif" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://www.taiwanmobile.com.tw"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SsAnY6ZV-MI/AAAAAAAAAJw/baxKuu_xLGc/twm_logo.gif" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://www.qisda.com.tw"&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SsAnYV4VzVI/AAAAAAAAAJo/izgNs9CjJr4/Logo_Qista.gif" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/TE7YNGpPWtI/AAAAAAAAAOk/PZFJy5d6WZQ/sis_logo.jpg" border="0" /&gt;
&lt;br /&gt;
&lt;a href="http://www.sunplus.com.tw"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/S58gVt8kBbI/AAAAAAAAANM/VknM-8lNL44/sunplus.jpg" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://www.camangi.com"&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/S1z2JHisVQI/AAAAAAAAAM8/X9wV938bBa4/camangi.jpg" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://www.mediatek.com"&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/Su4lqUNONXI/AAAAAAAAAKw/tY1lS0j-4Uw/mtk.gif" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;p&gt;以上企業內訓客戶名單，依公司中文名稱筆畫順序排列。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-51628411803362033?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/51628411803362033/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/blog-post.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/51628411803362033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/51628411803362033'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/07/blog-post.html' title='企業客製化訓練課程'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SyrwfxGtC6I/AAAAAAAAAL0/JXEgd7zlJRE/s72-c/sam.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2975056075751155434</id><published>2009-06-29T09:00:00.003+08:00</published><updated>2009-08-05T07:58:58.991+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AndroidInternals'/><title type='text'>Android 原始碼徹底研究系列</title><content type='html'>&lt;p&gt;Android Source Code Internals&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SkA2A6LzdCI/AAAAAAAAAH8/1E1c45L1ulc/internals.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;閱讀及追蹤 Android 的原始碼，是提昇你 Android 程式設計功力最好的方式之一。&lt;/p&gt;

&lt;p&gt;可惜的是，在現今講求速食主義的年代，凡事都講求效率，大家都想直接找到解決問題的答案，而不想從打好基礎開始。別說是閱讀 Android 原始碼，連 Java 都還不會，就想一步登天的，也不在少數。以致於我看過不少，捨本逐末，事倍功半的例子。雖然你能找到解決的方法，可是在未能融會貫通的情況下，總是知其然，而不知其所以然。下次遇到類似的問題，當然還是無法自己獨立解決。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;要跨入 Android 的設計殿堂，第一步是容易的。你只要會用 Eclipse 及 ADT 提供的 wizard，再加上一本範例大全在手，要寫個簡單的程式應該都不是問題。可是以這樣的經驗與訓練，要真正想要寫一個 "好" 程式，還是有很大的距離。如果你真的想要學寫一個好程式，一窺 這殿堂的奧妙之美，以我的經驗來說，還是得按部就班來，先具備一定的基礎，仍然是先決的要素。&lt;/p&gt;

&lt;p&gt;我會建議你至少要具備以下的基礎：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java core language 和 Object-Orient programming&lt;/li&gt;
&lt;li&gt;熟讀 SDK 中的 The Developer's Guide 和練習 tutorial&lt;/li&gt;
&lt;li&gt;至少要瀏覽 Android framework APIs Reference 一遍&lt;/li&gt;
&lt;li&gt;自己出些題目，練習 Android 程式&lt;/li&gt;
&lt;li&gt;在寫程式的過程中，有問題時，不要急著問，先要求自己從 The Developer's Guide 和 API Reference 中找答案&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你已經有 OOP (C++, C# 等) 的程式設計經驗，要具備我上頭講的這些基礎，要花多久的時間？&lt;/p&gt;

&lt;p&gt;我想為自己留三個月時間，應該就綽綽有餘。&lt;/p&gt;

&lt;p&gt;在這些基礎都具備的情況下，&lt;b&gt;想要再進一步提升你的程式設計功力，除了要想辦法讓自己多增加些程式設計經驗外，閱讀及追蹤別人寫的程式碼，更是最好的方法。&lt;/b&gt;不過網路上，每個人的程式功力高低不同，寫出來的程式也有好有差。讀到不良的程式，看不懂還不打緊，如果誤導你的觀念，那可就得不償失。因此，當你底子還不足以判斷好壞程式時，我會建議你直接閱讀 Android 的原始碼。&lt;b&gt;根本不用捨近求遠，Android 原始碼，就是你學習 Android 程式設計時，最好的導師。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;要在 Linux 中下載 Android 原始碼，應該不是問題。習慣在 Windows 下生活的你，我在 &lt;a href="http://ysl-paradise.blogspot.com/2008/10/windows-android.html"&gt;如何在 Windows 平台上下載 Android 的原始碼&lt;/a&gt; 中，有介紹如何在 Windows 中下載 Android 原始碼。&lt;/p&gt;

&lt;p&gt;有了原始碼，應該從何看起，還是個問題。如果你一頭就栽進，Android framework 中的原始碼，在沒有目標與頭緒的情況下，很容易就迷失在眾多 framework 原始碼中。根據我自身的經驗，我會建議你先從 platform\packages\apps 開始，那裡面有 Android 一些內建的應用程式原始碼。像是網頁瀏覽器，計算機，鬧鐘，聯絡人，行事曆，媒體播放器，甚至於桌面程式都有。因為這些應用程式，你看得見，也摸得著，要追蹤這些的原始碼，會比較有感覺些。甚至於你還可以當場做實驗，改程式，看結果。&lt;/p&gt;

&lt;p&gt;為了幫想要更進一步提升 Android 程式設計功力的你，在接下來的日子，我會帶領大家導讀 Android 的原始碼。想要跟隨者，先照我講的，打好你應該具備的基礎；並下載一份 Android 原始碼，到你的電腦上。&lt;/p&gt;

&lt;p&gt;下次，我們先從 Android 的鬧鐘 (Alarm Clock) 原始碼開始看起。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2975056075751155434?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2975056075751155434/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/06/android.html#comment-form' title='13 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2975056075751155434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2975056075751155434'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/06/android.html' title='Android 原始碼徹底研究系列'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SkA2A6LzdCI/AAAAAAAAAH8/1E1c45L1ulc/s72-c/internals.jpg' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4516638975029776761</id><published>2009-06-10T16:16:00.008+08:00</published><updated>2009-08-05T07:58:58.992+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>開放手機平台嵌入式軟體發展技術研討會 -免費</title><content type='html'>&lt;p&gt;Seminar: Embedded Software Consortium&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/Si9wH6Co9fI/AAAAAAAAAHk/yzfVs62h_gc/a.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;南北資訊的不平衡，是台灣長久以來的問題。我以前在成大唸書時，就有這個困惱。每次有研討會或是課程，都是在北部地區。這使得南部的朋友或是同學，總要舟車勞頓地北上一程，才能吸收這些知識。&lt;/p&gt;

&lt;p&gt;這次我和 Jollen 應嵌入式軟體聯盟之邀，將於 6月12日（星期五），特地一大早南下，在成大給大家一整天免費的研討會。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這次報名的截止日期就是今天 6/10，因此南部地區想參加的朋友或同學，動作要快。報名的網址在這 &lt;a href="http://140.116.72.245/openmoko/signup.html"&gt;http://140.116.72.245/openmoko/signup.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;其中一場，是由我所主講的「&lt;b&gt;如何開發Android應用程式&lt;/b&gt;」。&lt;/p&gt;

&lt;p&gt;整個活動議程如下：&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/Si9unbrW32I/AAAAAAAAAHc/9ju6zrxwijM/agenda.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;想要了解更詳細內容的，請點選 &lt;a href="http://140.116.72.245/openmoko/synopsis.html"&gt;http://140.116.72.245/openmoko/synopsis.html&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4516638975029776761?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4516638975029776761/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/06/blog-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4516638975029776761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4516638975029776761'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/06/blog-post.html' title='開放手機平台嵌入式軟體發展技術研討會 -免費'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/Si9wH6Co9fI/AAAAAAAAAHk/yzfVs62h_gc/s72-c/a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3715741434497987499</id><published>2009-05-28T11:40:00.008+08:00</published><updated>2009-08-05T07:58:58.993+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>DIGITIMES「剖析Android發展趨勢及產品開發關鍵」研討會</title><content type='html'>&lt;p&gt;Seminar: Trends in Android development and the key to product development&lt;/p&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/Sh4MjT3QEII/AAAAAAAAAHU/LGvBMfOX2xM/title.jpg" border="0" /&gt;

&lt;p&gt;6/9 星期二下午，DIGITIMES Research 有舉辦 DIGITIMES 科技大勢系列講座（99）「剖析Android發展趨勢及產品開發關鍵」研討會。地點在台北市民生東路4段133號14F。&lt;/p&gt;

&lt;p&gt;最後一場，是由我所主講的「&lt;b&gt;開發Android應用該具備的思維與技巧&lt;/b&gt;」。&lt;/p&gt;

&lt;p&gt;整個活動議程如下：&lt;/p&gt;
&lt;span class="fullpost"&gt;
&lt;table border=1 style="background-color:#ffffff;color:#000"&gt;&lt;tr&gt;&lt;td&gt;時 間&lt;/td&gt;&lt;td&gt;議 　題&lt;/td&gt;&lt;td&gt;講 　師&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13:00-13:30&lt;/td&gt;&lt;td colspan=2&gt;來賓報到&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13:30-14:20&lt;/td&gt;&lt;td&gt;Android軟硬體、應用發展現況及趨勢&lt;/td&gt;&lt;td&gt;DIGITIMES分析師&lt;br&gt;林俊吉&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14:20-15:10&lt;/td&gt;&lt;td&gt;Android裝置開發過程的軟硬整合關鍵及挑戰&lt;/td&gt;&lt;td&gt;0xlab 共同創辦人&lt;br&gt;陳逸帆&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15:10-15:30&lt;/td&gt;&lt;td colspan=2&gt;茶敘時間&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15:30-16:00&lt;/td&gt;&lt;td&gt;Android Netbook開發面臨難題與解決之道&lt;/td&gt;&lt;td&gt;資策會網多所 副主任&lt;br&gt;張登章&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="background-color:#ffff00;color:#000"&gt;&lt;td&gt;16:00-16:50&lt;/td&gt;&lt;td&gt;開發Android應用該具備的思維與技巧&lt;/td&gt;&lt;td&gt;Android應用開發達人&lt;br&gt;盧育聖(Sam Lu)先生&lt;br&gt;具超過20年軟體應用開發經驗&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16:50&lt;/td&gt;&lt;td colspan=2&gt;結束&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;想要了解更詳細內容的，請點選 &lt;a href="http://www.digitimes.com.tw/seminar/DTR980609.htm"&gt;http://www.digitimes.com.tw/seminar/DTR980609.htm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;底下是當天活動的照片，當天來了 170 多個聽眾。聽說是 Digitimes 所辦的 Android 場次中，人數最多的一次。&lt;br&gt;
&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SjLlp8mHJGI/AAAAAAAAAH0/rXNVeETEdRU/all.jpg" border="0" /&gt;&lt;br&gt;
&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/SjLlpxKzBMI/AAAAAAAAAHs/w00lX56QKkE/me.jpg" border="0" /&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3715741434497987499?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3715741434497987499/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/05/digitimesandroid.html#comment-form' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3715741434497987499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3715741434497987499'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/05/digitimesandroid.html' title='DIGITIMES「剖析Android發展趨勢及產品開發關鍵」研討會'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/Sh4MjT3QEII/AAAAAAAAAHU/LGvBMfOX2xM/s72-c/title.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-6333000595314672992</id><published>2009-05-25T09:00:00.000+08:00</published><updated>2009-08-05T07:58:58.993+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='porting'/><title type='text'>Android 開發板</title><content type='html'>&lt;p&gt;TI OMAP-based development board for Android&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/ShQDuyEtByI/AAAAAAAAAHM/pmB1H9xNMPk/android_dev_board.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;去年就在中國大陸的某個論壇上，看到這塊開發板。最近經朋友的通知，發現在台灣的拍賣網上，也有人在賣這塊以 TI OMAP 3530 為核心基礎的 Android 開發板。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;看起來，還是原封不動地從大陸進口進來，連規格說明都還是簡體中文。仔細看了一下，沒有 GSM 及網路等模組，也不是觸控螢幕，不過要拿來當學習 Android 底層的 porting 應該可以。不過你不要期望太高，我猜 Android 很多模組，在這塊板子上執行時，應該都會有問題的。&lt;/p&gt;

&lt;p&gt;有興趣的，直接上拍賣網找找。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-6333000595314672992?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/6333000595314672992/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/05/android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6333000595314672992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/6333000595314672992'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/05/android.html' title='Android 開發板'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/ShQDuyEtByI/AAAAAAAAAHM/pmB1H9xNMPk/s72-c/android_dev_board.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5807343030718316847</id><published>2009-05-10T04:22:00.006+08:00</published><updated>2009-08-05T07:58:58.994+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>第三方 Android Market</title><content type='html'>&lt;p&gt;The 3-rd Android Market Services&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SgXzPs6UcdI/AAAAAAAAAG8/-ja4WLmvK34/guanggao1.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這兩個禮拜，人都在西班牙。原想應該有不少免費 WI-FI 可用，至少在這個 FON 發源地的國家，應該會有 FON 基地台吧。結果一路下來，幾乎找不到免費的 WI-FI 可以用。真讓我懷疑，FON 的經營是否有了問題。&lt;/p&gt;

&lt;p&gt;憋了一個多禮拜不能上網，終於在 Malaga 這個南方靠地中海的城市旅館裡，有了免費的網路可用。閒逛了一下，發現中國出了個類似 Android Market 的服務，叫做 &lt;a href="http://www.mmarket.com/"&gt;M-Market&lt;/a&gt;，目前上面 Android 的軟體還不多。&lt;/p&gt;

&lt;span class="fullpost"&gt; 
&lt;p&gt;其實，早在 Android Market 推出之前， &lt;a href="http://slideme.org/"&gt;SlideMe&lt;/a&gt; 就推出 SAM (SlideME Application Manager) 這個類似 Android Market 的服務。SlideMe runs 了這麼久的時間，那上面的應用程式也才只有 180 個，算是少的可憐。類似這樣的第三方應用程式發行商，著名的還有 PalmGear, Handango。&lt;/p&gt;

&lt;p&gt;這類的第三方 Market 服務，在目前各家智慧型手機發行商，都有自己 Market 服務下，我覺得應該是很難經營下去。沒有了終端使用者，程式發展者自然也不會將程式放在那上頭，如此循環下去，早晚要關門的。我猜 PalmGear 應該會先關門，Handango 還能靠 Feature Phones 撐住營運。至於這些直接和 Market 對打的服務，應該連跨出第一步都很難。&lt;/p&gt;

&lt;p&gt;大陸的 M-Market ，雖然有龐大的中國市場當後盾，不過如過是要正派經營，不走散佈盜版軟體這條路。我還看不出來，在現今中國的生態環境下，他有生存的空間。不過要是能聯合所有的 Android 山寨機，出個 &lt;b&gt;山寨 Market&lt;/b&gt;，專門擺各式山寨軟體，在中國這個特殊國情下，倒是會有很好的發展機會。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-5807343030718316847?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/5807343030718316847/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/05/android-market.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5807343030718316847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/5807343030718316847'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/05/android-market.html' title='第三方 Android Market'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/SgXzPs6UcdI/AAAAAAAAAG8/-ja4WLmvK34/s72-c/guanggao1.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-9123648763252275750</id><published>2009-04-30T10:32:00.010+08:00</published><updated>2009-08-05T07:58:58.995+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>Android Wednesday Party @ Google</title><content type='html'>&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/Sfk4VfdLfMI/AAAAAAAAAGs/rLZkxDUt0zY/b.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;這次是癮科技辦的台灣 Android 第二次聚會，有不少的老面孔，Jason, Eric, Tom, android_tw, Ondra, Spencer, Slayer, Koji，院長, johnyank，更多的是來了不少新朋友，將近有 40 位。好在，這次是在 Google 辦公室舉辦，才能提供這麼舒適的環境，讓 Android 社群的朋友聚集在一起，一起分享知識，也分享 Google 的美食。癮科技的主辦人 - Jimmy ，實在是很有心，才能將這次的活動辦的這麼成功。&lt;/p&gt;

&lt;p&gt;台灣的 Android developers 一直都很孤單，都是孤軍奮戰的多，能得到的外援也不多。我一直希望能有個機會，將台灣的 Android developers 集結在一起，彼此分享知識與想法。畢竟，要大家團結在一起，才能發揮更大的加乘力量。這也是為什麼，我有好幾個 joined projects，像是 aTrackDog, aNetShare 等等。而結果也證明這些 projects 都有不錯的成績。&lt;/p&gt;

&lt;p&gt;這次聚會，也是抱持著分享的精神，上台分享 Android Market 目前的狀態。這些資訊，對於 developers 來說，都是非常重要的參考資訊。&lt;/p&gt;

&lt;span class="fullpost"&gt; 
&lt;p&gt;前面幾張，先讓大家了解目前 Android Market 的成長情形。在目前手機不到 2M 的情況下，這些數據顯示的結果應該還 ok，除了付費軟體的成長，實在太慢這個問題外。&lt;/p&gt;

&lt;p&gt;"# of App For Each Category" 這張投影片中的數據，我覺得是很重要的參考資訊。你可以透過它，了解目前各個類別的應用程式數目。當你發佈你的程式到 Android  Market 上時，如何選定類別，就是關鍵的第一步。&lt;/p&gt;

&lt;p&gt;後面幾張的內容對 developers 來說，是最重要的參考資訊。一但你有個好的 idea，要開始動手寫程式之前，務必要依我的建議，先到這些網站 survey 一下。有多少人已經寫出和你想要做的軟體一樣的東西？這些人寫的，和你想要做的有何不同？如果沒有，先不要高興，有可能這類軟體的需求，並不高。很多人會說，我寫的軟體只是好玩而已，不用這麼慎重吧，還要做這麼多 survey！？其實，有太多例子都說明，當你寫完你的軟體時，最終還是會想要發佈到 Android Market 上，分享給其他人使用。如果這時，你才發現已經有好幾個同性質的軟體，導致你軟體的排行名次一直無法往上升。我想這應該是蠻沮喪，也是你所不樂見的事。&lt;/p&gt;

&lt;p&gt;最後，底下是當天演講的投影片。&lt;/p&gt;

&lt;p&gt;歡迎大家引用，但為尊重著作權，引用時請註明出處，也請您勿部分或全部使用於演講或著作等相關用途。&lt;/p&gt;

&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dfcsjjs_2715r85wvf5' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;

&lt;p&gt;希望當天有來的朋友們，能夠不虛此行，也希望你回去時，有滿滿的收穫。如果內容有問題，或不清楚的，歡迎大家在此留言。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SfkS-3i1ZYI/AAAAAAAAAGk/G8lkW7Y3ecA/a.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SgW-wGRQ3tI/AAAAAAAAAG0/L5vGGEh8Dgg/sam.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;當天照了一些相片，結果不幸被我誤殺了，只好引用癮科技上大家照的相片。因來源不一，沒註明引用來源，有引用問題的，也請告訴我。&lt;/p&gt;

&lt;p&gt;底下是更多關於這次活動的內容。&lt;br&gt;&lt;a href="http://android.cool3c.com/article/7744"&gt;Android星期三同樂會在Google：聚會後的分享頁 &lt;/a&gt;&lt;br&gt;&lt;a href="http://android.cool3c.com/article/7657"&gt;Android星期三同樂會：前噗後浪實況報導&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-9123648763252275750?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/9123648763252275750/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/04/android-wednesday-party-google.html#comment-form' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/9123648763252275750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/9123648763252275750'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/04/android-wednesday-party-google.html' title='Android Wednesday Party @ Google'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/Sfk4VfdLfMI/AAAAAAAAAGs/rLZkxDUt0zY/s72-c/b.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-3198367920021734750</id><published>2009-04-27T09:00:00.002+08:00</published><updated>2009-08-05T07:58:58.996+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>Android Market 上真的可以賺到錢嗎？</title><content type='html'>&lt;p&gt;How much did you get paid from Android Market?&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SczVR2V840I/AAAAAAAAAF0/AFuejaRLUhs/money.png" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在 &lt;a href="http://ysl-paradise.blogspot.com/2008/11/2008-twjug-1122-android-introduction.html"&gt;2008 TWJUG 11/22 活動實錄&lt;/a&gt; 的投影片中，我有敎你如何計算，從 Shareware 的銷售中可以賺到多少錢。看到那數據，有點失望吧！不過那時舉的例子是 PDA 的平台，對於 Android ，這個人人必備的手機平台，銷售量少說也是那是 PDA 的數十倍。衝著這有數十倍的銷售量，讓不少人對於從 Android 付費軟體上賺錢，都滿懷著期望，腦袋裡，都抱著賺大錢的美夢。&lt;/p&gt;

&lt;p&gt;如果你也是這懷抱賺錢美夢其中的一員，先問你一下，你覺得一個月賺多少。才有達到你所謂賺大錢的目標？&lt;/p&gt;

&lt;p&gt;在你回答之前，讓我們先來看看目前十大最受歡迎付費軟體的銷售成績。&lt;/p&gt;
  
&lt;p&gt;Android Market 從 2009/2/20，陸續開放讓美英的使用者，可以購買付費軟體。到 2009/3/27 ，剛好經過一個月多一點的時間，剛好可以讓我們來檢視一下這些付費軟體開發者的月收入有多少。&lt;/p&gt;

&lt;span class="fullpost"&gt; 
&lt;p&gt;從 &lt;a href="http://aTrackDog.a0soft.com"&gt;aTrackDog&lt;/a&gt; 的 &lt;a href="http://atrackdog.a0soft.com/index.php?tz=0&amp;view=weekly&amp;c=-1&amp;p=paid"&gt;每週最受歡迎付費軟體排行榜&lt;/a&gt; 來看，目前最前十名最受歡迎的付費軟體，分別為：&lt;/p&gt;
&lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;
&lt;tr&gt;&lt;td&gt;App Name&lt;/td&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Dwonload&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/mobi.bbase.ahome"&gt;aHome&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$4.99&lt;/td&gt;&lt;td&gt;5,000-10,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.acme.android.powermanagerpro"&gt;Power Manager&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$0.99&lt;/td&gt;&lt;td&gt;5,000-10,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.ap.SnapPhoto_Pro"&gt;SnapPhotoPro&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$0.99&lt;/td&gt;&lt;td&gt;1,000-5,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.betterandroid.openhome2"&gt;Open Home&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$2.99&lt;/td&gt;&lt;td&gt;5,000-10,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.betterandroid.bettercut"&gt;Better Cut&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$2.99&lt;/td&gt;&lt;td&gt;1,000-5,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.rerware.android.MyBackupPro"&gt;MyBackup Pro&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$2.99&lt;/td&gt;&lt;td&gt;1,000-5,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.multiplefacets.aol"&gt;Hello IM!&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$9.99&lt;/td&gt;&lt;td&gt;5,000-10,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.arron.taskManager"&gt;Advanced Task Manager&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$0.99&lt;/td&gt;&lt;td&gt;1,000-5,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/alterforce.engine"&gt;Jewellust&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$2.95&lt;/td&gt;&lt;td&gt;5,000-10,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.cyrket.com/package/com.google.code.p.slideunlocker2d"&gt;Lock 2.0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;$1.49&lt;/td&gt;&lt;td&gt;1,000-5,000&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;下載數就是兩種範圍 1,000-5,000 以及 5,000-10,000，沒有準確的的下載數，只能抓個約略數，就取中間數來計算好了。下載數在 1,000-5,000 的，以 2500 計算；下載數在 5,000-10,000 的，以 7500 計算。&lt;/p&gt;

&lt;p&gt;由於 Android 有 24 小時內無條件退錢的機制，因此我猜，這些付費軟體的購買率，最終應該都在 40% 以下。就讓我們以 40% 來計算。&lt;/p&gt;


&lt;p&gt;別忘了，最後 T-Mobile 還要抽三成。將這些都算進去後，以美金對台幣 1:34 的匯率來算，我將他換成台幣，並以銷售金額來排。這些軟體發展者，平均每月的收入依序是：&lt;/p&gt;

&lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;
&lt;tr&gt;&lt;td&gt;App Name&lt;/td&gt;&lt;td&gt;Income(NT$)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Hello IM!&lt;/td&gt;&lt;td&gt;$713,286&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;aHome&lt;/td&gt;&lt;td&gt;$356,286&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Open Home&lt;/td&gt;&lt;td&gt;$213,486&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Jewellust&lt;/td&gt;&lt;td&gt;$210,630&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Better Cut&lt;/td&gt;&lt;td&gt;$71,162&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MyBackup Pro&lt;/td&gt;&lt;td&gt;$71,162&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Power Manager&lt;/td&gt;&lt;td&gt;$70,686&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Lock 2.0&lt;/td&gt;&lt;td&gt;$35,462&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SnapPhotoPro&lt;/td&gt;&lt;td&gt;$23,562&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Advanced Task Manager&lt;/td&gt;&lt;td&gt;$23,562&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;收入最高的是 Hello AIM!，約有 70 多萬，不過我看他的評價不高，實際收入應該再低於此數。最底的一個月有 2 萬多。掐頭去尾，取中間數來看，前十名的，每月收入約有 7 萬。&lt;/p&gt;

&lt;p&gt;月收入 7 萬，這還是要到擠入所有應用程式前十名的，才有這個數。如果擠不進去的，收入應該少更多。&lt;/p&gt;

&lt;p&gt;不過現在 Android 手機才不到兩百萬隻，有這樣的成績也還算 ok 啦。等到 2009 年底時，如果 Android 手機能衝到 1 千萬隻。到時說不定，上面的數字有機會可以變成 5 倍。&lt;/p&gt;

&lt;p&gt;多少才是有賺大錢，這可得端視你的慾望有多高，每個人心中的數都不同。我ㄧ開頭問你問題的那個答案，你也不用告訴我。我已經將現況分析給你看，目前在 Android Market 上，能不能真的讓你賺大錢，就由你自己來回答了。&lt;/p&gt;

&lt;p&gt;Other references:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;http://www.huffingtonpost.com/william-volk/mountain-view-we-have-a-p_b_189252.html&lt;/li&gt;&lt;/ul&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-3198367920021734750?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/3198367920021734750/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/04/android-market_27.html#comment-form' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3198367920021734750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/3198367920021734750'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/04/android-market_27.html' title='Android Market 上真的可以賺到錢嗎？'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/SczVR2V840I/AAAAAAAAAF0/AFuejaRLUhs/s72-c/money.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2169566560885600555</id><published>2009-04-13T09:00:00.008+08:00</published><updated>2009-08-05T07:58:58.997+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>不妙！Android Market 的成長動能又開始減緩中！</title><content type='html'>&lt;p&gt;The momentum of Android Market is getting slow again!&lt;/p&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/Sd2HZG-mf8I/AAAAAAAAAGE/cRZM3iGIgcE/total_app.jpg" border="0" /&gt;

&lt;p&gt;又到了每月 Android Market 的現況報告時間。&lt;/p&gt;

&lt;p&gt;這原本應該是由 Google 或是 T-Mobile 來報告的，只是這個月的數字不怎麼好看，這些 CXO 們，沒人願意出面報告。找了半天，我只看到 &lt;a href="http://www.itworld.com/personal-tech/64481/android-market-needs-more-filters-t-mobile-says"&gt;T-Mobile CTO Cole Brodman 在 3/17&lt;/a&gt; 講了 "There are about 2,300 offerings in total on the Android Market. That's a good thing"。&lt;b&gt;&lt;font color=blue&gt;目前 Market 的狀況，真的是 good thing 嗎？別忘了，數字是會說話的&lt;/font&gt;&lt;/b&gt;。就讓我來代司其職，向關心 Android Market 發展的朋友們，報告一下現在的情況吧！&lt;/p&gt;

&lt;p&gt;到三月底為止，總軟體數有 &lt;b&gt;2700+&lt;/b&gt;，其中應用軟體數有 &lt;b&gt;2160+&lt;/b&gt;，遊戲軟體數則有 &lt;b&gt;540+&lt;/b&gt;。最上面這張圖，顯示 Market 從開市到三月底，總軟體數，應用軟體數，遊戲軟體數以及開發者的成長曲線。從圖中，我們可以看出整個成長動能是由 2/M 之後才開始啟動的，這原因是因為 2/13 開始開放付費軟體上架，自然吸引不少新軟體的出現。&lt;/p&gt;

&lt;span class="fullpost"&gt; 
&lt;p&gt;不過，你看到了什麼問題嗎？首先&lt;b&gt;&lt;font color=blue&gt;最明顯的是，遊戲軟體的成長動能嚴重地不足&lt;/font&gt;&lt;/b&gt;，成長力道只維持了半個月，整個曲線就開始趨於平緩。總軟體數的成長，主要還是靠應用類的軟體在支撐。其實不僅遊戲軟體的成長動能不足，他只是最嚴重的。明眼人都可以看到，&lt;b&gt;&lt;font color=blue&gt;所有的曲線都顯示出，成長動能不再的趨勢&lt;/font&gt;&lt;/b&gt;。&lt;/p&gt;

&lt;p&gt;看到這，Google 死忠派，可能還是有 balabala 一堆的說辭，來幫這個曲線圓好話。好吧，讓我們繼續看下一張，Apple AppStore 與 Android Market 同期，總軟體數的 PK 圖。&lt;/p&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/Sd3NPo5ccJI/AAAAAAAAAGc/ClMbga1cK88/store_market.jpg" border="0" /&gt;

&lt;p&gt;看到了沒，這 AppStore 的成長曲線是多麼地健康啊，一路長紅，往上直飆，還不見停下來的趨勢。&lt;b&gt;&lt;font color=blue&gt;反觀 Market 的成長曲線，你要說他步步踏實也行，還是緩步走高都好。雖還不至於病入膏肓，不過這嬰兒學步期也未免太久了吧！&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;PS: 這裡所謂的同期，是指從各自開市，經過相同時間，來相互比較的結果。例如 "4nd month" 就是拿 AppStore 在 2008/10/E 的數目，對上 Market 在 2009/2/E 的數目。&lt;/p&gt;

&lt;p&gt;付費軟體機制剛在 2/13 開放，才經過一個半月的時間，這付費軟體的成長動能應該不差吧！不是我要潑你冷水，你別做大頭夢了，再看看下面這張圖吧！&lt;/p&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/Sd2HZOUyXMI/AAAAAAAAAGM/5wPySoWv3PM/free_priced_app.jpg" border="0" /&gt;

&lt;p&gt;免費遊戲已經是一灘死水，都快成水平線了。付費的應用軟體及遊戲軟體，也好不到哪。才經過半個月的時間，成長曲線也已經如飽和市場的狀態。&lt;/p&gt;

&lt;p&gt;盼了好久的付費軟體機制，才過沒多久的時間，就已經是這種結果。我在 &lt;a href="http://ysl-paradise.blogspot.com/2009/03/android-market-2.html"&gt;這裡提了好些問題點&lt;/a&gt;，Market 的腳步再不快點，開發者的耐心是有限的。&lt;/p&gt;

&lt;p&gt;到三月底止，付費軟體的總數約 900+，免費軟體的總數為 1800+。所以大概是呈 1:2 的分佈。不過，從走勢來預測，免費軟體還是 Market 上的主流。&lt;b&gt;&lt;font color=blue&gt;我想這原因和目前付費軟體機制還未擴及全球，與付費軟體的下載和購買率過低有關，造成開發者還是處在觀望狀態。&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;最後的這張，就是例行各個類別的免費及付費軟體數比較圖。在免費軟體上，Tool 類別的競爭還是最激烈的。在付費軟體上，主要是以 Entertainment, Tools 以及遊戲軟體為大宗。&lt;/p&gt;

&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/Sd2HZFpDiJI/AAAAAAAAAGU/nOib5pXYskc/cat_app.jpg" border="0" /&gt;

&lt;p&gt;唉，每次看到 Market 的情形，我就實在很生氣。因此你看到的，都是我的討伐之聲，好像我巴不得 Android 趕快完蛋。說真的，我也是隸屬於 Google 的死忠派！我只能說，我真是語重心長，恨鐵不成鋼啊！&lt;/p&gt;

&lt;p&gt;Google 的天才們！你們還不曉得 Market 出問題了嗎？&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2169566560885600555?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2169566560885600555/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/04/android-market.html#comment-form' title='10 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2169566560885600555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2169566560885600555'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/04/android-market.html' title='不妙！Android Market 的成長動能又開始減緩中！'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/Sd2HZG-mf8I/AAAAAAAAAGE/cRZM3iGIgcE/s72-c/total_app.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1977953505231775945</id><published>2009-04-01T09:00:00.004+08:00</published><updated>2009-08-05T07:58:58.998+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ondrej'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Testing Android Applications - part 1</title><content type='html'>&lt;p&gt;Adroid 應用程式的測試方法 - I&lt;/p&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SdA5EuaQ1HI/AAAAAAAAAF8/E8IvOykUrmE/testing.jpg" border="0" /&gt;&lt;p align="center"&gt;

圖片引用自 tucowsinc.com&lt;/p&gt;
&lt;p&gt;Unit tests and testing are parts of each developer's life and they are important
parts of development. Developers usually concentrate on unit tests which help
them ensure that future changes will not break the system and let other people
do tests and stress tests of applications to reveal bugs, which we as developers
simply cannot see. &lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;About This Series of Articles&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; This is the first article about testing Android applications. We will look
at some testing background, discuss basic elements available for you in the
SDK and show how to prepare testing environment to run tests. In following articles
we will concentrate on describing testing methods in detail.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Short History of Android Testing&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Prior to Android SDK 1.0 there was a huge gap in testing of android applications
which inspired 3rd-party testing frameworks such as &lt;a href="http://code.google.com/p/autoandroid/"&gt;Positron&lt;/a&gt;
and &lt;a href="http://dtmilano.blogspot.com/2008/04/android-developer-challenger-electron.html"&gt;Electron&lt;/a&gt;.
With Android SDK 1.0 Google filled the gap with its own testing framework and
Positron and Electron frameworks are not needed any more. Filled the gap in
testing and filled it well. Let's have a look at what is available there for
us. We will concentrate on unit and functional test which are supported with
new part of Android SDK.&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Unit Testing&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There are basically three levels of tests/unit-test you can use in your application:&lt;/p&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;ol&gt;
&lt;li&gt;Unit testing of logic which does not depend on android at all. This is similar
to every usual unit testing. Running tests directly from Eclipse requires
some configuration changes which we will cover later.&lt;/li&gt;
&lt;li&gt;Unit testing of business logic which depends on Android but does not depend
on Android application elements and ui. These logic does not require activity
to be running with complete context and it can be tested in isolation from
ui. These tests usually require something from context (e.g. resources, configuration,
logger, some native classes)&lt;/li&gt;
&lt;li&gt;Unit/funcional testing of Android application elements. These tests are
fully instantiated activities, services, content providers and applications.
Via instrumentation it is possible to send keyboard and touch events to the
activities and check response in ui. It is possible to test lifecycle of a
service and to test databases changes made by content provider. &lt;/li&gt;
&lt;/ol&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;p&gt;To be able to test layers of the application in isolation using and fully use
prevoius three levels. It is useful to follow these guidelines during design
and development phases of your Android application:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Separate business logic from ui logic as much as possible.&lt;/li&gt;
&lt;li&gt;Create presenter for complicated activities which models state on the screen
and binds to the views according to MVP pattern.&lt;/li&gt;
&lt;li&gt;Make clear non expansive contracts between ui layer and business logic.&lt;/li&gt;
&lt;li&gt;Return error codes from business logic and let present logic transform them
to error messages.&lt;/li&gt;
&lt;li&gt;Pass configuraton stored in preferences or in resources in parameters and
do not load it in business logic &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;How to Prepare Testi&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ng Environment for Unit
Tests&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Good starting point for preparing environment for tests which do not depend
on Android can be found &lt;a href="http://dtmilano.blogspot.com/2008/11/android-testing-on-android-platform.html"&gt;here&lt;/a&gt;.
Android runtime in android.jar contains some subset of junit which can not be
used out of android environment. If you try to run unit test directly from Eclipse,
you get exception like this: &lt;/p&gt;
&lt;blockquote&gt;...

Internal Error (classFileParser.cpp:2924), pid=11018, tid=3084700560 # Error:
ShouldNotReachHere()

...&lt;/blockquote&gt;
&lt;p&gt;To be able to run tests from Eclipse you have to replace android.jar by junit.jar&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;go to "Run Configurations"&lt;/li&gt;
&lt;li&gt;search for configuration running your unit test&lt;/li&gt;
&lt;li&gt;go to "Classpath" tab&lt;/li&gt;
&lt;li&gt;remove "Android Library" from "Bootstrap Entries"&lt;/li&gt;
&lt;li&gt;then go to project build path configuration&lt;/li&gt;
&lt;li&gt;and add Junit library to your project&lt;/li&gt;
&lt;li&gt;you should be able to run junit unit tests&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="fullpost"&gt;&lt;span class="fullpost"&gt;&lt;span&gt;&lt;span class="fullpost"&gt;&lt;span&gt;&lt;span class="fullpost"&gt;&lt;span&gt;&lt;span class="fullpost"&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lc1NoOMfdNY/Sd05IH_FcVI/AAAAAAAACzM/NSIAThnW8Ac/s1600-h/classpath.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 145px;" src="http://1.bp.blogspot.com/_lc1NoOMfdNY/Sd05IH_FcVI/AAAAAAAACzM/NSIAThnW8Ac/s200/classpath.png" alt="" id="BLOGGER_PHOTO_ID_5322473146367177042" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="fullpost"&gt;&lt;span class="fullpost"&gt;&lt;span class="fullpost"&gt;&lt;span&gt;&lt;span class="fullpost"&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lc1NoOMfdNY/Sd05HwWNekI/AAAAAAAACzE/Y-HSTm8-1d4/s1600-h/run.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 168px;" src="http://4.bp.blogspot.com/_lc1NoOMfdNY/Sd05HwWNekI/AAAAAAAACzE/Y-HSTm8-1d4/s200/run.png" alt="" id="BLOGGER_PHOTO_ID_5322473140021721666" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class="fullpost"&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lc1NoOMfdNY/Sc9oVnJoCVI/AAAAAAAACow/rpcEcYz88xw/s1600-h/buildpath+.png"&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;
&lt;span class="fullpost"&gt;
&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Image on the left shows "Run Configuration" dialog with Android library not
deleted and image on the right shows configuration of build path. It is sometimes
even possible to unit test classes which depends on classes from android.jar
by deleting junit classes in the jar file. But once tested classes requires
something from android runtime, you get exceptions.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Setup for Tests Depending on Android&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Good starting point is &lt;a href="http://dtmilano.blogspot.com/2008/11/android-testing-on-android-platf.html"&gt;here&lt;/a&gt;
which shows how to set separate application and test environment but does not
show that is possible to have everything working together in one project. You
have to setup instrumentation for your project which allows your tests to hook
into your application and take control over application ui and pass various
events.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add &amp;lt;uses-library android:name="android.test.runner" /&gt; to &lt;application&gt;
alement in your manifest file&lt;/application&gt;&lt;/li&gt;
&lt;li&gt;Add test runner definition to your manifest file&lt;/li&gt;
&lt;/ul&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;&lt;br /&gt;&lt;instrumentation name="android.test.InstrumentationTestRunner" targetpackage="eu.inmite.prj.aclient" label="Tests for Small Project"&gt;&lt;br /&gt;&lt;/textarea&gt;
&lt;p&gt;where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;android:name is name of the test runner class - use android.test.InstrumentationTestRunner
as default&lt;/li&gt;
&lt;li&gt;android:targetPackage is application package you want to instrument&lt;/li&gt;
&lt;li&gt;android:label is name of the test which appears under Instrumentation in
Dev Tools application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;How to Run Tests Depending on Android in Eclipse
and Emulator&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To run tests directly from emulator go to DevTools application in the emulator,
select Instrumentation and click on the name of the tests you want to run. Results
and lot of debugging output can be found in Logcat console. &lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;How to Run Tests Depending on Android with
adb&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To run tests from command line enter &lt;/p&gt;
&lt;blockquote&gt;adb shell am instrument -w PACKAGE/android.test.InstrumentationTestRunner&lt;/blockquote&gt;
&lt;p&gt;where PACKAGE is full name of application package which should be instrumented.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Monkey&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; Does everything seem to be too complicated for you? Do you wonder if there
is simple way how to test Android application? The answer is &lt;a href="http://developer.android.com/guide/developing/tools/monkey.html"&gt;UI/Application
Exerciser Monkey&lt;/a&gt; tool available in Android SDK. Monkey is quite fast way
for testing of ui. Just be warned that monkey does not like real devices yet.
There is bug which causes that monkey is killed by Android whenever it tries
to send a notification key to the real T-Mobile G1 device. Now our clever monkey
likes to work without bugs with the emulator only. &lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Next Article...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; So far we know what we can test on Android application and we know how to
setup and run various kinds of tests. Next time we will look at some tips and
hints how to actually write unit and functional tests. &lt;/p&gt;
&lt;p&gt;Stay tuned...&lt;/p&gt;

&lt;p&gt;註：&lt;/p&gt;
&lt;p&gt;這是 Ondrej 的第一篇文章，原先是想幫他在文中譯註關鍵部份。不過我讀了一下，發覺他的用語都還簡單易懂，加上又是技術文章，大家應該有能力，理解他所要傳遞的知識。如果硬在原文中，加上中文譯註，反倒破壞了閱讀者的流暢性。&lt;/p&gt;
&lt;p&gt;最後決定，我會在文章的最後，加上關鍵部份的註解。不會逐字翻譯，多是將重點或精神點出。如果你有任何的問題，歡迎在這裡提問，中文發問也可以的。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;單元測試 (Unit Testing)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;以測試的角度來看，基本上一 個應用程式可分成三層：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logic: 純粹程式邏輯的部份，也就是和 Android 系統以及 UI 無關的部份。&lt;/li&gt;
&lt;li&gt;Business logic: 和 Android 系統邏輯相關，但和 UI (例如 Activity, View, Dialog, Context,
Resources, Logger 都是 UI 相關部份) 無關的部份。&lt;/li&gt;
&lt;li&gt;UI logic: 當然就是和 UI 息息相關的部份。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要讓你的程式達到 "可測試" 的程度，你必須在寫程式注意一些事情，及遵守下列原則：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;程式中要盡量將上面提到的三層，清楚分開&lt;/li&gt;
&lt;li&gt;可以利用 &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc188690.aspx"&gt;MVP
(Model, View, Presenter)&lt;/a&gt; 設計範式幫你分開，尤其是與 UI 相關及無關的部份，一定要切乾淨。&lt;/li&gt;
&lt;li&gt;在 UI 層與 Business logic 層之間的溝通傳遞協定，要盡量簡單清楚。&lt;/li&gt;
&lt;li&gt;不要在 Business logic 這層中，直接顯示錯誤訊息。應該要傳回錯誤碼，由 UI 層來顯示。&lt;/li&gt;
&lt;li&gt;也不要在 Business logic 層中，直接使用 Android 的 API 去讀取 preferences 設定，或是從 resources
中讀字串值。只有 UI 層，才能使用 Android 的 APIs，讀取到值後，再傳給 Business logic 那一層的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1977953505231775945?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1977953505231775945/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/testing-android-applications-part-1.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1977953505231775945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1977953505231775945'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/testing-android-applications-part-1.html' title='Testing Android Applications - part 1'/><author><name>ondra Z</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SdA5EuaQ1HI/AAAAAAAAAF8/E8IvOykUrmE/s72-c/testing.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1285854922239524036</id><published>2009-03-30T09:00:00.002+08:00</published><updated>2009-08-05T07:58:58.999+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>提高曝光率還是增加銷售數最好的方式</title><content type='html'>&lt;p&gt;Increase the app's visibility will definitely improve the sales volume&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/ScyqI8pobmI/AAAAAAAAAFk/e2LcfypDaHo/sales_volume.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Ed Burnette 是 &lt;a href="http://www.pragprog.com/titles/eband/hello-android"&gt;Hello, Android&lt;/a&gt; 這一本書的作者。除了寫這本書外，他還發行一個評價不錯的免費 Android 軟體，&lt;a href="http://www.cyrket.com/package/org.example.translate"&gt;Re-Translate Lite&lt;/a&gt;。這個軟體目前的下載次數為 10,000-50,000，評價約 4.33 顆星。為了實驗到底從 Android Market 上可以賺多少錢，他又寫了個類似但功能更多的 &lt;a href="http://www.cyrket.com/package/com.edburnette.retranslate"&gt;Re-Translate&lt;/a&gt; 付費軟體，並拿這兩個軟體，在 Android Market 這個銷售平台上，做了 &lt;a href="http://blogs.zdnet.com/Burnette/?cat=44"&gt;一系列的測試與實驗&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;首先是 &lt;a href="http://blogs.zdnet.com/Burnette/?p=800"&gt;Market Moves: Sales disappoint so far&lt;/a&gt;，他將付費軟體的定價設定在 $2.99。結果當然很慘，一週內只有 8 個人購買，更慘的是其中 3 個還直接退錢，不買了。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p align=center&gt;&lt;img src="http://i.zdnet.com/blogs/retranslate-8.png" /&gt;&lt;/p&gt;

&lt;p&gt;銷售量不佳，接著當然是用降價招數啦。他將售價直接降到 $0.99，&lt;a href="http://blogs.zdnet.com/Burnette/?p=824"&gt;Market Moves: Reducing price doubles sales&lt;/a&gt;，嚇，一口氣售價降了 1/3。嗯，銷售量提高到 24 人購買，不過退錢的也有 10 個人。看起來，降價招數雖然能提高銷售數，不過對總體營收一點幫助也沒有。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://i.zdnet.com/blogs/retranslate20090302.png" /&gt;&lt;/p&gt;

&lt;p&gt;之後，他想到原先自己的免費軟體下載數這麼高，和自己的付費軟體功能又多數相同，會不會變成自己打自己了。於是，他從 Market 上移除他的免費軟體，只剩付費軟體在 Market 上頭。打的如意算盤，自然就是希望原先使用免費軟體的那群人，能轉移到付費軟體上。此刻他心中，正想著如果能將免費軟體的下載數，全都轉成銷售數，那真的可以，買個屬於自己的熱帶島嶼，過著天天度假般的生活。答案在 &lt;a href="http://blogs.zdnet.com/Burnette/?p=838"&gt;Market Moves: Out with the free&lt;/a&gt;。你可以看到，移除免費軟體的結果，非但沒有提高銷售數，還使得銷售量呈現負成長。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://i.zdnet.com/blogs/market4c.png" /&gt;&lt;/p&gt;

&lt;p&gt;這原因就出在，&lt;b&gt;雖然同性質的免費軟體，會有自己打自己的疑慮；不過相對的，他也是你最好的人潮吸引機，先靠免費軟體吸引使用者使用，需要更多功能的使用者，才有可能去購買你的付費軟體。少了免費軟體的加持，當然連原先的人潮也不見了。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;最後，他乾脆將定價設為零圓，&lt;a href="http://blogs.zdnet.com/Burnette/?p=862"&gt;Market Moves: Making it up on volume?&lt;/a&gt;，先不管賺多少，先衝量再說。哇！這招夠狠，有置死地於後生的味道。原本要錢的東西，現在突然免費了。就算我目前用不著，排再長的隊，我也要想辦法拿到。就在這免費心態下，大家搶著要，下載數當然激增到 500+，平均一天有 74 個人下載。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://i.zdnet.com/blogs/market6.png" /&gt;&lt;/p&gt;

&lt;p&gt;將定價設為零圓，對收入當然沒有幫助，再多人下載，收入還是鴨蛋一顆。不過之後，他下了最漂亮的一招，當 ending。他 &lt;a href="http://blogs.zdnet.com/Burnette/?p=862"&gt;將定價再度調回 $2.99&lt;/a&gt;。從結果看來，調回原價後，平均每天還有 5 個人購買，這結果比原先降價到 $0.99 的策略還來得好。&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://i.zdnet.com/blogs/market7.png" /&gt;&lt;/p&gt;

&lt;p&gt;為什麼會這樣，其實道理很簡單。當他利用零圓招式，成功吸引使用者的青睞，將下載數提高到 500+，&lt;b&gt;突破這 Android Market 上的第一道 0-500 天險。在排行榜上，自然往上升了好幾名，也順勢提高了曝光率，雖然調回原價，還是能維持一定的銷售量。&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;嘿，看到這，你明暸 Android Market 上的問題了嗎？由於 Market 是 Android 上唯一的銷售管道（我知道有像 Handango 這樣第三方銷售管道，不過，相信我，看那上面 app 的下載數都少的可憐，沒人用的），&lt;b&gt;一但你沒有想辦法，在軟體首發蜜月期（還在 By Date 排行的第一頁）內，提升自己在排行榜的位置，那你之後將很難翻身了。&lt;/b&gt;由於 Market 上還沒有廣告位置，可以讓你打廣告，如果你沒有擠到前 20 名，新的使用者，怎麼會看到你的軟體呢？這之後的下載曲線，自然是每況愈下囉。&lt;/p&gt;

&lt;p&gt;我們還不能上載付費軟體到 Android Market ，在這個非常不公平的遊戲規則下，已經先喪失了先機，我們還能做些什麼呢？當然，一個熱賣的付費軟體，還是要取決於你的付費軟體是否有這個價值。不過，&lt;b&gt;不可諱言地，提高曝光率還是增加銷售數最好的方式&lt;/b&gt;，沒了廣告來幫你提高曝光率。我想，你還是有機會寫個可以衝到高排行榜的免費軟體，靠這個人潮吸引機，來幫你未來的付費軟體打廣告及增加曝光率。&lt;/p&gt;

&lt;p&gt;怎樣，你準備好要寫了嗎？&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1285854922239524036?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1285854922239524036/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/blog-post.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1285854922239524036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1285854922239524036'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/blog-post.html' title='提高曝光率還是增加銷售數最好的方式'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/ScyqI8pobmI/AAAAAAAAAFk/e2LcfypDaHo/s72-c/sales_volume.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-1251696216017831237</id><published>2009-03-17T10:50:00.000+08:00</published><updated>2009-08-05T07:58:58.999+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ondrej'/><title type='text'>恩德雷 joined Sam's blog</title><content type='html'>&lt;p&gt;Welcome Ondrej to join us!&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://3.bp.blogspot.com/_a5fZt60mXGw/ScDbp8UdJ8I/AAAAAAAAAFc/pfhb-ifyRvs/cowrite.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;不久前，才透過 email 認識 Ondrej。這位來自捷克，目前定居在台北的 Android Developer。&lt;/p&gt;

&lt;p&gt;和 Ondrej 聊了一下午，知道他在 J2EE 上有多年的經驗，而其加入的 &lt;a href="http://www.inmite.eu/"&gt;Inmite&lt;/a&gt; 初創公司，有參加過 ADC，也曾受邀在 &lt;a href="http://code.google.com/intl/cs/events/developerday/2008/agenda.html"&gt;布拉格 Google Developer Days&lt;/a&gt; 上介紹 Android。他說他很願意分享他在 Android 上的經驗，聽到這，我當然就毫不猶豫地邀請他一起共筆。希望他的加入，能提供給大家更多的收穫。&lt;/p&gt;

&lt;p&gt;不用驚訝，Ondrej (&lt;b&gt;恩德雷&lt;/b&gt;是他的中文名字) 真的能說、也看得懂一些中文。請大家不要吝嗇地，多多給他些鼓勵、支持、意見、還有發問，不管是用英文或是中文都可以。底下是關於他自己的介紹：&lt;/p&gt;

&lt;p&gt;Hello,&lt;br /&gt;I am Ondrej Zahradnik 恩德雷 - Android developer living in Taipei for already almost half a year. I work for startup company &lt;a href="http://www.inmite.eu/"&gt;Inmite&lt;/a&gt; based in Prague, Czech Republic which focuses on developing Android Applications.&lt;/p&gt;

&lt;p&gt;I joined Sam's blog because I would like to share my knowledge about developing Android Applications with guys from Taiwanese Android community and help us to push Android from devoted developers to the public.&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;Although I have some background in studying Mandarin in &lt;a href="http://www.xmu.edu.cn/"&gt;Xiamen University&lt;/a&gt;, unfortunately I am not yet good enough to read and write articles about Android in Mandarin, so Sam suggested that he will translate most important parts of my articles written in English to Mandarin for you. But feel free to write comments and questions in Mandarin I will understand and will try to reply in characters. It will also help me to improve my Mandarin from street use to some technical&lt;/p&gt;

&lt;p&gt;If you have any questions related to Android or me, drop me a message by email to &lt;b&gt;ondra at inmite.eu&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Wandering why I am here so far from the business in the Czech Republic? The answer is quite simple. My girlfriend got a scholarship from Taiwanese government to study her PhD. degree here and I have decided to accompany her and we have not decided how long we stay here yet. It can from another half a year to few years.&lt;/p&gt;

&lt;p&gt;Looking forward to seeing you reading our new posts and to meet on some coming Android sessions here in Taipei.&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-1251696216017831237?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/1251696216017831237/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/joined-sams-blog.html#comment-form' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1251696216017831237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/1251696216017831237'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/joined-sams-blog.html' title='恩德雷 joined Sam&apos;s blog'/><author><name>ondra Z</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a5fZt60mXGw/ScDbp8UdJ8I/AAAAAAAAAFc/pfhb-ifyRvs/s72-c/cowrite.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2949547925622048884</id><published>2009-03-02T09:00:00.004+08:00</published><updated>2009-08-05T07:58:59.000+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>Android Market 應用程式現況 (2 月、付費軟體)</title><content type='html'>&lt;p&gt;Current status of Android Market after paid apps released&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/Saag8fq0Y8I/AAAAAAAAAFM/dHoKYW0rENc/market_app.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Android Market 終於在 &lt;a href="http://android-developers.blogspot.com/2009/02/android-market-update-support-for.html"&gt;2009/2/13&lt;/a&gt; 正式開放給美英兩國的程式開發者，上載付費軟體。隔週在 &lt;a href="http://android-developers.blogspot.com/2009/02/android-market-update-priced.html"&gt;2009/2/20&lt;/a&gt;，也開始開放讓美國的使用者，可以下載付費軟體。&lt;/p&gt;

&lt;p&gt;雖然在 Andorid 上市後四個月，開發者終於盼到 Market 開始支援付費軟體的機制。不過，對於 Google 在 Andorid Market 上的慢動作，以及不如預期的結果，我還是十分的不滿。像是只支援美英開發者上載付費軟體，&lt;a href="http://strazzere.com/blog/?p=185"&gt;付費軟體的保護機制，不到 12 小時，就被破了&lt;/a&gt;，&lt;a href="http://www.google.com/support/forum/p/Android+Market/thread?tid=02fc01b0c167e949&amp;hl=en"&gt;不支援 subscription 付費機制&lt;/a&gt;，&lt;a href="http://groups.google.com/group/android-developers/browse_thread/thread/4fb4cfab8b079809"&gt;也不重視開發者的聲音&lt;/a&gt;。推出的付費軟體的保護機制，竟然只是將執行檔複製到另個目錄而已，這樣的保護方法，終於讓我見識到 Google 的天才。總而言之，這個 Android 手機以及整個平台環境，像是還是 beta 中一般，混亂且不成熟。&lt;/p&gt;

&lt;p&gt;我在 &lt;a href="http://ysl-paradise.blogspot.com/2009/01/android-market.html"&gt;Android Market 應用程式增加率減緩中？&lt;/a&gt; 這篇中，介紹過 Android Market 從開市，到 2009 年 1 月初，上面應用軟體數的現況。這篇要繼續這個主題，讓我們來持續觀察到 2009 年 2 月底，付費軟體機制出來後，應用軟體數是否有突破性的成長，以及每個類別應用軟體數的現況。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;前頭第一張圖說明從 2008 年底到現在，Market 上的總軟體數，應用軟體數以及遊戲軟體數的成長情形。現在 Market 上的總軟體數來到 1600+ ，這其中付費軟體只用一個多禮拜的時間，就從 0 增加到 380+。看來付費軟體機制的推出，果然對軟體數有不少的加持作用。不過和 Apple AppStore 同期的總軟體數相比，還是有一大段的落差。&lt;/p&gt;

&lt;p&gt;這次，我再加上開發者數的曲線。看來，開發者還是前仆後繼地擁向 Android 的懷抱中，絲毫沒有飽和或淺緩的趨勢。&lt;/p&gt;
&lt;p&gt;不過有個有趣的數字，我沒顯示在這張圖上。你知道 aTrackDog 追蹤到的總軟體數有多少嗎？告訴你，有 3100+ 。這數目將近是 Market 上面軟體數的兩倍，這表示，還有將近一半的軟體，潛在水底下，尚未露出面來。&lt;/p&gt;

&lt;p&gt;底下這張圖，則是各個類別的免費及付費軟體數。在免費軟體上，Tool 類別的競爭還是最激烈的。在付費軟體上，主要是以 Entertainment, Tools 以及遊戲軟體為大宗。&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/Saag8INs5iI/AAAAAAAAAFE/uuek4PziFNQ/market_cat.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;底下這張圖，則是各個類別的『付費軟體/免費軟體』比，遊戲軟體明顯的是贏家。遊戲開發者，對於開發免費遊戲，果然是興趣缺缺。看來，要玩到好玩的免費遊戲軟體，是越來越難了。&lt;/p&gt;
&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SaeUa52j5TI/AAAAAAAAAFU/CzYsZd2nRtY/market_paid_free.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;看了這些統計數據，你有什麼心得要和我一起分享的呢？&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2949547925622048884?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2949547925622048884/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/android-market-2.html#comment-form' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2949547925622048884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2949547925622048884'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/03/android-market-2.html' title='Android Market 應用程式現況 (2 月、付費軟體)'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/Saag8fq0Y8I/AAAAAAAAAFM/dHoKYW0rENc/s72-c/market_app.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-745983200246210258</id><published>2009-02-26T09:00:00.006+08:00</published><updated>2009-08-05T07:58:59.001+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speech'/><title type='text'>參加台灣 Android 第一次聚會</title><content type='html'>&lt;p&gt;The first Taiwan Android users group activity @ Taipei&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://4.bp.blogspot.com/_a5fZt60mXGw/SaXekjLWOTI/AAAAAAAAAE0/PULPkgM-qeE/android1.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;2009/2/24 星期二晚上，Jimmy 在 &lt;a href="http://www.cool3c.com/"&gt;癮科科&lt;/a&gt; 辦了第一次的台灣 Android 聚會，當天來了不少人，也看到 Android 真正在 Eee PC 及 MID 上執行的樣子。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SaXek53W8kI/AAAAAAAAAE8/dMFApBaH0H8/android2.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;雖然和 Gaslin 合作寫 &lt;a href="http://aTrackDog.a0soft.com"&gt;aTrackDog&lt;/a&gt; 已經兩個多月，不過一直沒有機會見到面。當天也是第一次見到 Gasolin。&lt;/p&gt;

&lt;p&gt;這陣子，正在和 Jason 合作寫 aNetShare (將你的 Android phone 變身成 WiFi 無線基地台)，當天 Jason 也來了。&lt;/p&gt;

&lt;p&gt;Jimmy 的熱心籌劃活動也讓人感動，他很有經驗，將這次活動辦的很熱鬧，也很成功。想看到更多詳細的活動內容，請看 &lt;a href="http://android.cool3c.com/article/4225"&gt;http://android.cool3c.com/article/4225&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ps: 圖片皆引自上述網址&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-745983200246210258?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/745983200246210258/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/02/android.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/745983200246210258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/745983200246210258'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/02/android.html' title='參加台灣 Android 第一次聚會'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a5fZt60mXGw/SaXekjLWOTI/AAAAAAAAAE0/PULPkgM-qeE/s72-c/android1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-898774032867692468</id><published>2009-02-16T09:00:00.006+08:00</published><updated>2009-08-05T07:58:59.002+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thread'/><category scheme='http://www.blogger.com/atom/ns#' term='FileObserver'/><title type='text'>誰有用過 FileObserver ？</title><content type='html'>&lt;p&gt;Use the FileObserver class to monitor the file/directory changes&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SZUr5ftIUWI/AAAAAAAAAEs/euqKBw4hpwY/Observer-observed.gif" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;為了要監視某個檔案是否有被更改，原先寫了個 Thread 去定期檢查檔案的修改時間。不過用 Thread 的問題就是，這 polling 的時間該抓多少才好？久久才查一次，運氣不好的話，檔案被改後，你得等到下次 polling 的時間，才知道。如果將 polling 的時間縮短，常常去檢查，又怕影響整個系統效能。&lt;/p&gt;

&lt;p&gt;前幾天查了一下，發現有個 android.os.FileObserver 這個類別。不過這 SDK 都已經出到 1.1r1 了，這個類別的文件還真是簡單到沒有任何的說明，我只能從 API 的名字上去猜他的用法。好在他的 API 沒幾個，大多一看名字，就可猜到他是用來做什麼的。&lt;/p&gt;

&lt;p&gt;底下是這個類別的所有 APIs：&lt;/p&gt;
&lt;span class="fullpost"&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
// Public Constructors
public FileObserver(String path);
public FileObserver(String path, int mask);

// Public Methods
public abstract void onEvent(int event, String path);
public void startWatching();
public void stopWatching();
&lt;/textarea&gt;

&lt;p&gt;看樣子，你可以用這個類別去監視某個目錄或是某個檔案，是否有被存取。&lt;/p&gt;

&lt;p&gt;實踐是檢驗真理的唯一標準。因此，我寫了個簡單的程式，來觀察 FileObserver 的行為：&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
public void 
onCreate(Bundle savedInstanceState)
{
  ...
  m_myDirObsv.startWatching();
  m_myFileObsv.startWatching();
}
    
public void
onDestroy()
{
  m_myDirObsv.stopWatching();
  m_myFileObsv.stopWatching();
  super.onDestroy();
}

private MyDirObserver m_myDirObsv = new MyDirObserver();
private MyFileObserver m_myFileObsv = new MyFileObserver();

class MyDirObserver extends FileObserver
{
  public
  MyDirObserver()
  {
    super("/sdcard/sam/", ALL_EVENTS);
  }
    
  public void
  onEvent(int event, String path)
  {
    _Dump("dir", event, path);
  }
}

class MyFileObserver extends FileObserver
{
  public
  MyFileObserver()
  {
    super("/sdcard/sam/test.txt", ALL_EVENTS);
  }
    
  public void
  onEvent(int event, String path)
  {
    _Dump("file", event, path);
  }
}

private void
_Dump(String tag, int event, String path)
{
  Log.d(tag, "=== dump begin ===");
  Log.d(tag, "path=" + path);
  Log.d(tag, "event list:");
  if ((event &amp; FileObserver.OPEN) != 0) 
    Log.d(tag, "  OPEN");
  if ((event &amp; FileObserver.CLOSE_NOWRITE) != 0) 
    Log.d(tag, "  CLOSE_NOWRITE");
  if ((event &amp; FileObserver.CLOSE_WRITE) != 0) 
    Log.d(tag, "  CLOSE_WRITE");
  if ((event &amp; FileObserver.CREATE) != 0) 
    Log.d(tag, "  CREATE");
  if ((event &amp; FileObserver.DELETE) != 0) 
    Log.d(tag, "  DELETE");
  if ((event &amp; FileObserver.DELETE_SELF) != 0) 
    Log.d(tag, "  DELETE_SELF");
  if ((event &amp; FileObserver.ACCESS) != 0) 
    Log.d(tag, "  ACCESS");
  if ((event &amp; FileObserver.MODIFY) != 0) 
    Log.d(tag, "  MODIFY");
  if ((event &amp; FileObserver.MOVED_FROM) != 0) 
    Log.d(tag, "  MOVED_FROM");
  if ((event &amp; FileObserver.MOVED_TO) != 0) 
    Log.d(tag, "  MOVED_TO");
  if ((event &amp; FileObserver.MOVE_SELF) != 0) 
    Log.d(tag, "  MOVE_SELF");
  if ((event &amp; FileObserver.ATTRIB) != 0) 
    Log.d(tag, "  ATTRIB");
  Log.d(tag, "=== dump end ===");
}
&lt;/textarea&gt;

&lt;p&gt;然後，用 adb shell 打幾個指令觀察結果：&lt;/p&gt;
&lt;table width=100% border=0 &gt;&lt;tr&gt;&lt;td style="background-color:#000000;color:#00FF00"&gt;
&lt;div style="color:#FF0000"&gt;
# pwd&lt;br&gt;
pwd&lt;br&gt;
/sdcard/sam&lt;br&gt;
# mv ../a.txt .&lt;br&gt;
mv ../a.txt .
&lt;/div&gt;
&lt;br&gt;
dir: === dump begin ===&lt;br&gt;
dir: path=a.txt&lt;br&gt;
dir: event list:&lt;br&gt;       
dir: &amp;nbsp;&amp;nbsp;MOVED_TO&lt;br&gt;        
dir: === dump end ===&lt;br&gt;  
&lt;br&gt;
&lt;br&gt;
&lt;div style="color:#FF0000"&gt;
# echo 123 &gt; test.txt&lt;br&gt;
echo 123 &gt; test.txt  
&lt;/div&gt;
&lt;br&gt;
file: === dump begin ===&lt;br&gt;
file: path=null&lt;br&gt;         
file: event list:&lt;br&gt;       
file: &amp;nbsp;&amp;nbsp;MODIFY&lt;br&gt;          
file: === dump end ===&lt;br&gt;  
dir: === dump begin ===&lt;br&gt; 
dir: path=test.txt&lt;br&gt;      
dir: event list:&lt;br&gt;        
dir: &amp;nbsp;&amp;nbsp;MODIFY&lt;br&gt;           
dir: === dump end ===&lt;br&gt;   
dir: === dump begin ===&lt;br&gt; 
dir: path=test.txt&lt;br&gt;      
dir: event list:&lt;br&gt;        
dir: &amp;nbsp;&amp;nbsp;OPEN&lt;br&gt;             
dir: === dump end ===&lt;br&gt;   
file: === dump begin ===&lt;br&gt;
file: path=null&lt;br&gt;         
file: event list:&lt;br&gt;       
file: &amp;nbsp;&amp;nbsp;OPEN&lt;br&gt;            
file: === dump end ===&lt;br&gt;  
dir: === dump begin ===&lt;br&gt; 
dir: path=test.txt&lt;br&gt;      
dir: event list:&lt;br&gt;        
dir: &amp;nbsp;&amp;nbsp;MODIFY&lt;br&gt;           
dir: === dump end ===&lt;br&gt;   
file: === dump begin ===&lt;br&gt;
file: path=null&lt;br&gt;         
file: event list:&lt;br&gt;       
file: &amp;nbsp;&amp;nbsp;MODIFY&lt;br&gt;          
file: === dump end ===&lt;br&gt;  
dir: === dump begin ===&lt;br&gt; 
dir: path=test.txt&lt;br&gt;      
dir: event list:&lt;br&gt;        
dir: &amp;nbsp;&amp;nbsp;CLOSE_WRITE&lt;br&gt;      
dir: === dump end ===&lt;br&gt;   
file: === dump begin ===&lt;br&gt;
file: path=null&lt;br&gt;         
file: event list:&lt;br&gt;       
file: &amp;nbsp;&amp;nbsp;CLOSE_WRITE&lt;br&gt;     
file: === dump end ===&lt;br&gt;  
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;反應還蠻即時的，你也可以自己打個其他的指令，試著觀察他的結果，看看是否和你認知的相同。&lt;/p&gt;

&lt;p&gt;還沒有仔細 trace 他的原始碼。先問問看，有誰知道 FileObserver 是如何實現這部分的功能？啟動 startWatching()，對系統效能的影響大嗎？&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-898774032867692468?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/898774032867692468/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/02/fileobserver.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/898774032867692468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/898774032867692468'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/02/fileobserver.html' title='誰有用過 FileObserver ？'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SZUr5ftIUWI/AAAAAAAAAEs/euqKBw4hpwY/s72-c/Observer-observed.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4951365480335358809</id><published>2009-02-02T09:00:00.079+08:00</published><updated>2010-11-27T10:30:43.903+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>Android 應用程式開發課程 @ 台灣</title><content type='html'>&lt;p&gt;Android phone development training courses&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/a.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;從 2009 年以來，陸陸續續都接到一些電話或信，要我開 Android 相關的課程。老實說，對於 Android 的了解，我不敢說是專家，樣樣都懂的很專精。不過，過去這段時間，還是累積了些開發 Android 程式的實際經驗，再加上我個人過去將近二十年，各式程式開發與管理經歷當底，應該有些東西可以拿出來和大家分享。&lt;/p&gt;

&lt;p&gt;因此，還是決定在 2009 年花點時間準備教材，和有興趣進入 Android 領域的同好們，一起分享我個人過去的學習經驗，與自己在開發 Android 手機程式時如何解決種種問題的的心得。並期待能帶領上課的學員一步一步地，一窺 Android 程式設計的奧妙，並培養學員有獨立完成 Android 應用程式之能力。&lt;/p&gt;

&lt;p&gt;關於我開的 Android 課程，不管是內容或是其他方面，要提意見的，也都歡迎在這篇文章上留言。&lt;/p&gt;

&lt;p&gt;不過，有句話說的好，『師父領進門，修行在個人』。千萬不要期望說，上個課就什麼都會了。天下沒有白吃的午餐，有些東西還是要自己親身走一遭，才會明白與了解。我想上課最大的好處是，透過有系統與組織的解說，降低你學習的門檻與加快進入的速度。我個人估計是 14 個小時的入門課程，大概可以幫你減少約 0.5~1 個月的自我摸索時間。剩下的，還是要靠自我的練習。&lt;/p&gt;


&lt;p&gt;首先要開的是 Android 應用程式開發的入門課程，這是專門為了從未接觸過 Android 應用程式開發的程式開發人員，所設計的課程。不過你還是得具備 Java 語言的基礎，或是會 C++ 或是 C# 等其他物件導向語言。要不然，上實作課時，你只能坐在一邊，乾瞪眼了。&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;這個入門課程，總時數是 14 個小時，其中實作的部份約 4 個小時，課程的內容大綱如下：
 &lt;ol&gt;
 &lt;li&gt;熟悉 Android 開發環境，Android 模擬器，及如何快速建立程式&lt;/li&gt;
 &lt;li&gt;Android 平台簡介，架構介紹，特色與提供之功能&lt;/li&gt;
 &lt;li&gt;深入瞭解 Android 程式之基本框架，與如何有效率地偵錯程式&lt;/li&gt;
 &lt;li&gt;各式使用者介面元件之基礎設計&lt;/li&gt;
 &lt;li&gt;各式使用者介面元件之進階設計&lt;/li&gt;
 &lt;li&gt;自定使用者介面元件與繪圖功能介紹，與如何支持多國語言&lt;/li&gt;
 &lt;li&gt;深入剖析 Application, Activity &amp; Service&lt;/li&gt;
 &lt;li&gt;資料儲存與綜合實作&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/p&gt;
&lt;/blockquote&gt;

&lt;a name="adv"&gt;&lt;/a&gt;
&lt;p&gt;除了入門課程外，我還規畫了一些進階課程。首先，要開的進階課程是『Android 網際網路與地圖應用開發』。這是 7 個小時一天上完的課。要上這個課的，你一定要先具備基礎的 Android 應用開發能力與經驗。&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;這個課程主要介紹 Android 平台之網路應用基礎知識與架構，並教你如何在 Android 平台上，開發網路應用程式。課程中，我也會傳授 Android 內建之網頁元件的進階使用技巧；如何透過 GPS 抓取地理座標，與結合地圖元件之應用應如何有效開發的秘訣。課程的內容大綱如下：
 &lt;ol&gt;
 &lt;li&gt;瞭解Android 平台之網路應用基礎知識與架構&lt;/li&gt;
 &lt;li&gt;熟悉 Android HTTP-based 網路應用程式開發&lt;/li&gt;
 &lt;li&gt;網頁元件 (WebView) 之進階開發技巧&lt;/li&gt;
 &lt;li&gt;抓取地理座標&lt;/li&gt;
 &lt;li&gt;結合地圖元件 (MapView) 之 LBS 應用開發&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;底下是計畫開的課程：&lt;/p&gt;
&lt;p&gt;
&lt;table width=100% border=1 style="background-color:#ffffff;color:#000"&gt;

&lt;tr style="background-color:#ff9900;color:#000"&gt;&lt;td&gt;日期&lt;/td&gt;&lt;td&gt;地點&lt;/td&gt;&lt;td&gt;課程名稱&lt;/td&gt;&lt;td&gt;難易度&lt;/td&gt;&lt;/tr&gt;

&lt;!--
&lt;tr style="font-weight:bold"&gt;&lt;td&gt;3/12,19,26 星期五&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=99W018" style="font-weight:bold"&gt;Android應用完整基礎訓練&lt;/a&gt;&lt;br&gt;自強工業科學基金會&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="font-weight:bold"&gt;&lt;td&gt;4/9,16,23 星期五&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=99W021" style="font-weight:bold"&gt;Android 基礎與雲端運算應用開發&lt;/a&gt;&lt;br&gt;自強工業科學基金會&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;
--&gt;
&lt;tr style="color:#808080"&gt;&lt;td&gt;11/17,18 星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23100500&amp;msgno=305825" style="color:#808080"&gt;Android手機平台及應用開發實務系列&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;進階&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;10/20,21 星期三四&lt;/td&gt;&lt;td&gt;高雄&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23100499&amp;msgno=305824" style="color:#808080"&gt;Android手機平台及應用開發實務系列&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;基礎&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;10/13,14 星期三四&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23100547&amp;msgno=305897" style="color:#808080"&gt;Android手機平台及應用開發實務系列&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;進階&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;9/15,16 星期三四&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23100545&amp;msgno=305896" style="color:#808080"&gt;Android手機平台及應用開發實務系列&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;基礎&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;8/4,5 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23100451&amp;msgno=305759" style="color:#808080"&gt;Android手機平台及應用開發實務系列&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;進階&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;7/7,8 星期三四&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23100450&amp;msgno=305757" style="color:#808080"&gt;Android手機平台及應用開發實務系列&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;基礎&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;1/16,17 星期六日&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.camangimarket.com/classinfo/" style="color:#808080"&gt;Android嵌入式應用開發&lt;/a&gt;&lt;br&gt;博祥網通&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;12/16,23 星期三&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://android.cool3c.com/article/14242" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;癮科技&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;12/6 星期日&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://android.cool3c.com/article/13851" style="color:#808080"&gt;Android Internet與LBS應用開發&lt;/a&gt;&lt;br&gt;癮科技&lt;/td&gt;&lt;td&gt;&lt;span style="color:#808080"&gt;進階&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;11/7,14 星期六&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23091202&amp;msgno=304919" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;10/14 星期三&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;Android 網路與地圖應用開發&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;&lt;span style="color:#808080"&gt;進階&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;8/22,29 星期六&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23090998&amp;msgno=304658" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;7/18,25 星期六&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23090894&amp;msgno=304527" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;6/17,24 星期三&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23090857&amp;msgno=304476" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;6/14,21 星期日&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=98W057&amp;tcfst=yes" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;自強工業科學基金會&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;5/23,24 星期六日&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://android.cool3c.com/article/7759" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;癮科技&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;5/19,26 星期二&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://college.itri.org.tw/SeminarView1.aspx?no=23090727&amp;msgno=304324" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;工研院&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;4/25,26 星期六日&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://android.cool3c.com/article/7132" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;癮科技&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;3/5,12 星期四&lt;/td&gt;&lt;td&gt;新竹&lt;/td&gt;&lt;td&gt;&lt;a href="http://edu.tcfst.org.tw/query_coursedetail.asp?courseidori=98S086&amp;tcfst=yes" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;自強工業科學基金會&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;tr style="color:#808080"&gt;&lt;td&gt;2/28, 3/1 星期六日&lt;/td&gt;&lt;td&gt;台北&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.fitpi.com.tw/products/emb_sys/OF110C.htm" style="color:#808080"&gt;Android手機應用程式開發&lt;/a&gt;&lt;br&gt;傳識資訊&lt;/td&gt;&lt;td&gt;入門&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4951365480335358809?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4951365480335358809/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/02/2009-android.html#comment-form' title='29 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4951365480335358809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4951365480335358809'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/02/2009-android.html' title='Android 應用程式開發課程 @ 台灣'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SYanL-Jh2pI/AAAAAAAAAEk/_mBKQiVfTYM/s72-c/a.jpg' height='72' width='72'/><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-4720315983562859879</id><published>2009-01-19T09:00:00.003+08:00</published><updated>2009-08-05T07:58:59.004+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thread'/><category scheme='http://www.blogger.com/atom/ns#' term='Service'/><title type='text'>請將要執行很久的程式碼，放在 Service 中執行</title><content type='html'>&lt;p&gt;Run your time-consuming jobs in Service&lt;/p&gt;

&lt;p align=center&gt;&lt;img src="http://1.bp.blogspot.com/_a5fZt60mXGw/SXE7Jm5_MsI/AAAAAAAAAEc/TOnAl5D7iFM/device.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;在你研讀 Android 文件時，應該會注意到，千萬不能將要執行很久的程式碼放在 Main ( or UI) Thread 中執行，要不然一定會發生 ANR (Android is Not Responding) 錯誤。要避免 ANR 錯誤，對於所有可能會執行超過 5 秒的工作，例如網路或資料庫的存取、音樂的播放等等，你都要自行建立一個新的 Thread 物件，並將該費時的工作放在 Thread.run() 中執行。&lt;/p&gt;

&lt;p&gt;&lt;font color=#FF8000&gt;&lt;b&gt;其實，光將費時的程式碼放在 Thread.run() 中執行，還是不夠的，他只解決一半的問題。&lt;/b&gt;&lt;/font&gt;如果你不知道我為什麼會這麼說的，請先讀一下 &lt;a href="http://ysl-paradise.blogspot.com/2008/12/blog-post.html"&gt;記得要在程式中，處理鍵盤開啟或關閉的動作&lt;/a&gt; 這篇。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;讀完後，你知道原因了嗎？當使用者打開或關閉鍵盤時，使用者看到的只是螢幕畫面的旋轉。但是，從程式面來看，Activity 已經經歷了一次生死輪迴。Activity 先被殺掉，再重新建立一個新的。那就代表，這個新建立的 Activity，再也不能和原先還正在執行工作的 Thread ，相互溝通，傳遞資料。&lt;/p&gt;

&lt;p&gt;用個例子來說明，你可能會更清楚些。例如，你的程式正在執行一個下載檔案的工作。為了讓使用者清楚，目前的下載的進度。你應該會用個 Progress Dialog，顯示目前已經下載的百分比。如果就在此時，使用者打開鍵盤，你猜會發生什麼事？我想你程式上，原來那個顯示下載進度的 Progress Dialog，應該會不見了。負責下載的 Thread，可能還正在執行中（如果你沒在 onStop() 或 onDestroy() 中，停止 Thread 的執行）。可是，從你的 UI 的呈現，使用者會認為剛剛的那個下載的工作，已經被停下來。&lt;/p&gt;

&lt;p&gt;要怎麼解決這個問題？&lt;font color=#FF8000&gt;&lt;b&gt;我會建議你，不僅要將費時的工作放在 Thread.run() 中執行，還要將這個 Thread 放在 Service 中執行。&lt;/b&gt;&lt;/font&gt;因為，當螢幕要旋轉時，系統只會殺掉 Activity Stack 中，最上面的那一個 Activity，並不會對扮演執行 background task 的 Service 採取任何的動作。Service 和 Thread 還是可以安穩地繼續執行下載的工作，而被系統重起的 Activity，也可以透過 Service 提供的 remote interface，與 Service 進行 IPC (interprocess communication)，以獲取目前下載的進度與執行情形。&lt;/p&gt;

&lt;p&gt;想更進一步瞭解實作的你，我建議你先研讀 Android 中 Music 這個程式的原始碼。另外想要知道如何與 Service 進行 IPC 的你，請閱讀 Android 文件中的 &amp;lt;sdk_path&amp;gt/docs/reference/aidl.html 文件，我覺得這篇寫得還算清楚詳細，值得一讀。&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-4720315983562859879?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/4720315983562859879/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/01/service.html#comment-form' title='10 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4720315983562859879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/4720315983562859879'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/01/service.html' title='請將要執行很久的程式碼，放在 Service 中執行'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5fZt60mXGw/SXE7Jm5_MsI/AAAAAAAAAEc/TOnAl5D7iFM/s72-c/device.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-2932455317683264629</id><published>2009-01-05T09:00:00.002+08:00</published><updated>2009-08-05T07:58:59.004+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Market'/><title type='text'>Android Market 應用程式增加率減緩中？</title><content type='html'>&lt;p&gt;The number of Android Market applications are not growing anymore!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SWBZaXYuIOI/AAAAAAAAAEM/NzjfrHnlE18/10_25_01_04_apps.png" /&gt;&lt;/p&gt;

&lt;p&gt;我曾在 &lt;a href="http://ysl-paradise.blogspot.com/2008/11/2008-twjug-1122-android-introduction.html"&gt;2008 TWJUG 11/22 活動實錄 (The Android Introduction)&lt;/a&gt; 中，介紹過 Palm, Symbian, Apple App Store 以及 Android Market 等各手持設備，其目前應用軟體的數目及現況。&lt;/p&gt;

&lt;p&gt;其中，在 2008/10 月底前，也就是在 Android Market 正式對應用程式發展者公開後的三天， Market 上面的軟體數目，從一開始的 71 個，三天內增加了 106 個新的軟體，總數來到 176。依照保守的線性成長來算，在兩個月後的今天，應該要有 1976 ，將近 2000 個軟體才對。對照一下 App Store 的軟體數，開張之後的兩個月，總軟體數約有 2239 個。因此，我剛估算的 2000 個，一點也不超過。不過，你知道現在 Android Market 上有多少個軟體嗎？&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;這兩天，花了點時間算了一下，到 1/4/2009 為止，屬於 Applications 的軟體有 574 個，屬於 Games 類別的遊戲軟體有 122 個。也就是說，總數只有區區 696 個。&lt;/p&gt;

&lt;p&gt;前頭第一張圖說明了從 Android Market 開市，到 1/4/2009 為止，Applications, Games 及總軟體數的成長曲線。&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;font color=blue&gt;兩個月的時間，Android Market 上的軟體數，竟然只有 696 個，連預估的一半值，都不到。不但沒有呈現新市場，該有的爆炸性成長，連基本的線性成長線，都失守了。&lt;/font&gt;&lt;/b&gt;怎麼會這樣？&lt;/p&gt;

&lt;p&gt;千萬不要先將罪過，推給整個大環境的不景氣，這是 Marketing 及 Sales 們，在這段時間，對其績效不佳的最好藉口，但對 "Diffusing of Innovations" 一書中定義的 Early Adapters Market 來說，不景氣，在這裡可是沒太大影響的。&lt;b&gt;&lt;font color=blue&gt;我覺得最主要的原因，就是 Market 上的付費機制還沒出現。&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;目前，只有免費軟體才能上架，對使用者而言，是有短期的利益。但就應用程式發展者來看，一旦無法在 Market 上，透過銷售軟體，獲取應有的報酬，也就沒辦法吸引他們，發行更多好用的軟體。就長遠來看，對終端使用者而言，手上就只能玩著一堆小用的免費軟體，也不見得是好事。&lt;/p&gt;

&lt;p&gt;雖然在 Early Q1（連月份都不敢寫，到底在幹什麼？），就會先在北美及英國地區，開始銷售付費軟體。不過，到 Q1/E 時，連亞洲地區都還沒有，這動作未免也太慢了嘛！年底時，Eric Chu 寄出來的那封信，重點都沒寫到。到時的 software licensing model 會是如何？是否有支援 subscription 付費方式？是否有任何的軟體保護機制？消費者是付錢給 Google Checkout 還是 mobile operators？這些發展者關心的事，難道不能先和大家溝通清楚嗎？&lt;/p&gt;

&lt;p&gt;寫到這，真的是一肚子火。好了，言歸正傳。你知道目前，哪一類上面的軟體數最多，競爭最激烈嗎？理論上，應該是遊戲類，不過也是拜免費軟體之賜，遊戲公司根本就不願意，將手上賣錢的好玩遊戲，免費給你用。&lt;/p&gt;

&lt;p&gt;目前，最競爭的是 Tools 類別，有 163 個軟體。第二名是 Entertainment，第三名才是遊戲中的 Brain &amp; Puzzle。底下是個各類別的軟體數統計圖。如果你的應用軟體可以歸屬到 A 類別，也可以歸屬到 B 類別時，這個圖可以幫你決定，應該放到那個類別上，才可以獲取比較高的排名及下載數。&lt;/p&gt;

&lt;img src="http://2.bp.blogspot.com/_a5fZt60mXGw/SWBZaaKOdAI/AAAAAAAAAEU/nNdQmNqhi5U/01_04_cat.png" /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3402539703993479534-2932455317683264629?l=ysl-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ysl-paradise.blogspot.com/feeds/2932455317683264629/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ysl-paradise.blogspot.com/2009/01/android-market.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2932455317683264629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3402539703993479534/posts/default/2932455317683264629'/><link rel='alternate' type='text/html' href='http://ysl-paradise.blogspot.com/2009/01/android-market.html' title='Android Market 應用程式增加率減緩中？'/><author><name>samlu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a5fZt60mXGw/SWBZaXYuIOI/AAAAAAAAAEM/NzjfrHnlE18/s72-c/10_25_01_04_apps.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3402539703993479534.post-5995189563681378923</id><published>2008-12-29T09:00:00.013+08:00</published><updated>2010-10-25T10:19:50.094+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Activity'/><category scheme='http://www.blogger.com/atom/ns#' term='Uri'/><category scheme='http://www.blogger.com/atom/ns#' term='Intent'/><title type='text'>Intent 用法大公開</title><content type='html'>&lt;p&gt;How to use Intent to send an email, SMS, open a web browser, show map, etc.?&lt;/p&gt;

&lt;p&gt;Intent 應該算是 Andorid 中特有的東西。你可以在 Intent 中，指定要應用程式執行的動作 (view, edit, dial)，以及應用程式執行該動作時，所需要的資料。都指定好後，只要透過 startActivity()，Android 系統會自動尋找，最符合你指定要求的應用程式，並喚起執行該應用程式。&lt;/p&gt;

&lt;p&gt;不過，這部份的文件還不是很完整。&lt;a href="http://code.google.com/android/reference/available-intents.html"&gt;Reference of Available Intents&lt;/a&gt; 有列一些。底下是我收集的一些用法，分享出來給有需要的你。有些還沒有實際驗證過，如果發現有錯誤，或有新的用法，也請告訴我。&lt;/p&gt;

&lt;span class="fullpost"&gt;
&lt;p&gt;&lt;b&gt;顯示網頁&lt;/b&gt;&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Uri uri = Uri.parse("http://google.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
&lt;/textarea&gt;

&lt;p&gt;&lt;b&gt;顯示地圖&lt;/b&gt;&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(it); 
//其他 geo URI 範例
//geo:latitude,longitude
//geo:latitude,longitude?z=zoom
//geo:0,0?q=my+street+address
//geo:0,0?q=business+near+city
//google.streetview:cbll=lat,lng&amp;cbp=1,yaw,,pitch,zoom&amp;mz=mapZoom
&lt;/textarea&gt;

&lt;p&gt;&lt;b&gt;路徑規劃&lt;/b&gt;&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&amp;saddr=startLat%20startLng&amp;daddr=endLat%20endLng&amp;hl=en");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456 
&lt;/textarea&gt;

&lt;p&gt;&lt;b&gt;撥打電話&lt;/b&gt;&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//叫出撥號程式
Uri uri = Uri.parse("tel:0800000123");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);
&lt;/textarea&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//直接打電話出去
Uri uri = Uri.parse("tel:0800000123");
Intent it = new Intent(Intent.ACTION_CALL, uri);
startActivity(it);
//用這個，要在 AndroidManifest.xml 中，加上
//&lt;uses-permission id="android.permission.CALL_PHONE" /&gt;
&lt;/textarea&gt;

&lt;p&gt;&lt;b&gt;傳送 SMS/MMS&lt;/b&gt;&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//叫起簡訊程式
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text"); 
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
&lt;/textarea&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//傳送簡訊
Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);
&lt;/textarea&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
//傳送 MMS
Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND); 
it.putExtra("sms_body", "some text"); 
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png"); 
startActivity(it);

//如果是 HTC Sense 手機，你要用
Intent sendIntent = new Intent("android.intent.action.SEND_MSG");  
sendIntent.putExtra("address", toText);  
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "subject"); 
sendIntent.putExtra("sms_body", textMessage);  
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url)); 
sendIntent.setType("image/jpeg");  
startActivity(sendIntent);

//底下這段更好，可在所有手機上用
//refer to http://stackoverflow.com/questions/2165516/sending-mms-into-different-android-devices
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mmsto:&lt;number&gt;"); 
intent.putExtra("address", &lt;number&gt;); 
intent.putExtra("subject", &lt;subject&gt;); 
startActivity(intent); 
&lt;/textarea&gt;

&lt;p&gt;&lt;b&gt;傳送 Email&lt;/b&gt;&lt;/p&gt;
&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);
&lt;/textarea&gt;

&lt;textarea name="code" class="java:nogutter:nocontrols"&gt;
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The
