<?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-2849841227607903652</id><updated>2011-11-22T18:03:31.557+08:00</updated><category term='Dev Guide'/><category term='PHP'/><category term='音樂影像'/><category term='jQuery'/><category term='Streaming'/><category term='電腦與網路'/><category term='AIR'/><category term='Design Pattern'/><category term='旅行'/><category term='Flex'/><category term='片段的回憶'/><category term='程式設計'/><category term='Java'/><category term='Android'/><category term='Flash Action Script'/><category term='PureMVC'/><category term='HTML5'/><title type='text'>程式搖滾</title><subtitle type='html'>生活 | 網路 | 程式 | 音樂 | 電玩 | 快樂與悲傷</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default?start-index=101&amp;max-results=100'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>236</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1971287723998185942</id><published>2011-11-22T18:03:00.001+08:00</published><updated>2011-11-22T18:03:31.579+08:00</updated><title type='text'>test</title><content type='html'>&lt;embed src='http://tw.dev.svbgm.streetvoice.com/static/player/SVPlayer.swf?srv=tw.dev.svbgm.streetvoice.com&amp;ph=bgm&amp;getv=config.json&amp;playerInstance=player&amp;webID=pixnet&amp;ownerID=ozzysun&amp;width=240&amp;height=456&amp;skinID=s01&amp;colorID=null&amp;defaultList=my&amp;defaultMyList=5&amp;playerTitle=Defalt&amp;expand=false&amp;loop=true&amp;autoPlay=false&amp;autoUpdateSkin=true&amp;random=false&amp;sIndex=0&amp;isEmbed=true' width='240' height='456' allowFullScreen='false' allowScriptAccess='always' scale='noscale' type='application/x-shockwave-flash'&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1971287723998185942?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1971287723998185942/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1971287723998185942' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1971287723998185942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1971287723998185942'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/11/test.html' title='test'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-19739224232017060</id><published>2011-09-20T17:54:00.003+08:00</published><updated>2011-09-20T17:55:06.315+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>龍山寺</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-STTEA43-zeY/Tna79J312MI/AAAAAAAAD30/XtwwfgSTDsA/s512/DSC_0134.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://lh4.googleusercontent.com/-STTEA43-zeY/Tna79J312MI/AAAAAAAAD30/XtwwfgSTDsA/s512/DSC_0134.jpg" width="144" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;今天讓妹妹的媽媽放個假&lt;br /&gt;爸爸要帶妹妹到處去走走&lt;br /&gt;&lt;br /&gt;爸爸:妹妹爸爸帶你出去玩&lt;br /&gt;妹妹:去哪裡&lt;br /&gt;爸爸:我們去龍山寺&lt;br /&gt;妹妹:什麼是龍山寺&lt;br /&gt;爸爸:就是拜拜的地方阿&lt;br /&gt;妹妹:好,出發&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-oxRsRW9J82U/Tna8tq4e48I/AAAAAAAAD44/Eei9aPt8_Po/s512/DSC_0153.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://lh3.googleusercontent.com/-oxRsRW9J82U/Tna8tq4e48I/AAAAAAAAD44/Eei9aPt8_Po/s512/DSC_0153.jpg" width="144" /&gt;&lt;/a&gt;&lt;/div&gt;坐上捷運 妹妹開始想要去玩車上的拉環&lt;br /&gt;妹妹:爸爸 我要吊單槓&lt;br /&gt;爸爸:不可以&lt;br /&gt;&lt;br /&gt;今天很乖 沒有吵鬧 只是一直望著頭上那拉不到的吊環&lt;br /&gt;&lt;br /&gt;坐到了中正紀念堂 換車到西門再到龍山寺&lt;br /&gt;妹妹一路上充滿著好奇&lt;br /&gt;出了捷運 看到7-11 門口的紐蛋機&lt;br /&gt;&lt;br /&gt;妹妹:爸爸 摳摳給我 我要Kitty的&lt;br /&gt;爸爸:我們先去買水 換摳摳再來&lt;br /&gt;&lt;br /&gt;買了瓶水 也投了個Kitty印章扭蛋 我們很開心的往前走&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-JCQU8DRli3s/Tna812rh9HI/AAAAAAAAD5E/9QgsXR4lr-A/s512/DSC_0157.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://lh3.googleusercontent.com/-JCQU8DRli3s/Tna812rh9HI/AAAAAAAAD5E/9QgsXR4lr-A/s512/DSC_0157.jpg" width="144" /&gt;&lt;/a&gt;&lt;/div&gt;龍山寺好多人 帶著妹妹 我們用手拜拜&lt;br /&gt;妹妹:爸爸 坐坐&lt;br /&gt;坐在龍山寺的階梯旁 妹妹迫不及待的從他的背包&lt;br /&gt;把扭蛋拿出來打開來玩&lt;br /&gt;看著 他聚精會神的玩著印章&lt;br /&gt;爸爸:妹妹 我們再去後面看看 好不好&lt;br /&gt;妹妹:好&lt;br /&gt;&lt;br /&gt;爸爸:妹妹我們今天去哪裡玩&lt;br /&gt;妹妹:是龍山寺567 爸爸 我要洗手&lt;br /&gt;帶著妹妹去廁所 他還是可以在水龍頭前 完了起來&lt;br /&gt;&lt;br /&gt;廟口水池裡 有好多魚&lt;br /&gt;妹妹就這樣在水池旁興奮的 看著&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-cohgqCRVUNM/Tna9JSRXg9I/AAAAAAAAD5g/it3RN_nf7f8/s512/DSC_0164.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="256" width="144" src="https://lh3.googleusercontent.com/-cohgqCRVUNM/Tna9JSRXg9I/AAAAAAAAD5g/it3RN_nf7f8/s512/DSC_0164.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;爸爸:妹妹 天快黑了 快下雨了 我們回家找媽媽好不好&lt;br /&gt;妹妹:好 爸爸背&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-19739224232017060?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/19739224232017060/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=19739224232017060' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/19739224232017060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/19739224232017060'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/09/blog-post.html' title='龍山寺'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-STTEA43-zeY/Tna79J312MI/AAAAAAAAD30/XtwwfgSTDsA/s72-c/DSC_0134.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-5600728970550005766</id><published>2011-08-31T10:46:00.001+08:00</published><updated>2011-08-31T10:48:03.094+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>使用變數new物件,未清除的結果</title><content type='html'>在Flash裡，當我們使用AS來產生一個新的物件&lt;br /&gt;通常都會用使用一個變數來把物件new出來,&lt;br /&gt;並在這物件上加入監聽事件&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var myBtn:Button=new Button()  &lt;br /&gt;myBtn.addEventListener(MouseEvent.CLICK,someThingToDo);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;這個已宣告的變數myBtn,已經指向了這個被產生出來的物件&lt;br /&gt;如果在之後的程式做了以下動作可能會發生的狀況如下&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;1.在未移除原先產生物件的狀況下，若再使用同樣變數再產生物件&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;myBtn=new Button()&lt;br /&gt;myBtn.addEventListener(MouseEvent.CLICK,doAnothingThing);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;則只是把變數指到新的物件,原先的物件並不會被清除掉&lt;br /&gt;畫面上會有多個物件同時並存&lt;br /&gt;若還有監聽事件，則當Click任一物件時都會同時觸發所有被監聽的事件&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;2.若將變數設定成null再重新產生物件&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;myBtn=null;  &lt;br /&gt;myBtnButton=new Button();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;畫面上還是會保有多個物件&lt;br /&gt;只是每個物件被click時只會觸發最後設定的那個listener&lt;br /&gt;而非多個listener被觸發 &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-5600728970550005766?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/5600728970550005766/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=5600728970550005766' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5600728970550005766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5600728970550005766'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/08/new.html' title='使用變數new物件,未清除的結果'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-5192818371351453568</id><published>2011-08-22T15:04:00.003+08:00</published><updated>2011-08-22T15:12:46.070+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>使用Chrome Debug Flash</title><content type='html'>一.在Chrome上安裝debug player&lt;br /&gt;1.安裝debugPlayer&lt;br /&gt;&lt;a href='http://www.adobe.com/support/flashplayer/downloads.html' target='_blank'&gt;http://www.adobe.com/support/flashplayer/downloads.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2.打開Chrome輸入 about:plugins&lt;br /&gt;找到flash 按停用，再按右上方詳細資料&lt;br /&gt;找到路徑非 Chrome的那個按啟用&lt;br /&gt;&lt;br /&gt;3.開啟網頁&lt;br /&gt;&lt;a href='http://kb2.adobe.com/cps/155/tn_15507.html' target='_blank'&gt;&lt;br /&gt;http://kb2.adobe.com/cps/155/tn_15507.html&lt;/a&gt;&lt;br /&gt;確認使用的player版本	&lt;br /&gt;&lt;br /&gt;二.下載Vizzy&lt;br /&gt;使用Vizzy可以不受browser限制，查看trace訊息	&lt;br /&gt;&lt;br /&gt;&lt;a href='http://code.google.com/p/flash-tracer/downloads/detail?name=Vizzy-win-3.8.zip&amp;can=2&amp;q=' target='_blank'&gt;下載&lt;/a&gt;	&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-5192818371351453568?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/5192818371351453568/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=5192818371351453568' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5192818371351453568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5192818371351453568'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/08/chrome-debug-flash.html' title='使用Chrome Debug Flash'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-206620842953839350</id><published>2011-07-19T16:04:00.002+08:00</published><updated>2011-07-19T16:04:14.299+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>在Android內實現Callback</title><content type='html'>寫JavaScript一定對CallBack的使用相當熟悉，但是當你要寫Java或Android&lt;br /&gt;卻發現沒辦法把function當作參數傳給另一個function當CallBack用&lt;br /&gt;因為在Java內並沒有function pointer，所以就有點麻煩&lt;br /&gt;這時候可以用類似Observer的方式來做&lt;br /&gt;簡單來說就是，既然無法丟一個function進去&lt;br /&gt;那你可以把要執行的function放到一個物件內&lt;br /&gt;把物件當參數丟進去就可以了&lt;br /&gt;&lt;br /&gt;作法&lt;br /&gt;&lt;font color='blue'&gt;一.建立公用的Observer Interface&lt;/font&gt;&lt;br /&gt;利用Interface將允許使用的method定義出來&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public interface IObserver{&lt;br /&gt;    public abstract void success(Object data);&lt;br /&gt;    public abstrcat void fail(String msg);&lt;br /&gt;    public abstract void exception(String msg)&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.建立要使用的observer Class&lt;/font&gt;&lt;br /&gt;把要做的工作在這這Class內實做出來&lt;br /&gt;當然你也可以把這Class建立主(main)程式內，&lt;br /&gt;這樣可以更方便&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class MyObserver implements IObserver{&lt;br /&gt;    @override&lt;br /&gt;    public abstract void success(Object data){&lt;br /&gt;        ...&lt;br /&gt;    };&lt;br /&gt;    @override&lt;br /&gt;    public abstrcat void fail(String msg){&lt;br /&gt;        ...&lt;br /&gt;    };&lt;br /&gt;    @override&lt;br /&gt;    public abstract void exception(String msg){&lt;br /&gt;        ...&lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.主程式應用&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class myApp{&lt;br /&gt;    ....&lt;br /&gt;    public void run(int status,IObserver observer){&lt;br /&gt;        .....&lt;br /&gt;        if(status==1){&lt;br /&gt;            observer.success(data)&lt;br /&gt;        }else if(status==2){&lt;br /&gt;            observer.fail()&lt;br /&gt;        }else{&lt;br /&gt;            observer.exception(&amp;quot;exception&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;    };&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-206620842953839350?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/206620842953839350/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=206620842953839350' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/206620842953839350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/206620842953839350'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/07/androidcallback.html' title='在Android內實現Callback'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-4798888099846562537</id><published>2011-07-18T15:51:00.000+08:00</published><updated>2011-07-18T15:51:43.306+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>網頁上swf z-index操作</title><content type='html'>當在網頁上，同時存在多個swf檔案，若需要指定某一個強制在最上層&lt;br /&gt;不受其他物件遮蔽，以下注意事項&lt;br /&gt;&lt;font color='blue'&gt;一.wmode的影響&lt;/font&gt;&lt;br /&gt;用來嵌入flash用的embed tag上的wmode值會決定swf在網頁上的顯示方式&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#30070;embed tag&amp;#27794;&amp;#26377;&amp;#35373;&amp;#23450;wmode&lt;br /&gt;  &amp;#38928;&amp;#35373;&amp;#20540;&amp;#28858;Window&lt;br /&gt;  &amp;#22914;&amp;#26524;&amp;#21435;&amp;#20597;&amp;#28204;wmode&amp;#20540;&lt;br /&gt;  &amp;#22312;FF&amp;#33287;Chrome&amp;#28204;&amp;#21040;$(&amp;quot;embed&amp;quot;).attr(&amp;quot;wmode&amp;quot;)&amp;#65309;false&lt;br /&gt;  &amp;#22312;IE&amp;#21063;&amp;#26371;&amp;#24471;&amp;#21040;$(&amp;quot;embed&amp;quot;).attr(&amp;quot;wmode&amp;quot;)='window'&lt;br /&gt;2.&amp;#35373;&amp;#23450;wmode='opaque'&lt;br /&gt;  &amp;#25165;&amp;#33021;&amp;#35731;swf&amp;#25152;&amp;#22312;&amp;#30340;div&amp;#21487;&amp;#20197;&amp;#20381;&amp;#29031;HTML&amp;#19978;&amp;#20570;z-index&amp;#25490;&amp;#21015;,&lt;br /&gt;  &amp;#38656;&amp;#35373;&amp;#23450;&lt;br /&gt;  embed tag attribute wmode='opaque'&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.動態改變wmode&lt;/font&gt;&lt;br /&gt;要讓所有的Browser都可以動態改變wmode屬性值&lt;br /&gt;若只是透過$("embed").attr("wmode","opaque")&lt;br /&gt;是不可行的,&lt;br /&gt;需要透過寫入整個innerHTML或outerHTML讓瀏覽器&lt;br /&gt;重新顯示swf才會得到正確的顯示狀態&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;$(&amp;quot;embed&amp;quot;).each(function(i) {               &lt;br /&gt;    embedTag = $(this).attr(&amp;quot;outerHTML&amp;quot;);        &lt;br /&gt;    if ((embedTag != null) &amp;amp;&amp;amp; (embedTag.length &amp;gt; 0)) {&lt;br /&gt;        if (!$(this).attr('wmode') 11 $(this).attr('wmode')==&amp;quot;Window&amp;quot;){&lt;br /&gt;            embedTag = embedTag.replace(&amp;quot;&amp;gt;&amp;quot;,&amp;quot; wmode='opaque'&amp;gt;&amp;quot;);&lt;br /&gt;            $(this).attr(&amp;quot;outerHTML&amp;quot;, embedTag);&lt;br /&gt;        }        &lt;br /&gt;    }       &lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.設定swf的顯示位置&lt;/font&gt;&lt;br /&gt;只需要改變swf所在div的z-index值，&lt;br /&gt;即可調整其上下位置&lt;br /&gt;$("#flashContainer").css("z-index",1000)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-4798888099846562537?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/4798888099846562537/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=4798888099846562537' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4798888099846562537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4798888099846562537'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/07/swf-z-index.html' title='網頁上swf z-index操作'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-6810359281625531813</id><published>2011-07-18T10:36:00.000+08:00</published><updated>2011-07-18T10:36:19.326+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>戀歌 - 義大醫院</title><content type='html'>&lt;iframe width="300" height="250" src="http://www.youtube.com/embed/Cmzi2MJgxW4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;這幾天剛搬好家，客廳比以前大上很多&lt;br /&gt;以後 應該待在客廳裡看電視的機會應該會多一些&lt;br /&gt;上網買了台 多媒體播放器，&lt;br /&gt;測試著透國無線網路播放電腦裡的影片檔&lt;br /&gt;一面陪著妹妹玩 一面讓電視播著最好的時光&lt;br /&gt;聽著電視傳來 文夏的戀歌&lt;br /&gt;又讓記憶突然又回到&lt;br /&gt;老爸在醫院的那段時間 &lt;br /&gt;&lt;br /&gt;老爸住在義大醫院的隔離病房&lt;br /&gt;與一般三人健保房比起來，空間大很多&lt;br /&gt;因為隔離，沒辦法離開房間，只能透過窗戶 看著外面&lt;br /&gt;對於習慣在山上到處走騎車跑步的他&lt;br /&gt;我知道他身體的痛 還有失去自由的那份難過&lt;br /&gt;&lt;br /&gt;老爸想聽歌&lt;br /&gt;大弟買了個小小的放音機&lt;br /&gt;放在床邊 反覆的播放著 這些 台語老歌&lt;br /&gt;在山上 老爸是坐在戶外的躺椅上&lt;br /&gt;看著遠方的風景&lt;br /&gt;這時候的他&lt;br /&gt;只是躺在病床上 看著天花板&lt;br /&gt;在音樂裡找到與過去生活連結的一部分&lt;br /&gt;這個小小的收音機&lt;br /&gt;就這樣跟著我爸 在醫院間來來回回&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-6810359281625531813?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/6810359281625531813/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=6810359281625531813' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6810359281625531813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6810359281625531813'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/07/blog-post.html' title='戀歌 - 義大醫院'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Cmzi2MJgxW4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-8289249796739711562</id><published>2011-07-13T13:28:00.005+08:00</published><updated>2011-07-14T09:49:51.724+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>自訂ListView Item</title><content type='html'>在ListView,要用自訂item樣式,&lt;br /&gt;通常在Android內,我們需要以ListView顯示資料列表&lt;br /&gt;列表內item的樣式可以直接使用android內建的item樣式&lt;br /&gt;例如R.android.layout.simple_list_item_1&lt;br /&gt;但如果希望使用自行設計的item樣式,可以透過自訂Adpater來做&lt;br /&gt;以下是設計流程&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;1.設計Item layout XML&lt;/font&gt;&lt;br /&gt;要顯示的itemㄝ,以一個layout xml檔案設計所要呈現的樣式&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt;      &amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;           android:layout_width="fill_parent"   &lt;br /&gt;           android:layout_height="wrap_content"  &lt;br /&gt;           android:orientation="horizontal"&amp;gt;  &lt;br /&gt;           &amp;lt;ImageView android:id="@+id/item_img"  &lt;br /&gt;                android:layout_width="60dp"   &lt;br /&gt;                android:layout_height="60dp"/&amp;gt;                 &lt;br /&gt;           &amp;lt;TextView   &lt;br /&gt;                android:layout_width="wrap_content" android:layout_height="wrap_content"            &lt;br /&gt;                android:id="@+id/item_title" /&amp;gt;  &lt;br /&gt;      &amp;lt;/LinearLayout&amp;gt;       &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='blue'&gt;2.自訂Adapter&lt;/font&gt;&lt;br /&gt;透過自行設計的Adapter將資料與item xml結合顯示&lt;br /&gt;1.extends BaseAdapter  &lt;br /&gt;2.在建構子內設定希望傳入的各項資料欄位&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public MyAdapter(Context context,String[] title,String[] img){&lt;br /&gt;  inflater = LayoutInflater.from(context);&lt;br /&gt;  item_title=title;&lt;br /&gt;  item_img=img;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='blue'&gt;3.在Adapter內改寫getView()&lt;/font&gt;&lt;br /&gt;透過getView取得的position當index&lt;br /&gt;再由建構子取得的資料array內得到各item所要顯示的資料&lt;br /&gt;將這item資料帶到view內&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@Override&lt;br /&gt;public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;   //--&amp;#23559;item xml&amp;#36681;&amp;#25104;view&amp;#29289;&amp;#20214;,&amp;#20006;&amp;#21462;&amp;#24471;item&amp;#20839;&amp;#21508;&amp;#38917;&amp;#20803;&amp;#20214;&amp;#30340;view &lt;br /&gt;   convertView = inflater.inflate(R.layout.list_item,null);&lt;br /&gt;   TextView title_view=(TextView)convertView.findViewById(R.id.item_title); &lt;br /&gt;   title_view.setText(item_title[position].toString());  &lt;br /&gt;&lt;br /&gt;   ImageView img_view=(ImageView)convertView.findViewById(R.id.item_img);&lt;br /&gt;   Drawable drawable = LoadImageFromWeb(item_img[position]);&lt;br /&gt;   img_view.setImageDrawable(drawable);  &lt;br /&gt;&lt;br /&gt;   return convertView;  &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='blue'&gt;4.顯示ListView&lt;/font&gt;&lt;br /&gt;要顯示ListVIew的Activity可以直接繼承ListActivity&lt;br /&gt;繼承自ListActivity即已包含了一個list view在裡面&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class PushActivity extends ListActivity {&lt;br /&gt;   @Override&lt;br /&gt;   public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);        &lt;br /&gt;      //---set List View---- &lt;br /&gt;      ListView lv=getListView();       &lt;br /&gt;      LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       &lt;br /&gt;      //--Add Data--------------------&lt;br /&gt;      String[] songData=getResources().getStringArray(R.array.songdata_holder);&lt;br /&gt;      String[] songImg=getResources().getStringArray(R.array.songimg_holder);&lt;br /&gt;      MyAdapter adapter = new MyAdapter(this,songData,songImg);        &lt;br /&gt;      setListAdapter(adapter);&lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-8289249796739711562?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/8289249796739711562/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=8289249796739711562' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8289249796739711562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8289249796739711562'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/07/listview-item.html' title='自訂ListView Item'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-6457276991978237046</id><published>2011-06-29T11:39:00.001+08:00</published><updated>2011-06-29T12:21:46.807+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>鍋貼</title><content type='html'>長時間沒有進食，老爸一直沒有什麼食慾&lt;br /&gt;偶爾他想到要吃什麼，我們就很開心的買來&lt;br /&gt;希望他可以吃多一些，讓身體有更足夠的營養與體力&lt;br /&gt;&lt;br /&gt;大弟每天下班 整理好 就會帶著晚餐來醫院&lt;br /&gt;跟我還有老爸一起吃飯&lt;br /&gt;每天的這個時候 一面陪老爸說說話&lt;br /&gt;我們兄弟也有時間談些家裡的大小事&lt;br /&gt;還有老爸現在的醫療狀況&lt;br /&gt;&lt;br /&gt;準備三餐這件事&lt;br /&gt;除了老媽來時，會在家煮好帶過來&lt;br /&gt;大多時候，我只是固定的在地下室餐廳買魚湯 買飯，&lt;br /&gt;&lt;br /&gt;大弟總會試著買各種不一樣的食物&lt;br /&gt;看看是不是有老爸會喜歡吃的東西&lt;br /&gt;&lt;br /&gt;有一段時間老爸喜歡吃大弟買來的鍋貼&lt;br /&gt;&lt;br /&gt;把用餐的餐板架在病床上&lt;br /&gt;鋪好報紙，給老爸準備好假牙 &lt;br /&gt;放幾個鍋貼在盤子上 再將魚湯倒在杯子裡&lt;br /&gt;然後 我們兄弟 才坐在旁邊的椅子上&lt;br /&gt;鋪上報紙 一起吃著鍋貼&lt;br /&gt;&lt;br /&gt;病房簾幕隔起來的小區塊&lt;br /&gt;我們兄弟陪著老爸 吃飯&lt;br /&gt;一直到快10點 要大弟回家休息&lt;br /&gt;明天還要上班&lt;br /&gt;&lt;br /&gt;陪著大弟走出去搭電梯&lt;br /&gt;陪他走到一樓&lt;br /&gt;&lt;br /&gt;2011 三月 于高雄長庚&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-6457276991978237046?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/6457276991978237046/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=6457276991978237046' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6457276991978237046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6457276991978237046'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/06/blog-post.html' title='鍋貼'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2013327585981018251</id><published>2011-06-08T12:01:00.003+08:00</published><updated>2011-06-08T12:10:12.945+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>HTML5 WebSocket Support</title><content type='html'>以下是各瀏覽器對HTML5 WebSocket的支援&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;TABLE border=0 rules=none cellSpacing=0 frame=void cols=3&gt;&lt;COLGROUP&gt;&lt;COL width=86&gt;&lt;COL width=136&gt;&lt;COL width=151&gt;&lt;/COLGROUP&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ffffcc height=18 width=86 align=left&gt;作業系統&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ffffcc width=136 align=left&gt;&lt;FONT face=Arial&gt;Browser&lt;/FONT&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ffffcc width=151 align=left&gt;&lt;FONT face=Arial&gt;WebSocket&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;Windows 7&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;Chrome11&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ff950e align=left&gt;&lt;FONT face=Arial&gt;true&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;&lt;BR&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;FireFox4.01&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;false&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;&lt;BR&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;IE9&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;false&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;&lt;BR&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;&lt;FONT face=Arial&gt;Safari 5.05&lt;/FONT&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ff950e align=left&gt;&lt;FONT face=Arial&gt;true&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;Ubuntu11&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;Chrome11&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ff950e align=left&gt;&lt;FONT face=Arial&gt;true&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;&lt;BR&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;FireFox4.01&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;false&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;IOS4.2&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;&lt;BR&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ff950e align=left&gt;&lt;FONT face=Arial&gt;true&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" height=17 align=left&gt;Android2.3&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" align=left&gt;&lt;BR&gt;&lt;/TD&gt;&lt;TD style="BORDER-BOTTOM: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid" bgColor=#ff950e align=left&gt;&lt;FONT face=Arial&gt;true&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2013327585981018251?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2013327585981018251/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2013327585981018251' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2013327585981018251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2013327585981018251'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/06/html5-websocket-support.html' title='HTML5 WebSocket Support'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1467600757855739924</id><published>2011-05-30T12:38:00.003+08:00</published><updated>2011-06-08T12:04:23.473+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Streaming'/><title type='text'>HTML 5 Audio Format Support</title><content type='html'>&lt;div&gt;以下是測試HTML5在不同作業系統與不同瀏覽器下，對於Audio格式支援比較表&lt;/div&gt;&lt;br /&gt;&lt;table border="0" cellspacing="0" cols="7" frame="VOID" rules="NONE"&gt;&lt;colgroup&gt;&lt;col width="82"&gt;&lt;/col&gt;&lt;col width="85"&gt;&lt;/col&gt;&lt;col width="84"&gt;&lt;/col&gt;&lt;col width="49"&gt;&lt;/col&gt;&lt;col width="49"&gt;&lt;/col&gt;&lt;col width="81"&gt;&lt;/col&gt;&lt;col width="43"&gt;&lt;/col&gt;&lt;/colgroup&gt;  &lt;tbody&gt;&lt;tr&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" height="34" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="82"&gt;&lt;br /&gt;作業系統&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="85"&gt;&lt;span style="font-family: Arial;"&gt;Browser&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="84"&gt;&lt;span style="font-family: Arial;"&gt;multi source&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="49"&gt;&lt;span style="font-family: Arial;"&gt;ogg&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="49"&gt;&lt;span style="font-family: Arial;"&gt;mp3&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="81"&gt;&lt;span style="font-family: Arial;"&gt;html5(m3u8)&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FFFFCC" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;" width="43"&gt;&lt;span style="font-family: Arial;"&gt;m3u8&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="36" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Windows 7&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Chrome 11.0&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="35" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Firefox 4.01&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="30" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;IE9.0&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="25" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Safari 5.05&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="29" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Ubuntu&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Chrome 11.0&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="28" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Firefox 4.01&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="28" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Mac 10.6.7&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Safari 5.04&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="36" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Android2.2&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" sdnum="1028;0;YY/M/D" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;版本2.2&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="36" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Android2.3&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" sdnum="1028;0;YY/M/D" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;版本2.3.3&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="36" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Android3.0&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" sdnum="1028;0;YY/M/D" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;版本3.0&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="LEFT" height="40" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;Iphone4.0&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;false&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#FF950E" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;span style="font-family: Arial;"&gt;true&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1467600757855739924?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1467600757855739924/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1467600757855739924' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1467600757855739924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1467600757855739924'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/05/html-5-audio-format-support.html' title='HTML 5 Audio Format Support'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-332095492745211234</id><published>2011-05-10T17:40:00.002+08:00</published><updated>2011-05-10T17:40:17.631+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Template</title><content type='html'>一.資料架構&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#20351;&amp;#29992;json&amp;#29289;&amp;#20214;&amp;#25110;&amp;#19968;&amp;#33324;&amp;#29289;&amp;#20214;&lt;br /&gt;var arrayObj=[&lt;br /&gt;    {},{},{},{}&lt;br /&gt;]&lt;br /&gt;var dataObj={&lt;br /&gt;    &amp;quot;prop1&amp;quot;:&amp;quot;xx&amp;quot;,&amp;quot;prop2&amp;quot;:&amp;quot;xx2&amp;quot;,..&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;二.Template 內如何套用資料&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;#30070;&amp;#36039;&amp;#26009;&amp;#28858;Array&amp;#23601;&amp;#26371;&amp;#21453;&amp;#35206;&amp;#30340;&amp;#23559;Array&amp;#20839;&amp;#29289;&amp;#20214;&amp;#21453;&amp;#35206;&amp;#30340;&amp;#22871;&amp;#29992;tmpl&lt;br /&gt;&amp;#33509;&amp;#30070;&amp;#36039;&amp;#26009;&amp;#28858;&amp;#19968;&amp;#20491;&amp;#29289;&amp;#20214;&amp;#65292;&amp;#21063;&amp;#26371;&amp;#30070;&amp;#25104;&amp;#21482;&amp;#26377;&amp;#19968;&amp;#20491;&amp;#29289;&amp;#20214;&amp;#30340;Array&amp;#65292;&lt;br /&gt;&amp;#21482;&amp;#26371;&amp;#22871;&amp;#29992;tmpl&amp;#19968;&amp;#27425;&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#&amp;#27171;&amp;#26495;id&amp;quot;).tmpl(&amp;#35201;&amp;#24118;&amp;#20837;&amp;#30340;&amp;#36039;&amp;#26009;)&lt;br /&gt;&amp;#20363;&lt;br /&gt;var data=[{&amp;quot;myname&amp;quot;:&amp;quot;test1&amp;quot;},{&amp;quot;myname&amp;quot;:&amp;quot;test2&amp;quot;}];&lt;br /&gt;$(&amp;quot;#my_tmpl_1&amp;quot;).tmpl(data);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;三. Template內資料讀取&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#36039;&amp;#26009;&amp;#20358;&amp;#28304;&amp;#20998;&amp;#28858;&amp;#20841;&amp;#20491;&amp;#37096;&amp;#20221;&amp;#65292;&amp;#19968;&amp;#20491;&amp;#26159;&amp;#36617;&amp;#20837;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#65292;&amp;#19968;&amp;#31278;&amp;#26159;&amp;#33258;&amp;#35330;&amp;#30340;&amp;#35722;&amp;#25976;&lt;br /&gt;&amp;#30070;&amp;#36879;&amp;#36942;tmpl&amp;#24118;&amp;#20837;&amp;#36039;&amp;#26009;&amp;#26178;&amp;#21516;&amp;#26178;&amp;#21487;&amp;#33258;&amp;#35330;&amp;#35722;&amp;#25976;&lt;br /&gt;1.&amp;#24118;&amp;#20837;&amp;#36039;&amp;#26009;&amp;#20006;&amp;#33258;&amp;#35330;&amp;#35722;&amp;#25976;&amp;#33287;method&lt;br /&gt;    $(&amp;quot;#my_tmpl_1&amp;quot;).tmpl(data,{&lt;br /&gt;        getResult: function () {&lt;br /&gt;                return &amp;quot;xxx&amp;quot;;&lt;br /&gt;            },&lt;br /&gt;        title: &amp;quot;my title&amp;quot;&lt;br /&gt;    });&lt;br /&gt;2.&amp;#21462;&amp;#24471;&amp;#30001;&amp;#24118;&amp;#20837;&amp;#36039;&amp;#26009;&amp;#21462;&amp;#24471;&amp;#30340;&amp;#20839;&amp;#23481;&lt;br /&gt;    1.${&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}&lt;br /&gt;    2.&amp;#36879;&amp;#36942;tmplItem&amp;#21462;&amp;#24471;&lt;br /&gt;        ${$item.data.&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}&lt;br /&gt;        ($item.data&amp;#20195;&amp;#34920;&amp;#33879;&amp;#25972;&amp;#20491;tmplItem&amp;#20839;&amp;#30340;&amp;#36039;&amp;#26009;)&lt;br /&gt;3.&amp;#21462;&amp;#24471;&amp;#30001;&amp;#33258;&amp;#35330;&amp;#35722;&amp;#25976;&amp;#20358;&amp;#21462;&amp;#24471;&amp;#30340;&amp;#20839;&amp;#23481;&lt;br /&gt;    &amp;#37117;&amp;#38656;&amp;#35201;&amp;#36879;&amp;#36942;$item&amp;#20358;&amp;#21462;&amp;#24471;&lt;br /&gt;    ${$item.&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}&lt;br /&gt;    &lt;br /&gt;    &amp;#21628;&amp;#21483;&amp;#22519;&amp;#34892;&amp;#33258;&amp;#35330;&amp;#30340;method&lt;br /&gt;    ${$item.methodName(param)}&lt;br /&gt;4.&amp;#22312;tmpl&amp;#20839;&amp;#22312;&amp;#20219;&amp;#20309;&amp;#22320;&amp;#26041;&amp;#35201;&amp;#21443;&amp;#32771;&amp;#21040;&amp;#20659;&amp;#36914;&amp;#20358;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#37117;&amp;#21487;&amp;#29992;&lt;br /&gt;    ${$data.&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}&amp;#20358;&amp;#21462;&amp;#24471;&lt;br /&gt;    &amp;#33509;&amp;#26159;&amp;#22312;{{if}}&amp;#20839;&amp;#25110;&amp;#26159;{{each}}&amp;#20839;&amp;#35201;&amp;#29992;&amp;#21040;&amp;#35201;&amp;#29992;&amp;#21040;&lt;br /&gt;    &amp;#21063;&amp;#29992;$data.&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;&amp;#21363;&amp;#21487;&lt;br /&gt;    &lt;br /&gt;    &amp;#20363; {{if $data.author==&amp;quot;ozzyqq&amp;quot;}}&lt;br /&gt;5.&amp;#23565;&amp;#24118;&amp;#20837;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#35722;&amp;#25976;&amp;#21152;&amp;#20837;&amp;#22266;&amp;#23450;&amp;#23383;&amp;#20018;&lt;br /&gt;    &amp;#20363;&lt;br /&gt;    &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; id=${&amp;quot;submenu_&amp;quot;+id}&amp;gt;${title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;    &lt;br /&gt;    &amp;#19981;&amp;#21487;&amp;#29992; id=&amp;quot;submenu_&amp;quot;+${id}&lt;br /&gt;6.&amp;#23559;&amp;#33258;&amp;#35330;&amp;#23660;&amp;#24615;&amp;#36039;&amp;#26009;&amp;#21152;&amp;#20837;tmpl&amp;#20839;&lt;br /&gt;    &amp;lt;div class=&amp;quot;greenbar&amp;quot;&amp;gt;${title+&amp;quot;-&amp;quot;+$item.nowIndex}&amp;lt;/div&amp;gt;    &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; &lt;br /&gt;四.取得由樣板產生的tmplItem應用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#30070;&amp;#38913;&amp;#38754;&amp;#19978;&amp;#30340;DOM&amp;#29289;&amp;#20214;&amp;#26159;&amp;#30001;tmpl&amp;#25152;&amp;#29986;&amp;#29983;&amp;#30340;&amp;#65292;&amp;#21063;&amp;#21487;&amp;#36879;&amp;#36942;&amp;#36889;&amp;#20123;dom&amp;#29289;&amp;#20214;&lt;br /&gt;&amp;#21462;&amp;#24471;tmplItem&amp;#65292;&amp;#20570;&amp;#26356;&amp;#22810;&amp;#30340;&amp;#25033;&amp;#29992;&lt;br /&gt;1.&amp;#21462;&amp;#24471;tmplItme&lt;br /&gt;    &amp;#36879;&amp;#36942;$(dom&amp;#29289;&amp;#20214;).tmplItem()&amp;#21462;&amp;#24471;tmplItem&lt;br /&gt;    &amp;#27880;&amp;#24847;&amp;#65292;&amp;#35442;DOm&amp;#29289;&amp;#20214;&amp;#19968;&amp;#23450;&amp;#24517;&amp;#38656;&amp;#35201;&amp;#26159;&amp;#36879;&amp;#36942;tmpl&amp;#25152;&amp;#29986;&amp;#29983;&amp;#30340;&amp;#25165;&amp;#26377;&amp;#25928;&lt;br /&gt;2.&amp;#21462;&amp;#24471;tmplItem&amp;#30340;dom&amp;#29289;&amp;#20214;&lt;br /&gt;    tmplItem.nodes&lt;br /&gt;3.&amp;#21462;&amp;#24471;tmplItme&amp;#30340;&amp;#36039;&amp;#26009;&lt;br /&gt;    tmplItem.data&lt;br /&gt;4.&amp;#21152;&amp;#20837;&amp;#25110;&amp;#20462;&amp;#25913;&amp;#35722;&amp;#25976;&lt;br /&gt;    &amp;#20063;&amp;#21487;&amp;#23565;&amp;#22871;&amp;#29992;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#20570;&amp;#20462;&amp;#25913;&amp;#25110;&amp;#38989;&amp;#22806;&amp;#26032;&amp;#22686;&amp;#35722;&amp;#25976;&amp;#36914;&amp;#21435;&lt;br /&gt;    &amp;#20363;    $.tmplItem(this).data.newVar=xxx;&lt;br /&gt;4.&amp;#26356;&amp;#26032;&lt;br /&gt;    &amp;#21482;&amp;#35201;&amp;#25913;&amp;#35722;tmplItem.data&amp;#20540;&amp;#20877;&amp;#22519;&amp;#34892;&lt;br /&gt;    tmplItem.update();&lt;br /&gt;    &amp;#30059;&amp;#38754;&amp;#23601;&amp;#33258;&amp;#21205;&amp;#26356;&amp;#26032;&amp;#25104;&amp;#26032;&amp;#30340;&amp;#20540;&amp;#39023;&amp;#31034;&amp;#30340;&amp;#38913;&amp;#38754;&lt;br /&gt;    &lt;br /&gt;&amp;#22312;&amp;#27171;&amp;#26495;&amp;#22806;&amp;#65292;&amp;#26159;&amp;#36879;&amp;#36942;$(dom&amp;#29289;&amp;#20214;).tmplItem()&lt;br /&gt;&amp;#20358;&amp;#21462;&amp;#24471;tmplItem&amp;#30340;&amp;#21443;&amp;#32771;&lt;br /&gt;&amp;#32780;&amp;#22312;&amp;#27171;&amp;#26495;&amp;#20839;&amp;#21063;&amp;#26159;&amp;#20197;$item&amp;#21443;&amp;#32771;&amp;#21040;tmplItem    &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;五.{{if}} {{else}} 內的變數&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;{{if &amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}}&lt;br /&gt;{{if this.&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}}&lt;br /&gt;&lt;br /&gt;Example:&amp;#27604;&amp;#23565;&amp;#22806;&amp;#37096;&amp;#20540;&lt;br /&gt;{{each items}}&lt;br /&gt;    &amp;lt;option value=${id} {{if id==$('#folder02Select').val()}} selected='selected'{{/if}}&amp;gt;&lt;br /&gt;        ${title}&lt;br /&gt;    &amp;lt;/option&amp;gt;&lt;br /&gt;{{/each}}    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;六.在tmpl內使用{{html 變數名稱}}&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;#36890;&amp;#24120;&amp;#22312;tmpl&amp;#20839;&amp;#20351;&amp;#29992;${&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}&amp;#25152;&amp;#21462;&amp;#24471;&amp;#30340;&amp;#20540;&amp;#26371;&amp;#32147;&amp;#36942;&amp;#32232;&amp;#30908;&lt;br /&gt;&amp;#33509;&amp;#35201;&amp;#21462;&amp;#24471;&amp;#30340;&amp;#20540;&amp;#19981;&amp;#32147;&amp;#36942;&amp;#32232;&amp;#30908;&amp;#21063;&amp;#35201;&amp;#29992;{{html &amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;七 {{each 變數名稱}} {{/each}}&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#22312;&amp;#27171;&amp;#26495;&amp;#20839;&amp;#65292;&amp;#23559;array&amp;#22411;&amp;#30340;&amp;#35722;&amp;#25976;&amp;#36039;&amp;#26009;&amp;#19999;&amp;#32102;each&amp;#34389;&amp;#29702;&amp;#65292;&amp;#21487;&amp;#20197;&lt;br /&gt;&amp;#23559;array&amp;#20839;&amp;#27599;&amp;#31558;&amp;#36039;&amp;#26009;&amp;#37117;&amp;#20877;&amp;#25736;&amp;#20986;&amp;#20358;&amp;#34389;&amp;#29702;&lt;br /&gt;&amp;#22312;each&amp;#20839;&amp;#65292;&lt;br /&gt;$index&amp;#20195;&amp;#34920;&amp;#35442;&amp;#31558;&amp;#36039;&amp;#26009;&amp;#30340;index....&amp;#29992;${$index}&amp;#39023;&amp;#31034;&lt;br /&gt;$value&amp;#20195;&amp;#34920;&amp;#35442;&amp;#31558;&amp;#36039;&amp;#26009;&amp;#30340;&amp;#20839;&amp;#23481;...&amp;#29992;$($value.&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;)&amp;#20358;&amp;#21462;&amp;#24471;&amp;#35442;&amp;#31558;&amp;#36039;&amp;#26009;&amp;#20839;&amp;#30340;&amp;#35722;&amp;#25976;&amp;#20540;&lt;br /&gt;&amp;#20363;:&lt;br /&gt;{{each &amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}}&lt;br /&gt;    &amp;lt;li&amp;gt;${$index}+&amp;quot;__&amp;quot;+${$value.&amp;#36039;&amp;#26009;&amp;#20839;&amp;#30340;&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;}}&amp;lt;/li&amp;gt;&lt;br /&gt;{{/each}}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;八 多層次的each使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#33509;&amp;#19981;&amp;#21516;&amp;#23652;&amp;#26377;&amp;#30456;&amp;#21516;&amp;#30340;prop name&amp;#21487;&amp;#29992;this&amp;#20358;&amp;#21312;&amp;#20998;&lt;br /&gt;{{each items}}&lt;br /&gt;    &amp;lt;div class=&amp;quot;btn_bg&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;div class=&amp;quot;first&amp;quot;&amp;gt;${title}&lt;br /&gt;            {{if this.items}}&lt;br /&gt;                &amp;lt;ul class=&amp;quot;link&amp;quot;&amp;gt;&lt;br /&gt;                    {{each items}}&lt;br /&gt;                        &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;${title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;                          &lt;br /&gt;                    {{/each}} &lt;br /&gt;                &amp;lt;/ul&amp;gt;                    &lt;br /&gt;            {{/if}}&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;{{/each}} &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;九.樣板中套用樣板&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;{{tmpl(&amp;#36039;&amp;#26009;&amp;#35722;&amp;#25976;&amp;#21517;&amp;#31281;) &amp;quot;#&amp;#27171;&amp;#26495;id&amp;#21517;&amp;#31281;&amp;quot;}}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;十.對物件套用不同樣板流程&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;1.&amp;#23559;jQuery&amp;#29289;&amp;#20214;&amp;#36681;&amp;#25104;&amp;#28310;&amp;#20633;&amp;#22871;tmpl&amp;#30340;tmplItem    &lt;br /&gt;    selectedItem = $.tmplItem(jQuery&amp;#29289;&amp;#20214;);&lt;br /&gt;2.&amp;#25351;&amp;#23450;tmplItem&amp;#35201;&amp;#20351;&amp;#29992;&amp;#30340;tmpl&lt;br /&gt;    selectedItem.tmpl = detailTemplate;        &lt;br /&gt;3.&amp;#26356;&amp;#26032;&lt;br /&gt;    selectedItem.update();&lt;br /&gt;&lt;br /&gt;&amp;#27880;&amp;#24847;    &lt;br /&gt;&amp;#28961;&amp;#35542;&amp;#26159;&amp;#22871;&amp;#29992;&amp;#19981;&amp;#21516;&amp;#27171;&amp;#26495;&amp;#65292;&amp;#25110;&amp;#26159;&amp;#26356;&amp;#26032;&amp;#27171;&amp;#26495;tmplItem&amp;#30340;data&amp;#24460;&lt;br /&gt;&amp;#20351;&amp;#29992;update()&amp;#26356;&amp;#26032;&amp;#30059;&amp;#38754;&lt;br /&gt;&amp;#22914;&amp;#26524;&amp;#25152;&amp;#29986;&amp;#29983;&amp;#30340;DOM&amp;#29289;&amp;#20214;&amp;#26377;&amp;#20123;&amp;#23660;&amp;#24615;&amp;#65292;&amp;#26159;&amp;#32147;&amp;#30001;&amp;#22806;&amp;#37096;&amp;#30340;js&amp;#25152;&amp;#35373;&amp;#23450;&lt;br /&gt;&amp;#22312;update&amp;#24460;&amp;#36889;&amp;#20123;&amp;#23660;&amp;#24615;&amp;#37117;&amp;#26371;&amp;#28040;&amp;#22833;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-332095492745211234?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/332095492745211234/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=332095492745211234' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/332095492745211234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/332095492745211234'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/05/jquery-template.html' title='jQuery Template'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-5599053590326545620</id><published>2011-05-10T17:31:00.001+08:00</published><updated>2011-05-10T17:34:49.081+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Memo</title><content type='html'>jQuery Memo&lt;br /&gt;1.外部html帶入時&lt;br /&gt; &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;#33509;&amp;#20351;&amp;#29992;innerHTML &amp;#21462;&amp;#21040;&amp;#30340;&amp;#26159;root node&amp;#19979;&amp;#30340;&amp;#20839;&amp;#23481;&lt;br /&gt;outerHTML&amp;#21063;&amp;#26371;&amp;#21253;&amp;#21547;Root Node&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;2.網頁設定編碼為utf-8&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;HTML&amp;#27284;&amp;#26696;&amp;#26412;&amp;#36523;&amp;#38656;&amp;#20197;utf-8&amp;#20786;&amp;#23384;&lt;br /&gt;&amp;#36617;&amp;#20837;&amp;#22806;&amp;#37096;JSON&amp;#27284;&amp;#26696;&amp;#26178;&amp;#65292;&amp;#20063;&amp;#38656;&amp;#20197;utf-8&amp;#26684;&amp;#24335;&amp;#20786;&amp;#23384;&lt;br /&gt;&amp;#25165;&amp;#19981;&amp;#26371;&amp;#36896;&amp;#25104;&amp;#20098;&amp;#30908;&amp;#30332;&amp;#29983;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;3.取得json物件的所有屬性&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;#33509;&amp;#29289;&amp;#20214;&amp;#28858;array&lt;br /&gt;items:[&lt;br /&gt;    {xxx},{xxx},{xxx}...&lt;br /&gt;]&lt;br /&gt;&amp;#21487;&amp;#20197;&amp;#20351;&amp;#29992;length&amp;#21462;&amp;#24471;array&amp;#38263;&amp;#24230;&amp;#65292;&amp;#20006;&amp;#36914;&amp;#32780;&amp;#21462;&amp;#24471;&amp;#25152;&amp;#26377;&amp;#36039;&amp;#26009;&lt;br /&gt;&amp;#33509;&amp;#29289;&amp;#20214;&amp;#38750;array&lt;br /&gt;items:{&lt;br /&gt;    &amp;quot;title&amp;quot;:xxx,&lt;br /&gt;    &amp;quot;name&amp;quot;:xxx,...&lt;br /&gt;}&lt;br /&gt;&amp;#21063;&amp;#21487;&amp;#29992;for(prop in obj)&amp;#26041;&amp;#24335;&amp;#21462;&amp;#24471; prop&amp;#21517;&amp;#31281;&lt;br /&gt;for(prop in items){&lt;br /&gt;    alert(prop+&amp;quot;=&amp;quot;+items[prop])&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;4.對大量物件binding listener&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#30070;&amp;#35201;&amp;#23565;&amp;#22823;&amp;#37327;&amp;#30340;&amp;#29289;&amp;#20214;&amp;#35373;&amp;#23450;&amp;#30435;&amp;#32893;&amp;#30340;&amp;#20107;&amp;#20214;&amp;#33287;&amp;#35201;&amp;#35320;&amp;#30332;&amp;#30340;function&amp;#65292;&amp;#21487;&amp;#20197;&amp;#20351;&amp;#29992;delegate&lt;br /&gt;$(xx).delegate(&amp;#25351;&amp;#23450;&amp;#34389;&amp;#29702;&amp;#29289;&amp;#20214;,&amp;#25351;&amp;#23450;&amp;#35320;&amp;#30332;&amp;#20107;&amp;#20214;,&amp;#22519;&amp;#34892;&amp;#34389;&amp;#29702;&amp;#30340;function);&lt;br /&gt;$(&amp;quot;#mytable&amp;quot;).delegate(&amp;quot;td&amp;quot;, &amp;quot;hover&amp;quot;, function () {      &lt;br /&gt;    $(this).xxxx&lt;br /&gt;})&lt;br /&gt;&amp;#25351;&amp;#23450;&amp;#34389;&amp;#29702;&amp;#29289;&amp;#20214;&amp;#20540;&amp;#21487;&amp;#20197;&amp;#26159;tag name&amp;#22914;&amp;quot;td&amp;quot;&lt;br /&gt;&amp;#21487;&amp;#20197;&amp;#23565;class&amp;#22914;&amp;quot;.myclass&amp;quot;    &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;5.對物件設定監聽程式&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#30070;&amp;#35201;&amp;#23565;&amp;#29289;&amp;#20214;&amp;#35373;&amp;#23450;&amp;#22914;Click...&amp;#31561;&amp;#30435;&amp;#32893;&amp;#65292;&amp;#19968;&amp;#23450;&amp;#35201;&amp;#22312;&amp;#29289;&amp;#20214;&amp;#24050;&amp;#32147;&amp;#29986;&amp;#29983;&amp;#30340;&amp;#29376;&amp;#24907;&amp;#19979;&amp;#35373;&amp;#23450;&lt;br /&gt;&amp;#25165;&amp;#26371;&amp;#26377;&amp;#25928;&amp;#65292;&amp;#22914;&amp;#26524;&amp;#22312;&amp;#29289;&amp;#20214;&amp;#23578;&amp;#26410;&amp;#29986;&amp;#29983;&amp;#20043;&amp;#21069;&amp;#23601;&amp;#35201;&amp;#25226;&amp;#30435;&amp;#32893;&amp;#35373;&amp;#23450;&amp;#22909;&lt;br /&gt;&amp;#21063;&amp;#38656;&amp;#36879;&amp;#36942;livequery plugin&amp;#20358;&amp;#20570;&lt;br /&gt;&amp;#20363;&lt;br /&gt;$(&amp;quot;.myclass&amp;quot;).livequery(&amp;quot;click&amp;quot;,function(){})&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;6.jQuery與DOM物件互轉&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;1.&amp;#22312;jQuery&amp;#30340;&amp;#25805;&amp;#20316;&amp;#65292;&amp;#32085;&amp;#22823;&amp;#37096;&amp;#20998;&amp;#22238;&amp;#20659;&amp;#37117;&amp;#26371;&amp;#26159;&amp;#19968;&amp;#20491;jQuery&amp;#21253;&amp;#35065;&amp;#29289;&amp;#20214;&lt;br /&gt;  &amp;#35201;&amp;#23559;jQuery&amp;#29289;&amp;#20214;&amp;#36681;&amp;#25104;DOM&amp;#29289;&amp;#20214;&amp;#65292;$(&amp;quot;'#&amp;quot;+containerID+&amp;quot;'&amp;quot;)[0]&lt;br /&gt;2.DOM&amp;#36681;jQuery&amp;#29289;&amp;#20214;&lt;br /&gt;    &amp;#29992;$(dom&amp;#29289;&amp;#20214;)&amp;#21253;&amp;#35065;&amp;#24460;&amp;#21363;&amp;#28858;jQuery&amp;#29289;&amp;#20214;&lt;br /&gt;3.&amp;#22312;jQuery&amp;#20351;&amp;#29992;each&amp;#21462;&amp;#24471;&amp;#25152;&amp;#26377;&amp;#29289;&amp;#20214;&lt;br /&gt;    each&amp;#20839;&amp;#30340;this&amp;#26159;&amp;#19968;&amp;#20491;DOM&amp;#29289;&amp;#20214;&amp;#65292;&amp;#38656;&amp;#35201;$(this)&amp;#21253;&amp;#35037;&amp;#36942;&lt;br /&gt;    &amp;#25165;&amp;#26371;&amp;#35722;&amp;#25104;jQuery&amp;#29289;&amp;#20214;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;7.index&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;#30070;selector&amp;#21462;&amp;#24471;&amp;#19968;&amp;#22534;&amp;#30340;&amp;#23376;node&amp;#35201;&amp;#23565;&amp;#29305;&amp;#23450;&amp;#23376;node&amp;#25805;&amp;#20316;    &lt;br /&gt;1.&amp;#36879;&amp;#36942;index&amp;#21462;&amp;#24471;&amp;#31532;&amp;#24190;&amp;#20491;&amp;#29289;&amp;#20214;&lt;br /&gt;    $(&amp;quot;.left_box :eq(&amp;quot;+_index+&amp;quot;)&amp;quot;)&lt;br /&gt;2.&amp;#21462;&amp;#24471;&amp;#30446;&amp;#21069;&amp;#29289;&amp;#20214;&amp;#30340;index&amp;#20540;&lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#26377;&amp;#19968;&amp;#22534;li &amp;#30001;&amp;#20197;&amp;#19979;&amp;#21487;&amp;#20197;&amp;#30693;&amp;#36947;&amp;#33258;&amp;#24049;&amp;#26159;&amp;#22312;&amp;#31532;&amp;#24190;&amp;#20491;&lt;br /&gt;    $(&amp;quot;.left_box li&amp;quot;).index($(this))&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-5599053590326545620?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/5599053590326545620/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=5599053590326545620' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5599053590326545620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5599053590326545620'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/05/jquery-memo.html' title='jQuery Memo'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1289543786266724476</id><published>2011-04-30T21:20:00.002+08:00</published><updated>2011-05-10T17:43:28.229+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='音樂影像'/><title type='text'>StreetVoice</title><content type='html'>今天出門筆電裡沒放任何mp3檔案&lt;br /&gt;還好最近SV播放超順&lt;br /&gt;聽了一整個下午 沒有任何斷線與LAG&lt;br /&gt;果然上了雲端後 好用多了&lt;br /&gt;&lt;br /&gt;修澤的音樂真的很棒&lt;br /&gt;&lt;embed src='http://tw.streetvoice.com/static/player/MusicPlayerList.swf?jsPlayer=false&amp;srv=tw.streetvoice.com&amp;ph=music&amp;getv=config&amp;au=24622&amp;listsd=439247&amp;listtype=2&amp;skinID=8&amp;autoStart=false&amp;autoPlay=false&amp;isEmbed=true' type='application/x-shockwave-flash' width='330' height='180' allowScriptAccess='always'&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1289543786266724476?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1289543786266724476/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1289543786266724476' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1289543786266724476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1289543786266724476'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/04/streevoice.html' title='StreetVoice'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-8604665021925331978</id><published>2011-04-06T12:30:00.001+08:00</published><updated>2011-04-06T12:30:28.630+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>清明節</title><content type='html'>今年的清明 我跟小弟去掃墓&lt;br /&gt;大弟就在醫院照顧老爸&lt;br /&gt;&lt;br /&gt;一樣是早上七點出門&lt;br /&gt;上了高速公路 往旗山的方向&lt;br /&gt;&lt;br /&gt;往年 在清明前 老爸就會先開車來墓園打掃 除草&lt;br /&gt;大家習慣看到就是個乾乾淨淨的園地&lt;br /&gt;今年老爸住院了 &lt;br /&gt;家族裡的叔叔伯伯 還有我們這一輩的堂兄弟們&lt;br /&gt;大家都要戴上手套 除草 整理&lt;br /&gt;就像是小時候 曾祖父的墓地還在鳳山那時&lt;br /&gt;每到清明掃墓 大家都會拿著鐮刀 清理墳上的雜草&lt;br /&gt;&lt;br /&gt;忙了一身的汗水 祭拜祖先和土地公&lt;br /&gt;坐下來 好久不見的堂兄弟們 聊起工作聊起生活&lt;br /&gt;叔叔伯伯們問起老爸狀況&lt;br /&gt;狀況好轉 也讓他們比較放心一些&lt;br /&gt;&lt;br /&gt;一邊用石頭壓著各色的墳墓紙&lt;br /&gt;一邊把蛤蜊殼丟在墳上&lt;br /&gt;算算已經好幾年沒在清明節回來掃墓了&lt;br /&gt;明年此時 &lt;br /&gt;應該老爸就可以跟我們坐在這&lt;br /&gt;一起&lt;br /&gt;祭祖 聊天&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-8604665021925331978?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/8604665021925331978/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=8604665021925331978' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8604665021925331978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8604665021925331978'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/04/blog-post.html' title='清明節'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-819596138534407450</id><published>2011-03-29T20:18:00.000+08:00</published><updated>2011-04-04T20:19:14.882+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>家屬休息區</title><content type='html'>在每個加護病房旁會有個家屬休息區&lt;br /&gt;隔了許多上下鋪的木床&lt;br /&gt;每張床都有一個編號，對應的是在加護病房內病患的編號&lt;br /&gt;當休息區電話響起，&lt;br /&gt;代表的是加護病房內要聯絡哪個病患的家屬&lt;br /&gt;&lt;br /&gt;2531 這是老爸的編號&lt;br /&gt;休息區的溫度感覺比其他樓層冷了許多&lt;br /&gt;也許是剛好這幾天寒流來的緣故&lt;br /&gt;裡面總有股化不開 讓人開朗不起來的氣氛&lt;br /&gt;也許是因為在這裡的每個人 &lt;br /&gt;都有個正在加護病房努力求生的家人&lt;br /&gt;&lt;br /&gt;躺在小小的木板床上，伸手就可以觸碰到上鋪的木板&lt;br /&gt;彷彿回到 新兵訓練中心的生活&lt;br /&gt;拉上小布簾 把自己關在小空間內&lt;br /&gt;打開電腦 繼續著還沒寫完的程式&lt;br /&gt;即使很疲累 但 似乎 精神還更能集中一些&lt;br /&gt;回到程式碼裡 也暫時讓自己跳脫當下的氣氛&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-819596138534407450?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/819596138534407450/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=819596138534407450' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/819596138534407450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/819596138534407450'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/03/blog-post_29.html' title='家屬休息區'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-6743364973886217673</id><published>2011-03-26T19:56:00.000+08:00</published><updated>2011-04-04T19:57:40.043+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>治療室</title><content type='html'>治療室總是開著明亮的電燈&lt;br /&gt;還有一堆的儀器&lt;br /&gt;以往走過 還會好奇的看著 躺在床上&lt;br /&gt;插滿各式管子的病患&lt;br /&gt;今天 床上躺著的 是我老爸&lt;br /&gt;&lt;br /&gt;看著儀器上的數據 跳呀跳著&lt;br /&gt;不時發出 警示聲&lt;br /&gt;老爸已經打了鎮定劑 暫時得到休息&lt;br /&gt;偶爾看他睜開眼開始掙扎 用力咬著嘴裡的呼吸管&lt;br /&gt;我們只能在旁摸著他的頭 不斷說話 安撫著他的情緒&lt;br /&gt;然後睡著&lt;br /&gt;一整個夜 就這樣反反覆覆 反反覆覆&lt;br /&gt;我和大弟 兩個人輪流到病房短暫休息睡覺&lt;br /&gt;一天 兩天 我們也不知道什麼時候可以回家好好睡個覺&lt;br /&gt;&lt;br /&gt;過了一天 一夜 不再需要靠打鎮定劑 讓老爸睡著&lt;br /&gt;偶爾他想說話 卻無法表達&lt;br /&gt;我們只能用張白紙 寫上許多隻字片語&lt;br /&gt;讓他用手指 表達可能他想說的話&lt;br /&gt;&lt;br /&gt;原來灌食就是這樣&lt;br /&gt;把牛奶倒進一條 由鼻子直通到胃的塑膠管&lt;br /&gt;心跳似乎越來越慢 最怕心衰竭的狀況發生&lt;br /&gt;開刀前在治療室的三個日夜&lt;br /&gt;像是完全沒有止境的三天&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-6743364973886217673?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/6743364973886217673/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=6743364973886217673' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6743364973886217673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6743364973886217673'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/03/blog-post_26.html' title='治療室'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-835996091560309095</id><published>2011-03-24T19:38:00.002+08:00</published><updated>2011-04-04T19:40:21.054+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>難過</title><content type='html'>一早老媽就打電話來 要我早點到醫院&lt;br /&gt;看到老爸疲累的樣子&lt;br /&gt;媽說 爸因為喘的厲害 一整夜都沒睡了&lt;br /&gt;算起來 老爸已經好幾天沒有睡覺了&lt;br /&gt;這幾天 似乎 病情 有些急速惡化&lt;br /&gt;中午 一樣買了飯&lt;br /&gt;老爸吃了幾口 就沒辦法再吃下去&lt;br /&gt;"推我出去 走走吧 到比較有風的地方"&lt;br /&gt;"好"&lt;br /&gt;推出病房區域 一樣繞著電梯走道&lt;br /&gt;似乎在找哪裡是比較有風的地方&lt;br /&gt;可是 其實我都感覺不到&lt;br /&gt;"就這裡吧 停下來休息一下"&lt;br /&gt;我們停在靠右側電梯 旁的走道上&lt;br /&gt;&lt;br /&gt;老爸望著窗外的遠方&lt;br /&gt;彷彿要把他心裡許許多多的話 都讓我記清楚&lt;br /&gt;如果可以 想回山上去看看 但這可能不是個能達成的願望 &lt;br /&gt;想著和老媽在山上是何等的幸福&lt;br /&gt;最擔心的是老媽 以後的生活&lt;br /&gt;說起了他對我們兄弟的一點一滴&lt;br /&gt;還有那許許多多 以前我所不了解的事&lt;br /&gt;他很疲累的說著 一面要我給他水&lt;br /&gt;但他真的累了&lt;br /&gt;&lt;br /&gt;站在他身後 我只有蹲下忍住眼淚發出的聲音&lt;br /&gt;"我們回房間吧"&lt;br /&gt;他真的累了&lt;br /&gt;&lt;br /&gt;推回病房 老爸坐在病床上&lt;br /&gt;氧氣罩開到最大 似乎也無法讓他可以好好的呼吸&lt;br /&gt;老爸說&lt;br /&gt;"也許過不了這一夜了 晚上你們兄弟都一起來"&lt;br /&gt;&lt;br /&gt;我把緊急鈴 按了又按&lt;br /&gt;焦急的等待護士與醫師的到來&lt;br /&gt;&lt;br /&gt;接下來老爸被推進了治療室 綁上了手腳&lt;br /&gt;嘴巴與鼻子插了管 再也無法說話&lt;br /&gt;開始了他最痛苦的幾天幾夜&lt;br /&gt;&lt;br /&gt;這是 2011/3/24 下午四點&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-835996091560309095?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/835996091560309095/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=835996091560309095' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/835996091560309095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/835996091560309095'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/03/blog-post_24.html' title='難過'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7264854243465390987</id><published>2011-03-17T15:01:00.002+08:00</published><updated>2011-03-17T15:01:07.903+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>陽光 午後</title><content type='html'>聽說又有另一波冷氣團&lt;br /&gt;不過在高雄 還是一樣是有陽光的好天氣&lt;br /&gt;老爸今天下午狀況不錯&lt;br /&gt;不想躺在病床&lt;br /&gt;&lt;br /&gt;借了輪椅 戴好口罩&lt;br /&gt;慢慢推著他離開病房&lt;br /&gt;&lt;br /&gt;長庚病房外 除了看電視的交誼廳外 其實沒甚空間&lt;br /&gt;繞著八樓 中央電梯旁繞了幾圈&lt;br /&gt;&lt;br /&gt;找個靠牆的位置 可以透過窗戶看向遠方&lt;br /&gt;還有明亮的陽光&lt;br /&gt;&lt;br /&gt;回到病房 拿個小椅子 還有今天的報紙&lt;br /&gt;和老爸坐在窗邊 看著報紙上&lt;br /&gt;昨天世界發生的大小事&lt;br /&gt;這一刻的陽光&lt;br /&gt;讓我跟老爸都有種幸福的感覺&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7264854243465390987?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7264854243465390987/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7264854243465390987' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7264854243465390987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7264854243465390987'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/03/blog-post_17.html' title='陽光 午後'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-6016265604249498099</id><published>2011-03-14T03:05:00.001+08:00</published><updated>2011-03-14T03:19:57.244+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>老爸 這次你要撐過去</title><content type='html'>凌晨一點多 &lt;br /&gt;坐客運回到高雄老家&lt;br /&gt;看著放在桌上 老爸的手術同意書 &lt;br /&gt;即使現在的我非常疲累 &lt;br /&gt;還是無法就這樣睡著&lt;br /&gt;&lt;br /&gt;閉上眼 過往的一幕幕 &lt;br /&gt;就這樣 在眼前 在腦海 翻來覆去&lt;br /&gt;&lt;br /&gt;記得那個我在台北度過很難過的一夜&lt;br /&gt;隔天請了假&lt;br /&gt;坐高鐵 轉火車 再轉客運&lt;br /&gt;去屏東萬巒找我老爸&lt;br /&gt;"爸，不要來載我，我自己走路進去就可以了"&lt;br /&gt;&lt;br /&gt;下了屏東客運，我往山的那一頭走去&lt;br /&gt;這一路的旅途，就是這樣靜靜的走&lt;br /&gt;走在筆直沒有人車的產業道路上&lt;br /&gt;&lt;br /&gt;遠遠看到熟悉的車開了過來，&lt;br /&gt;老爸還是不放心的開了車來找我&lt;br /&gt;&lt;br /&gt;上了車，一陣沉默，老爸問了問&lt;br /&gt;我看著窗外，眼淚慢慢掉了下來&lt;br /&gt;這是 第一次在老爸面前哭了出來&lt;br /&gt;他只是跟我說 "沒關係的 沒關係的"&lt;br /&gt;&lt;br /&gt;回到山上的家 老爸問了問我要不要喝咖啡&lt;br /&gt;看他燒著水，熟練的煮著他自己種的咖啡&lt;br /&gt;坐在椅子上 這裡遠望可以看到高雄的大樓&lt;br /&gt;在徐徐的微風中 我們就這樣靜靜的坐著&lt;br /&gt;&lt;br /&gt;"明天早上一起去爬山吧"&lt;br /&gt;"好"&lt;br /&gt;隔天天還沒亮，老爸拿了個木杖，一瓶水給我&lt;br /&gt;"多帶件衣服，到山頂上把汗溼的衣服換掉才不會感冒"&lt;br /&gt;"好"&lt;br /&gt;&lt;br /&gt;這是條老爸很熟悉的登山步道&lt;br /&gt;跟著他的腳步&lt;br /&gt;一面走一面跟我說遠處的山是哪裡哪裡&lt;br /&gt;走到山頂的目的地，在平台上坐著&lt;br /&gt;天才開始矇矇亮了起來&lt;br /&gt;&lt;br /&gt;老爸 這次你可一定要撐過去啊&lt;br /&gt;我還想再載你一起回山上去的&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-6016265604249498099?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/6016265604249498099/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=6016265604249498099' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6016265604249498099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6016265604249498099'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/03/blog-post.html' title='老爸 這次你要撐過去'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-3558130878920951653</id><published>2011-02-17T16:16:00.005+08:00</published><updated>2011-02-17T16:45:34.889+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>numChildren屬性對應子物件數量的正確性</title><content type='html'>在Flash IDE上設計好的物件，如果要利用AS取得該物件下的子物件數量&lt;br /&gt;通常會是透過numChildren取得子物件數量，例如ball.numChildren&lt;br /&gt;&lt;br /&gt;但有可能會有讀到的numChildren值，與你在Flash IDE上放置的子物件數量值不同的問題。&lt;br /&gt;&lt;br /&gt;這情況會發生在，當在Flash IDE上設計子物件時，把多個Shape物件(也就是並未轉成Symble)，放在一起(在IDE上把多個Shape放在同一個Layer上或把多個Shape放在相鄰Layer上)，這時候這些相鄰的Shape，不管數量有多少，都只會被當作一個子物件計算，這時numChildren取得子物件數量就會與在IDE上放的子物件數量不同&lt;br /&gt;&lt;br /&gt;如果Shape間有被TextField物件或其他Symble間隔開來，則numChildren可讀到正確的子物件數量，&lt;br /&gt;或是將繪製的物件轉成MovieClip就可以正確讀出&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-3558130878920951653?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/3558130878920951653/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=3558130878920951653' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3558130878920951653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3558130878920951653'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/02/numchildren.html' title='numChildren屬性對應子物件數量的正確性'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7921653377597247038</id><published>2011-02-09T15:42:00.002+08:00</published><updated>2011-02-09T15:42:54.429+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>今年過年</title><content type='html'>&lt;font color='blue'&gt;醫院&lt;/font&gt;&lt;br /&gt;年前老爸送長庚急診，大概是過年大家都要出院回家&lt;br /&gt;大弟只在急診室等了一夜，等我到醫院時 就排到了病床&lt;br /&gt;我們兄弟輪替著在醫院陪著，&lt;br /&gt;在回到家的這幾個晚上，我都在醫院陪著&lt;br /&gt;&lt;br /&gt;老爸睡的不好，有時候整晚沒睡，需要靠安眠藥才能休息&lt;br /&gt;有時因藥物的副作用讓他痛的無法入眠&lt;br /&gt;很自然的，我的睡眠也就斷斷續續&lt;br /&gt;&lt;br /&gt;每天一早7點老爸就會起床吃藥.&lt;br /&gt;拉開窗戶的百葉窗， 這是一天的開始&lt;br /&gt;白天有機會休息時，就躺在旁邊的躺椅上&lt;br /&gt;也許是小睡片刻，也許是看看書，或者是看著外面的天空&lt;br /&gt;想著許多許多的事 看著窗外一片美麗的藍&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;買彩卷&lt;/font&gt;&lt;br /&gt;快中午，小弟就到醫院來，我也偷了個空&lt;br /&gt;早點回家抱抱妹妹&lt;br /&gt;帶老婆去剪頭髮，說好打電話來 我再去接他&lt;br /&gt;&lt;br /&gt;在家跟妹妹玩，看看時間差不多了&lt;br /&gt;騎著摩拖車載妹妹去找媽媽&lt;br /&gt;媽媽在髮廊斜對面的彩卷行，&lt;br /&gt;聽說這期有11億，當然也要跟人去碰碰運氣&lt;br /&gt;買了400塊的刮刮樂，還中了700，今年的運氣還真是有點不錯&lt;br /&gt;坐在彩卷行的椅子上，一家人開心的對獎，&lt;br /&gt;喝著老闆請的飲料&lt;br /&gt;明亮的陽光 大好的天氣&lt;br /&gt;有一種幸福的感覺&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;除夕夜&lt;/font&gt;&lt;br /&gt;原本該是全家團聚的時間&lt;br /&gt;去年的這個時候，還聽著老爸講著似乎每年都相同的故事&lt;br /&gt;老婆本來還說要聽看看老爸今年講的是否一樣&lt;br /&gt;只是這個夜&lt;br /&gt;只有老媽 小弟還有我一家吃著晚餐&lt;br /&gt;大弟在醫院陪著老爸&lt;br /&gt;&lt;br /&gt;簡單的吃了飯，小弟開車載著我們到醫院&lt;br /&gt;今天晚上他會陪爸&lt;br /&gt;&lt;br /&gt;醫院裡冷冷清清，大家都趕在過年前出院請假回去了&lt;br /&gt;圍在爸身邊看他有點清醒的樣子&lt;br /&gt;我們大家把紅包放到他上衣的口袋&lt;br /&gt;爸 過年了 新年快樂&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;初一&lt;/font&gt;&lt;br /&gt;習慣在大年初一跟著家人到廟裡拜拜&lt;br /&gt;也感受那比較濃厚的過年氣味&lt;br /&gt;&lt;br /&gt;鼓山亭 大火後重建 已經恢復整個廟宇的建築&lt;br /&gt;只是已經失去原本古樸的外觀&lt;br /&gt;遇到了八叔，問起爸的狀況，簡單的回應有好了一些&lt;br /&gt;&lt;br /&gt;在成功路上繞了一下&lt;br /&gt;才找到了 蘇府王爺廟，附近都蓋了新大樓&lt;br /&gt;也大概是自己太久沒回去了，指憑著記憶要找到那在大樹旁的廟&lt;br /&gt;越來越難&lt;br /&gt;&lt;br /&gt;傍晚媽煮飯 怕妹妹在旁邊吵&lt;br /&gt;騎著車到文化中心晃晃&lt;br /&gt;老婆悠閒的逛著廣場上一個個的年節攤位&lt;br /&gt;妹妹在廣場旁的階梯上，上上下下並玩著拔草亂撒的遊戲&lt;br /&gt;一直到老婆帶著滿手的零食 一家人吃完後，才盡興的回家&lt;br /&gt;&lt;br /&gt;明天就要回台北了&lt;br /&gt;8點多再騎車去去長庚 看看爸&lt;br /&gt;今天晚上 是大弟還有他老婆在醫院看顧&lt;br /&gt;和大弟 聊阿聊的 10點半多載大弟一起回家&lt;br /&gt;回家路上 大弟帶我到瑞隆路上 買了好吃的豆漿燒餅&lt;br /&gt;這是份暖暖的宵夜 &lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;初二&lt;/font&gt;&lt;br /&gt;小弟開著車帶我們到高鐵站&lt;br /&gt;滿滿的乘車人潮，等了會才有位子在摩斯吃早餐&lt;br /&gt;要回台北了 一堆的工作等著&lt;br /&gt;只希望 在南部的家人 可以 健康平安&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7921653377597247038?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7921653377597247038/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7921653377597247038' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7921653377597247038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7921653377597247038'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/02/blog-post.html' title='今年過年'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-5814748295422241328</id><published>2011-01-27T16:16:00.004+08:00</published><updated>2011-01-27T16:21:27.283+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>以SWF為Skin的程式設計</title><content type='html'>預期開發功能&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.Flash&amp;#20027;&amp;#31243;&amp;#24335;&amp;#33287;&amp;#35222;&amp;#35258;&amp;#22806;&amp;#35264;&amp;#37096;&amp;#20221;&amp;#20998;&amp;#38626;&lt;br /&gt;2.&amp;#22806;&amp;#35264;&amp;#37096;&amp;#20221;&amp;#28858;&amp;#20197;Flash IDE&amp;#35373;&amp;#35336;&amp;#36664;&amp;#20986;swf&amp;#27284;&amp;#26696;&amp;#65292;&amp;#30070;&amp;#20316;&amp;#20027;&amp;#31243;&amp;#24335;&amp;#22806;&amp;#35264;Skin&lt;br /&gt;3.Skin&amp;#37096;&amp;#20221;&amp;#65292;&amp;#35373;&amp;#35336;&amp;#24107;&amp;#21487;&amp;#20219;&amp;#24847;&amp;#25490;&amp;#21015;&amp;#29289;&amp;#20214;&lt;br /&gt;4.&amp;#21508;&amp;#20491;Skin&amp;#65292;&amp;#20801;&amp;#35377;&amp;#37096;&amp;#20221;&amp;#20803;&amp;#20214;&amp;#19981;&amp;#23384;&amp;#22312;&lt;br /&gt;5.&amp;#22312;&amp;#31243;&amp;#24335;&amp;#36914;&amp;#34892;&amp;#30070;&amp;#20013;&amp;#65292;&amp;#21487;&amp;#20219;&amp;#24847;&amp;#26356;&amp;#25563;Skin&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;一.Skin Loader&lt;/font&gt;&lt;br /&gt;在利用Loader載入外部swf當作skin時，因為要當作skin用的swf內必定都會有著相同的物件名稱。例如skin01.swf與skin02.swf內都會有著同為bg的物件，這時在設定loader的LoaderContext時需設定其&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;讓載入的物件Class屬於主體ApplicationDomain下的子系，才能讓每次載入不同swf的Class都能生效&lt;br /&gt;如果使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;context.applicationDomain = ApplicationDomain.currentDomain;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;會讓所有的Class都掛在主體ApplicationDomain下，這時後當重新載入新的swf時，檢查到ApplicationDomain下該物件名稱Class已經存在，則會使用原有的Class，所以新載入的swf內同名物件永遠無法載入，只會一直載入舊有的Class&lt;br /&gt;就無法達到動態換Skin的作用&lt;br /&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var loader:Loader = new Loader();&lt;br /&gt;var request:URLRequest = new URLRequest(_swfPath);&lt;br /&gt;var context:LoaderContext = new LoaderContext();&lt;br /&gt;context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);&lt;br /&gt;loader.load(request,context);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Skin內使用物件Class設計&lt;/font&gt;&lt;br /&gt;在Skin內要用到的物件，在設計Class時，不要在建構子內放置物件的初始化動作&lt;br /&gt;(因為產生物件時，可能還沒有實體內容載入)，而是將初始化的動作放在一個如&lt;br /&gt;init()的public method內，在確認物件存在的狀態再執行init()即不會出錯 &lt;br /&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public function Banner(){}&lt;br /&gt;public function init():void {&lt;br /&gt;    setView();&lt;br /&gt;    setListener();&lt;br /&gt;}&lt;br /&gt;private function setView():void {}&lt;br /&gt;private function setListener():void {}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Skin Swf在Flash IDE上的設定&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.設定一個AssetContainer，用來設計Skin Layout&lt;/font&gt;&lt;br /&gt;通常利用loader載入swf當作library來使用物件，都是利用在物件上linkage設定Class後來取得物件使用，但若這樣在程式裡產生物件使用，Layout部份，就需要寫在程式碼裡去做排列，但這樣就無法讓視覺設計去自行設計版面排列。&lt;br /&gt;&lt;br /&gt;可以在fla內設定一個MovieClip當作AssetContainer來用，設計師在這個Container內排列所要的物件，與所要的排列方式，&lt;br /&gt;透過loader載入swf後，取得這個AssetContainer物件的Class，再由這Class內，透過getChildByName，取得所有物件，各物件即已經存在有位置大小等屬性&lt;br /&gt;&lt;br /&gt;例&lt;br /&gt;在Fla的library內設定AssetContainer Linkage Class&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var AssetContainer:Class=loader.contentLoaderInfo.applicationDomain.getDefinition(className)  as  Class&lt;br /&gt;_assetLib = new AssetContainer();&lt;br /&gt;mybg=_assetLib.getChildByName(&amp;quot;bg&amp;quot;);&lt;br /&gt;mybg.init();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.在Linkage對物件設定Class時，建議都在Class上指向完整Clss，Base Class都是MovieClip&lt;/font&gt;&lt;br /&gt;若有需要用到相同物件，因為Class只能指定給一個物件，若有其他需要，可以extends Class出來使用即可&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;3.繼承自Components的元件需更改元件Linkage Class&lt;/font&gt;&lt;br /&gt;若元件繼承自Components，在將component拉到library內後，在components上的linkage的Class改成自訂Class name&lt;br /&gt;例如自己設記一個繼承自List元件的Class MyList，在Fla內需先把List元件拉入Library內，&lt;br /&gt;再修改List元件的linkage的Class為MyList &lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.主程式&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.物件參考變數設定&lt;/font&gt;&lt;br /&gt;在主程式中，用來當作物件參考的變數，在重新載入Skin後即會失效&lt;br /&gt;要讓物件參考變數再度指向物件參考需透過getChilByName取得才能保證取到物件&lt;br /&gt;&lt;br /&gt;例如&lt;br /&gt;在swf內有一個 instance為book的Book物件&lt;br /&gt;當重新載入skin時，這個book變數並不會自動指向新取代而來的物件&lt;br /&gt;需要透過&lt;br /&gt;book=app.getChildByName("book")來讓變數指到實體的物件&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;2.不同SKin允許部份元件不存在&lt;/font&gt;&lt;br /&gt;可能會需要在不同的Skin中允許部份的元件不存在或不使用&lt;br /&gt;在可能會因為物件不存在而造成錯誤的地方，先用&lt;br /&gt;if(obj!=null)做檢查再執行&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-5814748295422241328?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/5814748295422241328/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=5814748295422241328' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5814748295422241328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5814748295422241328'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2011/01/swfskin.html' title='以SWF為Skin的程式設計'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-544248624830913054</id><published>2010-12-27T15:28:00.009+08:00</published><updated>2011-01-14T16:40:47.670+08:00</updated><title type='text'>test</title><content type='html'>&lt;embed src='http://tw.beta.streetvoice.com/static/player/MusicPlayer.swf?jsPlayer=false&amp;srv=tw.beta.streetvoice.com&amp;ph=music&amp;getv=config&amp;au=58782&amp;listsd=565311&amp;listtype=2&amp;skinID=6&amp;autoStart=false&amp;autoPlay=false&amp;isEmbed=true' type='application/x-shockwave-flash' width='330' height='100' allowScriptAccess='always'&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-544248624830913054?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/544248624830913054/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=544248624830913054' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/544248624830913054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/544248624830913054'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/12/test.html' title='test'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-4424368438369886538</id><published>2010-12-24T13:16:00.006+08:00</published><updated>2010-12-24T13:25:42.824+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><title type='text'>網頁與AIR程式互動</title><content type='html'>如果需要在Browser上可以與AIR應用程式做互動，如安裝AIR App，或由網頁上的Click觸發啟動AIR App，以下是相關執行程序&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;一.準備工作&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.AIR程式端設定AIR程式允許透過Browser觸發&lt;/font&gt;&lt;br /&gt;設定AIR發布用的application.xml的&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;application xmlns="http://ns.adobe.com/air/application/2.0"&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;建議設定發布為AIR 1.53以上版本，因為如果AIR為1.53之前的版本，Browser要呼叫AIR，一定要知道AIR的PID值(在AIR內可以用NativeApplication.nativeApplication.publisherID取得)。若AIR為1.53後的版本，若Browser不知道AIR的PID，可以用""代即可。 &lt;br /&gt;&lt;br /&gt;加入&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;allowBrowserInvocation&amp;gt;true&amp;lt;/allowBrowserInvocation&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;讓AIR允許被Browser啟動&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;2.Browser端Flash取得AIR Browser API&lt;/font&gt;&lt;br /&gt;Browser端Flash要操作AIR所要用的API都放在http://airdownload.adobe.com/air/browserapi/air.swf內&lt;br /&gt;透過loader載入這個檔案即可使用相關功能&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public var airSWF:Object;&lt;br /&gt;public var airSWFLoader:Loader = new Loader();&lt;br /&gt;public var loaderContext:LoaderContext = new LoaderContext();&lt;br /&gt;loaderContext.applicationDomain = ApplicationDomain.currentDomain; &lt;br /&gt;airSWFLoader.contentLoaderInfo.addEventListener(Event.INIT, onInit); &lt;br /&gt;airSWFLoader.load(new URLRequest(&amp;quot; http://airdownload.adobe.com/air/browserapi/air.swf&amp;quot;), loaderContext);&lt;br /&gt;private function onInit(e:Event):void { &lt;br /&gt;    airSWF = e.target.content;&lt;br /&gt;    airSWF.getApplicationVersion(appID, pubID, versionDetectCallback);&lt;br /&gt;}        &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Browser檢查Client是否已經安裝AIR執行環境&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var result:String=airSWF.getStatus();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;取得回傳值&lt;br /&gt;"available":可安裝但尚未安裝。&lt;br /&gt;"unavailable":無法安裝&lt;br /&gt;"installed":已安裝&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Browser檢查Client端是否已經安裝AIR 應用程式&lt;/font&gt;&lt;br /&gt;利用檢查AIR應用程式版本來確認程式是否已經安裝，執行後，若檢查完成&lt;br /&gt;會呼叫執行所設定的versionDetectCallback函式，並在這callBack函式內&lt;br /&gt;取得版本值，當版本值為null代表未安裝程式&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;airSWF.getApplicationVersion(appID, pubID, versionDetectCallback);&lt;br /&gt;private function versionDetectCallback(version:String):void { }    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;設定參數:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;appID:&amp;#25033;&amp;#29992;&amp;#31243;&amp;#24335;ID&amp;#65292;&amp;#21363;AIR&amp;#25033;&amp;#29992;&amp;#31243;&amp;#24335;&amp;#30340;application.xml&amp;#20839;&amp;#30340;id&amp;#20540;&amp;#65292;&amp;#25110;&amp;#22312;air&amp;#20839;&amp;#36879;&amp;#36942;&lt;br /&gt;    NativeApplication.nativeApplication.applicationID&amp;#21462;&amp;#24471;&lt;br /&gt;pubID:&amp;#30332;&amp;#20296;&amp;#32773;ID&amp;#65292;&amp;#22312;air&amp;#20839;&amp;#36879;&amp;#36942;&lt;br /&gt;    NativeApplication.nativeApplication.publisherID&amp;#21462;&amp;#24471;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;注意:要讓這功能有效可以使用，在使用air.swf一定要是載入http://airdownload.adobe.com/air/browserapi/air.swf&lt;br /&gt;若將這air.swf複製到local端呼叫使用，則取得版本永遠會是null值 &lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.Browser安裝AIR App&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;airSWF.installApplication(installPath, runtimeVersion, arguments); &lt;br /&gt;&amp;#35373;&amp;#23450;&amp;#21443;&amp;#25976;:&lt;br /&gt;installPath:String&amp;#65292;&amp;#35201;&amp;#23433;&amp;#35037;&amp;#30340;air&amp;#27284;&amp;#26696;&amp;#36335;&amp;#24465;&lt;br /&gt;runtimeVersion:String&amp;#65292;&amp;#20801;&amp;#35377;&amp;#22519;&amp;#34892;&amp;#30340;AIR Runtime&amp;#26368;&amp;#20302;&amp;#29256;&amp;#26412;&amp;#65292;&amp;#20363;&amp;#22914;&amp;quot;1.5&amp;quot;&lt;br /&gt;arguments:Array&amp;#65292;&amp;#38750;&amp;#24517;&amp;#22635;&amp;#38917;&amp;#30446;&amp;#65292;&amp;#35201;&amp;#20659;&amp;#36958;&amp;#32102;AIR&amp;#30340;&amp;#21443;&amp;#25976;&amp;#65292;&amp;#36889;&amp;#21443;&amp;#25976;&amp;#26371;&amp;#34987;AIR&amp;#20839;&amp;#30340;&lt;br /&gt;BrowserInvokeEvent.BROWSER_INVOKE&amp;#20107;&amp;#20214;&amp;#25152;&amp;#25509;&amp;#25910;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.Browser 啟動已安裝AIR APP&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;airSWF.launchApplication(appID, pubID, myArguments);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;六.Browser傳遞參數給AIR App&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;airSWF.launchApplication(appID, pubID, myArguments);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;只要將傳遞的參數放到myArguments陣列內即可&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-4424368438369886538?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/4424368438369886538/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=4424368438369886538' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4424368438369886538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4424368438369886538'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/12/air.html' title='網頁與AIR程式互動'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-4777426188727670566</id><published>2010-12-09T12:22:00.002+08:00</published><updated>2010-12-09T12:25:17.094+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>List物件客製CellRenderer與設定背景顏色</title><content type='html'>在使用List或DataGrid物件，如果需要自行設計CellRenderer，例如加入圖片，底圖或使用多文字框，以下是自訂CellRender操作流程&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;一.自訂 CellRenderer Class&lt;/font&gt;&lt;br /&gt;自訂CellRenderer必須繼承Sprite或MovieClip且實作ICellRenderer介面&lt;br /&gt;因此一個自訂的CellRenderer Class基本上一定具備以下結構&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class ItemRenderer extends Sprite implements ICellRenderer{&lt;br /&gt;    private var _listData:ListData; &lt;br /&gt;    private var _data:Object; &lt;br /&gt;    private var _selected:Boolean; &lt;br /&gt;    public function ItemRenderer() {}&lt;br /&gt;    public function set data(d:Object):void { &lt;br /&gt;    }&lt;br /&gt;    public function get data():Object { &lt;br /&gt;        return _data; &lt;br /&gt;    } &lt;br /&gt;    public function set listData(ld:ListData):void { &lt;br /&gt;        trace(&amp;quot;ListData=&amp;quot; + ld.label);&lt;br /&gt;        _listData = ld; &lt;br /&gt;    } &lt;br /&gt;    public function get listData():ListData { &lt;br /&gt;        return _listData; &lt;br /&gt;    } &lt;br /&gt;    public function set selected(s:Boolean):void { &lt;br /&gt;        _selected = s;             &lt;br /&gt;    } &lt;br /&gt;    public function get selected():Boolean { &lt;br /&gt;        return _selected; &lt;br /&gt;    } &lt;br /&gt;    public function setSize(width:Number, height:Number):void { } &lt;br /&gt;    public function setStyle(style:String, value:Object):void { } &lt;br /&gt;    public function setMouseState(state:String):void{ } &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;雖然自訂的CellRenderer可以直接繼承自系統的CellRenderer，但最好還是實作ICellRenderer介面，可以有比較大的彈性應用&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.在Flash IDE上產生Instance&lt;/font&gt;&lt;br /&gt;在Flash IDE上，依照需要設計產生CellRender所要對應的Symbol&lt;br /&gt;並在Library內設定該Symble的Linkage&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Class:&amp;#23436;&amp;#25972;&amp;#30340;CellRenderer Class&amp;#21517;&amp;#31281;&lt;br /&gt;base Class:flash.display.MovieClip&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.List利用setStyle指定cellRenderer Class&lt;/font&gt;&lt;br /&gt;當已經設計好CellRenderer Class並在fla上產生好Symbol&lt;br /&gt;執行&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;list.setStyle(&amp;quot;cellRenderer&amp;quot;, ItemRendererClass);&lt;br /&gt;(ItemRendererClass&amp;#26159;&amp;#33258;&amp;#35330;&amp;#30340;Renderer Class)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;即可讓list使用你自訂的CellRenderer &lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.List加入資料&lt;/font&gt;&lt;br /&gt;將要提供給cellRenderer用的資料以物件芳式包裝好，再以addItem()加入，這樣CellRenderer內的 set data(obj:Object)即會收到所傳入的物件&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var obj=new Object();&lt;br /&gt;obj.id=xxx;&lt;br /&gt;obj.thumb=xxx;...&lt;br /&gt;list.addItem(obj)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.CellRenderer內各Method說明&lt;/font&gt; &lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.data&lt;/font&gt;&lt;br /&gt;當list以addItem將資料加入後，會自動執行set data()&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;#22312;list&amp;#19978;&lt;br /&gt;list.addItem(_itemObj);    &lt;br /&gt;&amp;#22312;renderer&amp;#19978;&amp;#26371;&amp;#35320;&amp;#30332;&lt;br /&gt;public function set data(d:Object):void { &lt;br /&gt;    //--d&amp;#21363;&amp;#26159;addItem&amp;#25152;&amp;#24118;&amp;#30340;_itemObj&lt;br /&gt;    //--&amp;#21033;&amp;#29992;d&amp;#24118;&amp;#36914;&amp;#20358;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#65292;&amp;#39023;&amp;#31034;&amp;#22312;&amp;#20320;&amp;#35201;&amp;#39023;&amp;#31034;&amp;#30340;&amp;#25991;&amp;#23383;&amp;#26694;&amp;#25110;&amp;#22294;&amp;#29255;--&lt;br /&gt;}        &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.listdata&lt;/font&gt; &lt;br /&gt;當list.addItem(_itemObj);也同時會觸發renderer內的這個listData method&lt;br /&gt;set listData(ld:ListData)內的ld為一個ListData物件,包含了這個renderer在List內的相關資訊&lt;br /&gt;例如ld.index即是這個render在list內所在位置的index值&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;3.selected&lt;/font&gt;&lt;br /&gt;當render的選取狀態有變化時會觸發這個method，也就是說當使用者在list上click item&lt;br /&gt;如果這個item被選取時，selected(s:Boolean)&lt;br /&gt;s會得到true，若在非選取狀態，則為false&lt;br /&gt;在這裡可利用s值，改變render顯示的樣式，顯示物件選取狀態&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;4.setSize&lt;/font&gt;&lt;br /&gt;只要是在list上做關於size改變的設定，例如&lt;br /&gt;list.setSize()或設定list.rowHeight，都會把在list上設定的大小值&lt;br /&gt;傳給render的setSize()，你可以在這method內依照傳進來的值&lt;br /&gt;調整render內物件的大小   &lt;br /&gt;&lt;font color='red'&gt;5.setStyle&lt;/font&gt;&lt;br /&gt;可用來設定CellRender的顯示樣式，若不想做任何處理，保持空的即可&lt;br /&gt;但一定要保留這method在Class內&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;6.setMouseState&lt;/font&gt;&lt;br /&gt;可用來設定CellRender的滑鼠狀態，若不想做任何處理，保持空的即可&lt;br /&gt;但一定要保留這method在Class內&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;六.設定List的背景色&lt;/font&gt;&lt;br /&gt;List本身並無backgroundColor的選項可供改變List的底色，使用serStyle("backgroundColor")也是無效，若要改變底色需要設定的是"skin"的style，並傳入一個你要當作背景的物件當作傳入值&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var bg:Sprite = new Sprite();&lt;br /&gt;bg.graphics.beginFill(0xff0000,0.5);&lt;br /&gt;bg.graphics.drawRect(0, 0, 10, 10);&lt;br /&gt;bg.graphics.endFill();&lt;br /&gt;list.setStyle(&amp;quot;skin&amp;quot;, bg);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;註:skin style預設是List_Skin這Class&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-4777426188727670566?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/4777426188727670566/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=4777426188727670566' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4777426188727670566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4777426188727670566'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/12/listcellrenderer.html' title='List物件客製CellRenderer與設定背景顏色'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7339851061445393634</id><published>2010-11-02T11:35:00.007+08:00</published><updated>2010-11-22T12:01:05.231+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Service-幾種應用範例(二)</title><content type='html'>&lt;font color='blue'&gt;一.實作要點&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.說明&lt;/font&gt;&lt;br /&gt;Service提供兩種的使用方式，如果Client只是透過startService去執行Service的功能，只是把要做的功能寫在onStartCommand內即可，若是Client透過bindService來執行Service，就需要在Service內產生Ibinder物件，讓onBind可以把binder物件傳給Client，讓Client可以由取到的binder物件再取到Service物件，然後就可以呼叫Service上提供的method &lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;2.Activity(使用Service的Client)&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.extends Activity&amp;#29289;&amp;#20214;&lt;br /&gt;2.&amp;#23526;&amp;#20570;ServiceConnection(&amp;#38656;&amp;#35201;bindService&amp;#26178;&amp;#20351;&amp;#29992;)&lt;br /&gt;  &amp;#23526;&amp;#20570;&amp;#20006;&amp;#29986;&amp;#29983;&amp;#19968;&amp;#20491;connection instance&amp;#65292;&amp;#22312;connection&amp;#20839;&lt;br /&gt;  override&amp;#20854;onServiceConnected(ComponentName className, IBinder service)&lt;br /&gt;  &amp;#33287;onServiceDisconnected(ComponentName className)&lt;br /&gt;&lt;br /&gt;3.onServiceConnected&amp;#34987;&amp;#33258;&amp;#21205;&amp;#21628;&amp;#21483;(&amp;#38656;&amp;#35201;bindService&amp;#26178;&amp;#20351;&amp;#29992;)&lt;br /&gt;  &amp;#22312;&amp;#33287;Service&amp;#36899;&amp;#32218;&amp;#25104;&amp;#21151;&amp;#24460;&amp;#65292;onServiceConnected&amp;#26371;&amp;#34987;&amp;#33258;&amp;#21205;&amp;#21628;&lt;br /&gt;  &amp;#21483;&amp;#20006;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#30001;Service&amp;#20839;&amp;#37096;onBinder&amp;#25152;&amp;#30332;&amp;#36865;&amp;#20986;&amp;#20358;&amp;#30340;IBinder&amp;#29289;&amp;#20214;&amp;#65292;&lt;br /&gt;  &amp;#36890;&amp;#24120;&amp;#26371;&amp;#26159;extends &amp;#33258;Binder&lt;br /&gt;4.&amp;#21462;&amp;#24471;Service&amp;#29289;&amp;#20214;(&amp;#38656;&amp;#35201;bindService&amp;#26178;&amp;#20351;&amp;#29992;)&lt;br /&gt;  &amp;#23559;&amp;#21462;&amp;#24471;&amp;#30340;Binder&amp;#29289;&amp;#20214;&amp;#21628;&amp;#21483;&amp;#20854;Class&amp;#20839;&amp;#23450;&amp;#32681;&amp;#30340;&amp;#26041;&amp;#27861;(&amp;#22914;getService)&lt;br /&gt;  &amp;#20358;&amp;#21462;&amp;#24471;Service&amp;#29289;&amp;#20214;&amp;#65292;&amp;#22914;Service(binder.getService())&lt;br /&gt;5.&amp;#21033;&amp;#29992;&amp;#21462;&amp;#24471;&amp;#30340;Service&amp;#21628;&amp;#21483;&amp;#22519;&amp;#34892;&amp;#20013;Service&amp;#19978;&amp;#30340;public method&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;3.Service(提供服務的元件)&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.extends Service&amp;#29289;&amp;#20214;&lt;br /&gt;2.&amp;#35373;&amp;#35336;binder class extends Binder(&amp;#38656;&amp;#35201;bindService&amp;#26178;&amp;#20351;&amp;#29992;)&lt;br /&gt;  &amp;#35373;&amp;#35336;&amp;#19968;&amp;#20491;&amp;#20839;&amp;#37096;Binder Clas&amp;#20006;&amp;#29986;&amp;#29983;binder instance&amp;#65292;&amp;#22312;class&amp;#20839;&lt;br /&gt;  &amp;#24314;&amp;#31435;getService function,&amp;#21487;&amp;#20197;&amp;#36879;&amp;#36942;&amp;#36889;binder&amp;#21462;&amp;#24471;&amp;#25152;&amp;#22312;&amp;#30340;service&lt;br /&gt;3.overrider onBinder function(&amp;#38656;&amp;#35201;bindService&amp;#26178;&amp;#20351;&amp;#29992;)&lt;br /&gt;  &amp;#23559;&amp;#24050;&amp;#24314;&amp;#31435;&amp;#30340;binder instance&amp;#20659;&amp;#20986;&amp;#21435;&lt;br /&gt;4.override onStartCommand(&amp;#38656;&amp;#35201;&amp;#29992;startService&amp;#26178;&amp;#20351;&amp;#29992;)&lt;br /&gt;  &amp;#33509;&amp;#21482;&amp;#29992;startService&amp;#21855;&amp;#21205;Service&amp;#65292;&amp;#21482;&amp;#38656;&amp;#35201;override&amp;#36889;&lt;br /&gt;  function&amp;#21363;&amp;#21487;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Sample:LocalService 使用startService&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.說明&lt;/font&gt;&lt;br /&gt;透過startService呼叫Service會執行Service內部的onStartCommand()，所以把要執行的工作放在override的onStartCommand()內&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;2.Activity&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Intent intent = new Intent(this, MusicService.class);&lt;br /&gt;intent.putExtra(&amp;quot;songPath&amp;quot;,&amp;quot;sdcard/mp3/mySong.mp3&amp;quot;);&lt;br /&gt;this.startService(intent);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;3.Service&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@Override&lt;br /&gt;public void onCreate() {    &lt;br /&gt;    super.onCreate();&lt;br /&gt;    mp=new MediaPlayer();    &lt;br /&gt;}&lt;br /&gt;@Override&lt;br /&gt;public void onStart(Intent intent, int startId) {&lt;br /&gt;    super.onStart(intent, startId);&lt;br /&gt;    String songPath=intent.getExtras().getString(&amp;quot;songPath&amp;quot;);&lt;br /&gt;    try{&lt;br /&gt;        mp.setDataSource(_path);&lt;br /&gt;        mp.prepare();&lt;br /&gt;        mp.start();&lt;br /&gt;    }catch(Exception e){};&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Sample:LocalService 使用bindService&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.說明&lt;/font&gt;&lt;br /&gt;透過bind方式要執行Service上的功能，是透過建立連線物件後，再直接對Service做操作，要做的工作就寫成Service內public method 讓人呼叫執行&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;2.Activity&lt;/font&gt;  &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;private MusicService mService;&lt;br /&gt;@Override&lt;br /&gt;public void onCreate(Bundle _state){&lt;br /&gt;    doBindService()&lt;br /&gt;}&lt;br /&gt;private void doBindService(){&lt;br /&gt;    Intent intent = new Intent(MyActivity.this, MusicService.class);&lt;br /&gt;    bindService(intent, connc,Context.BIND_AUTO_CREATE);&lt;br /&gt;}&lt;br /&gt;private ServiceConnection connc=new ServiceConnection() {            &lt;br /&gt;    @Override&lt;br /&gt;    public void onServiceDisconnected(ComponentName name) {    &lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public void onServiceConnected(ComponentName name, IBinder service) {        &lt;br /&gt;        mService=((MusicService.LocalBinder)service).getService();        &lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;要使用service上的function就可以直接用，如 mService.start()，mService.stop()...等定義在Service內public的方法。若要取得回傳值,只要service內的function有回傳值,直接接收就可以了，例如&lt;br /&gt;String _path=mService.getSongPath();&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;3.Service&lt;/font&gt;&lt;br /&gt;內定義一個內部Binder class可以用來取得service&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class LocalBinder extends Binder {&lt;br /&gt;     MusicService getService() {&lt;br /&gt;        return  MusicService.this;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;private final IBinder mBinder = new LocalBinder();&lt;br /&gt;@Override&lt;br /&gt;public IBinder onBind(Intent intent) {    &lt;br /&gt;    return mBinder;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7339851061445393634?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7339851061445393634/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7339851061445393634' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7339851061445393634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7339851061445393634'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/11/android-service_02.html' title='Android Service-幾種應用範例(二)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-9145631087925060107</id><published>2010-11-01T18:13:00.004+08:00</published><updated>2010-11-22T12:00:28.224+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Service-概念(一)</title><content type='html'>&lt;font color='blue'&gt;一.說明&lt;/font&gt;&lt;br /&gt;Service本身是個無介面，只單純提供功能讓其他元件(Activity)呼叫使用的元件，如果有需要長時間執行的獨立程序，可以寫成Service元件提供其他人呼叫使用。&lt;br /&gt;&lt;br /&gt;Service本身並非一個獨立的Process，也不會脫離Main Thread獨立運作，如果需要做長時間的CPU運算，為了不影響到主程式運作，可以在Service內產生Thread，讓thread幫你作一些工作，Service的子類別IntentService即是一個有自己Thread 的Service，服務給並無直接與使用者互動的介面。 &lt;br /&gt;當Service元件被產生時，一定會執行其onCreate(),如果有需要產生Thread，則在這裡去產生新的thread&lt;br /&gt;&lt;br /&gt;當Service有設定在Manifest上，就可以被自己與其他的App來做存取，其他App要使用service，需在他自己App的Manifest內的uses-permission作宣告&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.執行Service功能的兩種方式&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.startService&lt;/font&gt;&lt;br /&gt;當有元件呼叫Context.startService()，系統會讀取被呼叫的Service(產生instance並執行其onCreate())，然後將client所傳進來的intent帶進Service的onStartCommand(Intent, int, int)內。這service會一直執行，直到有人呼叫Context.stopService()或內部呼叫stopSelf()而停止。&lt;br /&gt;&lt;br /&gt;無論Context.startService()被呼叫了多少次，如果要停止Service，只要執行一次Context.stopService()，或在Service內執行stopSelf()，就會被停止。&lt;br /&gt;如果是在Service內使用stopSelf(int)，可以保證intent已經有被處理了，才會被停止。&lt;br /&gt;&lt;br /&gt;對於已被啟動的Service，如果需要有不同的Service執行模式，可以在override onStartCommand()時，設定不同的回傳值。這回傳值常數已經被定義好在Service Class內&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.START_STICKY:&lt;br /&gt;  &amp;#30070;Service&amp;#22312;&amp;#22519;&amp;#34892;&amp;#26178;&amp;#34987;&amp;#30733;&amp;#25481;&amp;#24460;&amp;#65292;&amp;#33509;&amp;#27794;&amp;#26377;&amp;#26032;&amp;#30340;intent&amp;#36914;&amp;#20358;&amp;#65292;&lt;br /&gt;  Service&amp;#26371;&amp;#20572;&amp;#30041;&amp;#22312;started state&amp;#65292;&amp;#20294;intent&amp;#36039;&amp;#26009;&amp;#19981;&amp;#26371;&amp;#34987;&amp;#20445;&amp;#30041;&lt;br /&gt;2.START_NOT_STICKY&amp;#25110;START_REDELIVER_INTENT:&lt;br /&gt;  &amp;#30070;Service&amp;#22312;&amp;#22519;&amp;#34892;&amp;#26178;&amp;#34987;&amp;#30733;&amp;#25481;&amp;#24460;&amp;#65292;&amp;#33509;&amp;#27794;&amp;#26377;&amp;#26032;&amp;#30340;intent&amp;#36914;&amp;#20358;&amp;#65292;&lt;br /&gt;  service&amp;#26371;&amp;#38626;&amp;#38283;started  state&amp;#65292;&amp;#33509;&amp;#27794;&amp;#26377;&amp;#24456;&amp;#26126;&amp;#30906;&amp;#30340;&amp;#20877;&amp;#21855;&amp;#21205;&amp;#65292;&lt;br /&gt;  &amp;#23559;&amp;#19981;&amp;#26371;&amp;#29986;&amp;#29983;&amp;#26032;&amp;#30340;service&amp;#29289;&amp;#20214;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.bindService&lt;/font&gt;&lt;br /&gt;Client可以利用Context.bindService() 去建立與service持續性的連線，&lt;br /&gt;如果建立連線時，還沒產生Service instance，會自動產生並呼叫執行onCreate。與startService不同的地方是，接下來並不會呼叫onStartCommand&lt;br /&gt;&lt;br /&gt;要執行bindService，首先要先建立一個serviceConnection物件，把這conection物件當作參數放到bindService內讓Context與Service建立連線，Context.bindService(Intent service, ServiceConnection conn, int flags)&lt;br /&gt;flags參數預設是Context.BIND_AUTO_CREATE,也就是bind的時候會自動產生service&lt;br /&gt;&lt;br /&gt;當連線成功後,會自動呼叫執行這個connection內的onServiceConnected(ComponentName className, IBinder service) function，在這function會接收到由service內的onBinde()所丟出來的Ibinder物件&lt;br /&gt;利用這IBinder物件取得Service物件，就可以直接操作Service內各個public 的method &lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Service Process重要性判斷&lt;/font&gt;&lt;br /&gt;系統會盡量保持Service的Process運作，但若需要刪除Process，以下是重要性判斷準則&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#27491;&amp;#22312;&amp;#22519;&amp;#34892;onCreate(), onStartCommand()&amp;#25110;onDestroy()&amp;#30340;&lt;br /&gt;  Service&amp;#26371;&amp;#34987;&amp;#30070;&amp;#25104;&amp;#21069;&amp;#26223;&amp;#22519;&amp;#34892;&amp;#31243;&amp;#24207;&amp;#65292;&amp;#19981;&amp;#26371;&amp;#34987;&amp;#21034;&amp;#38500;&lt;br /&gt;2.&amp;#20551;&amp;#33509;&amp;#36889;ervice&amp;#24050;&amp;#32147;&amp;#34987;&amp;#21855;&amp;#21205;(started)&amp;#65292;&amp;#37027;&amp;#36889;service&amp;#25152;&amp;#22312;&amp;#30340;&lt;br /&gt;  process&amp;#30340;&amp;#37325;&amp;#35201;&amp;#24615;,&amp;#26371;&amp;#26159;&amp;#22312;visible process&amp;#33287;hide process&amp;#20043;&amp;#38291;&lt;br /&gt;3.&amp;#22914;&amp;#26524;service&amp;#25152;&amp;#22312;&amp;#30340;Process&amp;#19978;&amp;#26377;&amp;#20803;&amp;#20214;&amp;#26159;visible&amp;#65292;&amp;#37027;&amp;#36889;Service&lt;br /&gt;  &amp;#30340;&amp;#37325;&amp;#35201;&amp;#24615;&amp;#23601;&amp;#30456;&amp;#30070;&amp;#26044;&amp;#26159;visible&lt;br /&gt;4.&amp;#19968;&amp;#20491;&amp;#24050;&amp;#32147;started&amp;#30340;service&amp;#21487;&amp;#20197;&amp;#21033;&amp;#29992;&lt;br /&gt;  startForeground(int,Notification)&amp;#25918;&amp;#22312;&amp;#27604;&amp;#36611;&amp;#37325;&amp;#35201;&amp;#30340;&lt;br /&gt;  &amp;#21069;&amp;#26223;&amp;#22519;&amp;#34892;&amp;#29376;&amp;#24907;&amp;#65292;&amp;#22312;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#23569;&amp;#30340;&amp;#26178;&amp;#20505;&amp;#27604;&amp;#36611;&amp;#19981;&amp;#26371;&amp;#34987;&amp;#21034;&amp;#38500;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;當記憶體不足Service被刪除後，它稍後還是會被重新啟動產生出來，但通常重新啟動後，原本的intent並不會被保留，如果需要在重新啟動後，再重發intent給Service，必須在override onStartCommand()時return START_REDELIVER_INTENT讓重新啟動的程序裡的onStartCommand(Intent intent, int flags, int startId)內的flags值＝START_FLAG_REDELIVERY&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-9145631087925060107?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/9145631087925060107/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=9145631087925060107' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9145631087925060107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9145631087925060107'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/11/android-service.html' title='Android Service-概念(一)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1923960650568745592</id><published>2010-11-01T12:56:00.007+08:00</published><updated>2010-11-22T11:59:23.667+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android 資料儲存</title><content type='html'>&lt;font color='blue'&gt;一.資料儲存方式&lt;/font&gt;&lt;br /&gt;在Android內要保存資料，有以下幾種方式可以選擇&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.SharedPreferences&lt;br /&gt;    &amp;#20197;key-value&amp;#26041;&amp;#24335;&amp;#20786;&amp;#23384;&amp;#21482;&amp;#26377;Private data&lt;br /&gt;2.Internal Storage&lt;br /&gt;    &amp;#20351;&amp;#29992;device&amp;#20839;&amp;#37096;&amp;#30340;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#20786;&amp;#23384;Private data&lt;br /&gt;3.External Storage&lt;br /&gt;    &amp;#20351;&amp;#29992;&amp;#22914;SD&amp;#21345;&amp;#36889;&amp;#27171;&amp;#30340;&amp;#22806;&amp;#37096;&amp;#20786;&amp;#23384;&amp;#23186;&amp;#20171;&amp;#65292;&amp;#20786;&amp;#23384;Public data&lt;br /&gt;4.SQLite Databases&lt;br /&gt;    &amp;#20197;&amp;#36039;&amp;#26009;&amp;#24235;&amp;#32080;&amp;#27083;&amp;#20786;&amp;#23384;private data&lt;br /&gt;5.Network Connection&lt;br /&gt;    &amp;#20786;&amp;#23384;&amp;#36039;&amp;#26009;&amp;#21040;&amp;#32178;&amp;#36335;&amp;#20027;&amp;#27231;&amp;#19978;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;對於Private Data，在Android利用 Content Providers Class來作存取&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.SharedPreferences&lt;/font&gt; &lt;br /&gt;利用 SharedPreferences Class可以將基本型別的資料(boolean,string,float,int..)以key-value方式作存取，data會持續保留在user session,即使app被砍了，資料還是保留著&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.取得SharedPreferences的兩種方式&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#38656;&amp;#35201;&amp;#29992;&amp;#21040;&amp;#22810;&amp;#20491;Preference&amp;#30340;&amp;#29376;&amp;#27841;&lt;br /&gt;  getSharedPreferences(name):&amp;#22914;&amp;#26524;&amp;#38656;&amp;#35201;&amp;#29992;&amp;#21040;&amp;#22810;&amp;#20491;&lt;br /&gt;  preference file&amp;#20786;&amp;#23384;,&amp;#21033;&amp;#29992;name&amp;#20358;&amp;#21462;&amp;#24471;&lt;br /&gt;  &amp;#20363;:&lt;br /&gt;  SharedPreferences settings = Context.getSharedPreferences(&amp;quot;myPre&amp;quot;, 0);&lt;br /&gt;2.&amp;#21482;&amp;#38656;&amp;#35201;&amp;#29992;&amp;#21040;&amp;#19968;&amp;#20491;Preference&lt;br /&gt;  Activity.getPreferences(int mode):&amp;#22914;&amp;#26524;&amp;#20320;&amp;#30340;Activity&lt;br /&gt;  &amp;#21482;&amp;#26371;&amp;#29992;&amp;#21040;&amp;#19968;&amp;#20491;preference&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.寫入preference的流程&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#21628;&amp;#21483;edit()&amp;#21462;&amp;#24471;SharedPreferences.Editor&lt;br /&gt;    SharedPreferences settings = getSharedPreferences(&amp;quot;myPre&amp;quot;, 0);&lt;br /&gt;    SharedPreferences.Editor editor = settings.edit();&lt;br /&gt;2.&amp;#21033;&amp;#29992;&amp;#20197;&amp;#19979;method&amp;#25226;&amp;#20540;&amp;#23531;&amp;#20837;putBoolean() and putString()&lt;br /&gt;    editor.putString(&amp;quot;myStr&amp;quot;, &amp;quot;strValue&amp;quot;);&lt;br /&gt;3.&amp;#20351;&amp;#29992;commit()&amp;#25226;&amp;#25913;&amp;#35722;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#30495;&amp;#27491;&amp;#23531;&amp;#20837;&lt;br /&gt;    editor.commit();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;3.讀取Preference值&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;#20351;&amp;#29992;SharedPreferences&amp;#30340;getBoolean()&amp;#12289;getString()&amp;#31561;method&lt;br /&gt;String str = settings.getString(&amp;quot;myStr&amp;quot;,&amp;quot;defaultStr&amp;quot;);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;4.範例&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class Calc extends Activity {&lt;br /&gt;    public static final String PREFS_NAME = &amp;quot;MyPrefsFile&amp;quot;;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected void onCreate(Bundle state){         &lt;br /&gt;       super.onCreate(state);&lt;br /&gt;       . . .&lt;br /&gt;       // Restore preferences&lt;br /&gt;       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);&lt;br /&gt;       boolean silent = settings.getBoolean(&amp;quot;silentMode&amp;quot;, false);&lt;br /&gt;       setSilent(silent);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected void onStop(){&lt;br /&gt;       super.onStop();&lt;br /&gt;      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);&lt;br /&gt;      SharedPreferences.Editor editor = settings.edit();&lt;br /&gt;      editor.putBoolean(&amp;quot;silentMode&amp;quot;, mSilentMode);&lt;br /&gt;      editor.commit();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Internal Storage&lt;/font&gt;&lt;br /&gt;你可以把資料直接儲存在device的內存,預設儲存在內存的檔案是只有該App可讀取，其他App無法讀取,當App移除時,這資料會一併被移除&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.在內存產生一個private file，寫入資料流程&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#25552;&amp;#20379;&amp;#19968;&amp;#20491;&amp;#27284;&amp;#26696;&amp;#21517;&amp;#31281;&amp;#20358;&amp;#21628;&amp;#21483;openFileOutput(name)&lt;br /&gt;  &amp;#21462;&amp;#24471;FileOutputStream&amp;#29289;&amp;#20214;(Context&amp;#30340;method)&lt;br /&gt;2.FileOutputStream&amp;#29289;&amp;#20214;&amp;#20351;&amp;#29992;write()&amp;#23531;&amp;#20837;&amp;#36039;&amp;#26009;    &lt;br /&gt;3.FileOutputStream&amp;#29289;&amp;#20214;&amp;#20351;&amp;#29992;close()&amp;#38364;&amp;#38281;&amp;#27284;&amp;#26696;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;String FILENAME = &amp;quot;hello_file&amp;quot;;&lt;br /&gt;String string = &amp;quot;hello world!&amp;quot;;&lt;br /&gt;&lt;br /&gt;FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);&lt;br /&gt;fos.write(string.getBytes());&lt;br /&gt;fos.close();&lt;br /&gt;&amp;#31684;&amp;#20363;&amp;#35041;&amp;#30340;&amp;#21443;&amp;#25976;MODE_PRIVATE&amp;#26159;&amp;#25351;&amp;#30070;&amp;#26377;&amp;#21516;&amp;#21517;&amp;#27284;&amp;#26696;&amp;#26371;&amp;#33258;&amp;#21205;&amp;#35206;&amp;#33995;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.由內存讀取檔案資料&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#25552;&amp;#20379;&amp;#27284;&amp;#21517;&amp;#21628;&amp;#21483;openFileInput(name)&amp;#20358;&amp;#21462;&amp;#24471;&lt;br /&gt;  FileInputStream&amp;#29289;&amp;#20214;&lt;br /&gt;2.FileInputStream&amp;#29289;&amp;#20214;&amp;#20351;&amp;#29992;read()&amp;#35712;&amp;#21462;bytes&amp;#36039;&amp;#26009;&lt;br /&gt;3.FileInputStream&amp;#29289;&amp;#20214;&amp;#20351;&amp;#29992;close()&amp;#38364;&amp;#38281;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;3.使用暫存&lt;/font&gt;&lt;br /&gt;若只是暫存資料，而不是永久存檔可以利用getCacheDir()來取得一個File物件當作暫存檔，當系統內存不足時，這些cacheFile就會被刪除，使用暫存檔需要自己時時去清理 &lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;4.其他method&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.getFilesDir()&lt;br /&gt;    &amp;#21462;&amp;#24471;&amp;#20839;&amp;#23384;&amp;#22312;&amp;#27284;&amp;#26696;&amp;#31995;&amp;#32113;&amp;#30340;&amp;#30446;&amp;#37636;&amp;#32085;&amp;#23565;&amp;#36335;&amp;#24465;&lt;br /&gt;2.getDir()&lt;br /&gt;    &amp;#22312;&amp;#20839;&amp;#23384;&amp;#31354;&amp;#38291;&amp;#24314;&amp;#31435;&amp;#30446;&amp;#37636;&amp;#25110;&amp;#38283;&amp;#21855;&amp;#24050;&amp;#23384;&amp;#22312;&amp;#30446;&amp;#37636;&lt;br /&gt;3.deleteFile()&lt;br /&gt;    &amp;#21034;&amp;#38500;&amp;#20839;&amp;#23384;&amp;#27284;&amp;#26696;&lt;br /&gt;4.fileList()&lt;br /&gt;    &amp;#21462;&amp;#24471;&amp;#30446;&amp;#21069;App&amp;#22312;&amp;#20839;&amp;#23384;&amp;#25152;&amp;#20786;&amp;#23384;&amp;#30340;&amp;#27284;&amp;#26696;&amp;#28165;&amp;#21934;Array&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.External Storage&lt;/font&gt;&lt;br /&gt;所有Android相容device均支援利用外部儲存裝置來儲存檔案(如SD卡)，&lt;br /&gt;使用者利用USB即可將資料傳輸到電腦內&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.檢查外存媒介是否存在&lt;/font&gt;&lt;br /&gt;在使用外存之前都需先用getExternalStorageState()檢查外存媒介是否存在&lt;br /&gt;&lt;br /&gt;例 &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;String state = Environment.getExternalStorageState();&lt;br /&gt;if (Environment.MEDIA_MOUNTED.equals(state)) {&lt;br /&gt;    //&amp;#21487;&amp;#20197;&amp;#23565;media&amp;#20316;&amp;#35712;&amp;#23531;&lt;br /&gt;} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {&lt;br /&gt;    //&amp;#21482;&amp;#21487;&amp;#20197;&amp;#23565;media&amp;#20316;&amp;#35712;&amp;#21462;&lt;br /&gt;} else {&lt;br /&gt;    //&amp;#28961;&amp;#27861;&amp;#20316;&amp;#35712;&amp;#23531;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.讀取外存檔案&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.API level8&lt;br /&gt;  &amp;#20351;&amp;#29992; Context.getExternalFilesDir(String type)&amp;#21462;&amp;#24471;&amp;#19968;&amp;#20491;&amp;#30446;&amp;#37636;&amp;#30340;&lt;br /&gt;  File&amp;#29289;&amp;#20214;&amp;#65292;&amp;#36889;method&amp;#30340;type&amp;#21443;&amp;#25976;&amp;#65292;&amp;#26159;&amp;#25351;&amp;#23450;&amp;#23376;&amp;#30446;&amp;#37636;&amp;#30340;&amp;#39006;&amp;#22411;&amp;#65292;&lt;br /&gt;  &amp;#22914;DIRECTORY_MUSIC,DIRECTORY_RINGTONES&amp;#25110;&amp;#20659;&amp;#20837;null&amp;#21462;&amp;#24471;&lt;br /&gt;  App root&amp;#30446;&amp;#37636;&amp;#65292;&amp;#20877;&amp;#36879;&amp;#36942;File&amp;#21462;&amp;#24471;&amp;#27284;&amp;#26696;&amp;#65292;&amp;#22914;&amp;#26524;&amp;#27284;&amp;#26696;&amp;#24050;&amp;#32147;&amp;#23384;&amp;#22312;&amp;#21063;&amp;#26371;&amp;#25171;&amp;#38283;&lt;br /&gt;  &amp;#35442;&amp;#27284;&amp;#26696;&amp;#12290;&amp;#21033;&amp;#29992;&amp;#36889;method&amp;#21487;&amp;#30452;&amp;#25509;&amp;#24314;&amp;#31435;&amp;#30446;&amp;#37636;,&amp;#30070;App&amp;#31227;&amp;#38500;&amp;#26178;&amp;#65292;&amp;#30446;&amp;#37636;&amp;#26371;&amp;#36319;&amp;#33879;&lt;br /&gt;  &amp;#31227;&amp;#38500;    &lt;br /&gt;    &lt;br /&gt;  &amp;#20363;&lt;br /&gt;  File path=Context.getExternalFilesDir(null);&lt;br /&gt;  File file=new File(path,&amp;quot;mypic.jpg&amp;quot;)    &lt;br /&gt;2.API Level 7&amp;#20197;&amp;#19979;&amp;#29256;&amp;#26412;    &lt;br /&gt;  &amp;#21063;&amp;#29992;Environment.getExternalStorageDirectory()&amp;#21462;&amp;#24471;&amp;#26681;&amp;#30446;&amp;#37636;&amp;#30340;&lt;br /&gt;  File&amp;#29289;&amp;#20214;&amp;#65292;&amp;#20063;&amp;#23601;&amp;#26159;&amp;#35712;&amp;#21462;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#26371;&amp;#26159;&amp;#22312;&lt;br /&gt;  /Android/data/package_name/files/&amp;#30446;&amp;#37636;&amp;#19979;&lt;br /&gt;  package_name&amp;#26159;&amp;#22914;&amp;#21516;com.example.android.app&amp;#30340;&amp;#21517;&amp;#31281;&lt;br /&gt;    &lt;br /&gt;  &amp;#20363;&lt;br /&gt;  File path=Environment.getExternalStorageDirectory()&lt;br /&gt;  File file=new File(path,&amp;quot;mypic.jpg&amp;quot;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;3.儲存檔案&lt;/font&gt;&lt;br /&gt;若要儲存檔案，不指定給特定App用，且希望在App移除時檔案不被刪除，&lt;br /&gt;請儲存到外存上的 Music/, Pictures/, Ringtones/等目錄&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.API Level 8&lt;br /&gt;  &amp;#20351;&amp;#29992;Context.getExternalStoragePublicDirectory(String type)&lt;br /&gt;  &amp;#21462;&amp;#24471;&amp;#30446;&amp;#37636;&amp;#30340;File&amp;#29289;&amp;#20214;&amp;#12290;&amp;#36889;method&amp;#30340;type&amp;#21443;&amp;#25976;&amp;#65292;&amp;#35373;&amp;#23450;&amp;#20540;&amp;#28858;&lt;br /&gt;  DIRECTORY_MUSIC, DIRECTORY_PICTURES,DIRECTORY_RINGTONES&amp;#65292;&lt;br /&gt;  &amp;#22914;&amp;#26524;&amp;#30446;&amp;#37636;&amp;#19981;&amp;#23384;&amp;#22312;&amp;#65292;&amp;#26371;&amp;#33258;&amp;#21205;&amp;#29986;&amp;#29983;&lt;br /&gt;    &lt;br /&gt;  &amp;#20363;&lt;br /&gt;  File path=Context.getExternalFilesDir(null);&lt;br /&gt;  File file=new File(path,&amp;quot;mypic.jpg&amp;quot;)&lt;br /&gt;2.API Level 7 &amp;#20197;&amp;#19979;&amp;#29256;&amp;#26412;&lt;br /&gt;  &amp;#20351;&amp;#29992;Environment.getExternalStorageDirectory()&amp;#21462;&amp;#24471;&amp;#26681;&amp;#30446;&amp;#37636;&amp;#30340;&lt;br /&gt;  File&amp;#29289;&amp;#20214;&amp;#12290;&amp;#20786;&amp;#23384;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#26371;&amp;#26159;&amp;#22312;&amp;#20197;&amp;#19979;&amp;#30340;&amp;#30446;&amp;#37636;&lt;br /&gt;  &lt;br /&gt;  Music/ - media scanner&amp;#26371;&amp;#25475;&amp;#25551;&amp;#36889;&amp;#35041;&amp;#25214;&amp;#38899;&amp;#27138;&amp;#27284;&lt;br /&gt;  Podcasts/ - media scanner&amp;#26371;&amp;#25475;&amp;#25551;&amp;#36889;&amp;#35041;&amp;#25214;podcast.&lt;br /&gt;  Ringtones/ - media scanner&amp;#26371;&amp;#25475;&amp;#25551;&amp;#36889;&amp;#35041;&amp;#25214;&amp;#38899;&amp;#27138;&amp;#25163;&amp;#27231;&amp;#27284;&amp;#37428;&amp;#32882;.&lt;br /&gt;  Alarms/ - media scanner&amp;#26371;&amp;#25475;&amp;#25551;&amp;#36889;&amp;#35041;&amp;#25214;alarm sound.&lt;br /&gt;  Notifications/ - media scanner&amp;#26371;&amp;#25475;&amp;#25551;&amp;#36889;&amp;#35041;&amp;#25214;notification sound.&lt;br /&gt;  Pictures/ - &amp;#25152;&amp;#26377;&amp;#29031;&amp;#29255;&amp;#21253;&amp;#25324;&amp;#30456;&amp;#27231;&amp;#25293;&amp;#30340;&amp;#37117;&amp;#22312;&amp;#36889;&amp;#35041;.&lt;br /&gt;  Movies/ - &amp;#25152;&amp;#26377;&amp;#24433;&amp;#29255;&amp;#21253;&amp;#25324;&amp;#30456;&amp;#27231;&amp;#25293;&amp;#30340;&amp;#37117;&amp;#22312;&amp;#36889;&amp;#35041;.&lt;br /&gt;  Download/ - &amp;#20854;&amp;#20182;&amp;#19979;&amp;#36617;&amp;#27284;&amp;#26696;.&lt;br /&gt;  &lt;br /&gt;  &amp;#20363;&lt;br /&gt;  File rootPath=Environment.getExternalStorageDirectory();&lt;br /&gt;  File path=new File( rootPath.getParent() + &amp;quot;/Music&amp;quot; );&lt;br /&gt;  File file=new File(path,&amp;quot;my.mp3&amp;quot;)  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;4.使用暫存&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.API Level 8&lt;br /&gt;  &amp;#20351;&amp;#29992;getExternalCacheDir() &amp;#38283;&amp;#21855;cache File,&amp;#30070;App&amp;#34987;&amp;#31227;&amp;#38500;&amp;#26178;&amp;#65292;&lt;br /&gt;  &amp;#27284;&amp;#26696;&amp;#20063;&amp;#26371;&amp;#34987;&amp;#33258;&amp;#21205;&amp;#31227;&amp;#38500;&amp;#65292;&amp;#20294;&amp;#22312;App&amp;#36996;&amp;#22312;&amp;#30340;&amp;#29376;&amp;#24907;&amp;#19979;&amp;#65292;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#35201;&amp;#33258;&amp;#24049;&amp;#31649;&lt;br /&gt;  &amp;#29702;&amp;#26283;&amp;#23384;&amp;#36991;&amp;#20813;&amp;#31354;&amp;#38291;&amp;#19981;&amp;#36275;&lt;br /&gt;2.API Level 7&amp;#20197;&amp;#19979;&amp;#29256;&amp;#26412;&lt;br /&gt;  &amp;#20351;&amp;#29992;getExternalStorageDirectory()&amp;#38283;&amp;#21855;cache File,&amp;#27284;&amp;#26696;&amp;#26371;&amp;#34987;&lt;br /&gt;  &amp;#25918;&amp;#22312;/Android/data/package_name/cache/&amp;#30446;&amp;#37636;&amp;#19979;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.使用資料庫&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;1.建立資料庫&lt;/font&gt;&lt;br /&gt;Android完全支援SQLite，在App內所有Class都可以透過name來使用DB&lt;br /&gt;要在Android內操作使用DB，可以建立SQLiteOpenHelper 的子類別&lt;br /&gt;並在override onCreate()內，建立產生所要的資料庫資料表&lt;br /&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class MyDbOpenHelper extends SQLiteOpenHelper {&lt;br /&gt;    private static final int DATABASE_VERSION = 2;&lt;br /&gt;    private static final String DICTIONARY_TABLE_NAME = &amp;quot;dictionary&amp;quot;;&lt;br /&gt;    private static final String DICTIONARY_TABLE_CREATE =&lt;br /&gt;                &amp;quot;CREATE TABLE &amp;quot; + DICTIONARY_TABLE_NAME + &amp;quot; (&amp;quot; +&lt;br /&gt;                KEY_WORD + &amp;quot; TEXT, &amp;quot; +&lt;br /&gt;                KEY_DEFINITION + &amp;quot; TEXT);&amp;quot;;&lt;br /&gt;&lt;br /&gt;    DictionaryOpenHelper(Context context) {&lt;br /&gt;        super(context, DATABASE_NAME, null, DATABASE_VERSION);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(SQLiteDatabase db) {&lt;br /&gt;        db.execSQL(DICTIONARY_TABLE_CREATE);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;2.資料庫存取&lt;/font&gt;&lt;br /&gt;透過實體化這Class透過呼叫 getWritableDatabase() and getReadableDatabase()取得&lt;br /&gt;SQLiteDatabase物件來對資料庫作讀寫，&lt;br /&gt;查詢動作使用SQLiteDatabase query()，&lt;br /&gt;若是比較複雜的查詢可以用SQLiteQueryBuilder,它會提供一些method來建立查詢&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;3.查詢結果&lt;/font&gt;&lt;br /&gt;每次SQLite 作查詢都會回傳一個Cursor,用來指到查詢結果，&lt;br /&gt;透過Cursor來瀏覽db資料&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;六.使用網路連線&lt;/font&gt;&lt;br /&gt;使用網路連線來將資料儲存於遠端的伺服器&lt;br /&gt;利用以下package提供的物件功能&lt;br /&gt;java.net.*&lt;br /&gt;android.net.*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1923960650568745592?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1923960650568745592/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1923960650568745592' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1923960650568745592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1923960650568745592'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/11/android.html' title='Android 資料儲存'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-9205175092182220210</id><published>2010-10-25T12:41:00.007+08:00</published><updated>2010-11-22T11:59:08.026+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Component Lifecycles - Broadcast Receiver(三)</title><content type='html'>&lt;font color='blue'&gt;一.Broadcast Receiver Lifecycle&lt;/font&gt;&lt;br /&gt;只有一個LifeCycle callback method&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;void onReceive(Context curContext, Intent broadcastMsg)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;當有訊息傳達到receiver,Android就會呼叫執行Receiver內的 onReceive()&lt;br /&gt;並把intent傳進去給onReceive()，只有在執行onReceive()時,receiver的狀態是active的,當執行完return後&lt;br /&gt;就會變成inactive狀態&lt;br /&gt;&lt;br /&gt;當receiver在active狀態時是被保護不被殺的，一旦執行完處於inactive狀態,則在任何時間要砍都可以&lt;br /&gt;記憶體不足時就可先砍掉這receiver&lt;br /&gt;&lt;br /&gt;receiver存在的一個隱藏性的危險是，如果當receiver要回應broadcast message，需要開啟一個新的thread去處理時,receiver在開啟thread後會立刻return(其實,處理程序還在運作)，receiver已經被當作是inactive狀態,隨時有可能會被砍掉。解決的方式是啟動一個service去處理要做的事,而不要在receiver內去開啟新的thread。&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Processes 重要性順序&lt;/font&gt;  &lt;br /&gt;Android系統會盡可能保留所有的process,但如果當記憶體不足時,就會需要砍掉一些較不重要的process。如何判斷process的重要性,以下為重要性順序&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1. foreground process:&amp;#20063;&amp;#23601;&amp;#26159;&amp;#27491;&amp;#22312;&amp;#36914;&amp;#34892;&amp;#20013;&amp;#30340;&amp;#31243;&amp;#24207;&lt;br /&gt;    1.&amp;#20351;&amp;#29992;&amp;#32773;&amp;#27491;&amp;#22312;&amp;#20114;&amp;#21205;&amp;#22519;&amp;#34892;&amp;#30340;Activity&lt;br /&gt;    2.&amp;#27491;&amp;#22312;&amp;#22519;&amp;#34892;&amp;#20013;Activity&amp;#25152;&amp;#27491;&amp;#22312;&amp;#21628;&amp;#21483;&amp;#36939;&amp;#20316;&amp;#30340;Service&lt;br /&gt;    3.Service&amp;#20839;&amp;#37096;&amp;#27491;&amp;#22312;&amp;#36914;&amp;#34892;&amp;#19981;&amp;#21487;&amp;#20013;&amp;#26039;&amp;#30340;callback&amp;#21253;&amp;#25324;onCreate() &lt;br /&gt;      onStart()&amp;#25110;onDestroy()&lt;br /&gt;    4.&amp;#27491;&amp;#22312;&amp;#22519;&amp;#34892;onReceive()&amp;#30340;BroadCast Receiver&amp;#29289;&amp;#20214;&lt;br /&gt;      &amp;#38500;&amp;#38750;&amp;#31995;&amp;#32113;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#24050;&amp;#32147;&amp;#22826;&amp;#20302;&amp;#22826;&amp;#20302;&amp;#65292;&amp;#21542;&amp;#21063;&amp;#31995;&amp;#21520;&amp;#32113;&amp;#19981;&amp;#22826;&amp;#21487;&amp;#33021;&amp;#25226;&amp;#27491;&amp;#22312;&lt;br /&gt;      &amp;#21069;&amp;#26223;&amp;#22519;&amp;#34892;&amp;#30340;&amp;#31243;&amp;#24207;&amp;#30733;&amp;#25481;&lt;br /&gt;2.visible process:&lt;br /&gt;    1.&amp;#19981;&amp;#26159;&amp;#22312;&amp;#21069;&amp;#26223;&amp;#36939;&amp;#20316;&amp;#65292;&amp;#20294;&amp;#20173;&amp;#28982;&amp;#22312;&amp;#34722;&amp;#24149;&amp;#19978;&amp;#30475;&amp;#30340;&amp;#21040;&amp;#30340;&amp;#20803;&amp;#20214;(&amp;#24050;&amp;#32147;&amp;#21628;&amp;#21483;&amp;#20102;&lt;br /&gt;      onPause())&amp;#20363;&amp;#22914;&amp;#21069;&amp;#26223;activity&amp;#26159;&amp;#20491;&amp;#23565;&amp;#35441;&amp;#31383;&amp;#65292;&amp;#20294;&amp;#36996;&amp;#20801;&amp;#35377;&amp;#21069;&amp;#19968;&amp;#20491;&lt;br /&gt;      activity&amp;#22312;&amp;#24460;&amp;#38754;&amp;#34987;&amp;#30475;&amp;#21040;&lt;br /&gt;    2.&amp;#33287;visible Activity&amp;#26377;&amp;#38364;&amp;#32879;&amp;#30340;Service&lt;br /&gt;3.service process:&lt;br /&gt;    &amp;#36879;&amp;#36942;startService()&amp;#21855;&amp;#21205;&amp;#30340;service&amp;#65292;&amp;#20294;&amp;#19981;&amp;#22312;&amp;#20197;&amp;#19978;&amp;#20841;&amp;#23652;&amp;#27425;&amp;#31684;&amp;#22285;&amp;#20839;&lt;br /&gt;    &amp;#38614;&amp;#28982;service&amp;#20006;&amp;#38750;&amp;#30452;&amp;#25509;&amp;#33287;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#30475;&amp;#21040;&amp;#30340;&amp;#26481;&amp;#35199;&amp;#38364;&amp;#32879;&amp;#22312;&amp;#19968;&amp;#36215;&amp;#65292;&amp;#20294;&amp;#20173;&amp;#22312;&lt;br /&gt;    &amp;#29992;&amp;#20316;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#22312;&amp;#24847;&amp;#30340;&amp;#20107;&lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#22312;&amp;#32972;&amp;#26223;&amp;#25773;&amp;#25918;&amp;#38899;&amp;#27138;&amp;#25110;&amp;#22312;&amp;#32972;&amp;#24460;&amp;#19979;&amp;#36617;&amp;#36039;&amp;#26009;&amp;#65292;&amp;#38500;&amp;#38750;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#19981;&amp;#36275;&amp;#21542;&amp;#21063;&amp;#31995;&lt;br /&gt;    &amp;#32113;&amp;#26371;&amp;#35731;&amp;#20182;&amp;#20445;&amp;#25345;&amp;#36939;&amp;#20316;&lt;br /&gt;4.background process&lt;br /&gt;    &amp;#19968;&amp;#20491;&amp;#22312;&amp;#32972;&amp;#26223;&amp;#24050;&amp;#32147;&amp;#30475;&amp;#19981;&amp;#21040;&amp;#30340;Activity(&amp;#24050;&amp;#32147;&amp;#21628;&amp;#21483;&amp;#20102;onStop)&amp;#65292;&amp;#36890;&amp;#24120;&amp;#37117;&lt;br /&gt;    &amp;#26371;&amp;#26377;&amp;#35377;&amp;#22810;background process&amp;#34987;&amp;#20445;&amp;#30041;&amp;#22312;&amp;#24460;&amp;#38754;&amp;#65292;&amp;#22312;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#19981;&amp;#36275;&amp;#26178;&amp;#21487;&lt;br /&gt;    &amp;#20197;&amp;#30733;&amp;#25481;&amp;#31680;&amp;#30465;&amp;#36039;&amp;#28304;&lt;br /&gt;5.empty process&lt;br /&gt;    &amp;#27794;&amp;#26377;&amp;#20219;&amp;#20309;Activity&amp;#30340;&amp;#20803;&amp;#20214;&amp;#65292;&amp;#23601;&amp;#22914;&amp;#21516;cache&amp;#19968;&amp;#27171;&amp;#65292;&amp;#36889;&amp;#23384;&amp;#22312;&amp;#21482;&amp;#26159;&amp;#29992;&amp;#20358;&amp;#25913;&lt;br /&gt;    &amp;#21892;&amp;#21855;&amp;#21205;&amp;#25928;&amp;#33021;&amp;#30340;&amp;#24555;&amp;#24930;&amp;#65292;&amp;#28858;&amp;#20102;&amp;#35519;&amp;#31680;&amp;#25928;&amp;#33021;,process cache&amp;#33287;&lt;br /&gt;    kernal cache&amp;#32147;&amp;#24120;&amp;#26371;&amp;#34987;&amp;#28165;&amp;#38500;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;因為一個service的排序是高於一個visible activity，所以在Activity初始化時,若需要進行較長時間處理，最好是啟動一個service來作,效果會比產生一個thread來作好。例如播放音樂與上傳圖片到網站上,在service作會比較好。還有就是在receiver的onReceive處理內,啟動service去執行也較佳&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-9205175092182220210?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/9205175092182220210/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=9205175092182220210' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9205175092182220210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9205175092182220210'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-component-lifecycles-broadcast.html' title='Android Component Lifecycles - Broadcast Receiver(三)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-668171530773206979</id><published>2010-10-25T12:17:00.005+08:00</published><updated>2010-11-22T11:58:56.160+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Component Lifecycles - Service(二)</title><content type='html'>&lt;font color='blue'&gt;一.Service可以用以下兩種模式運作&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#34987;&amp;#21855;&amp;#21205;&amp;#24460;&amp;#19968;&amp;#30452;&amp;#36939;&amp;#34892;&amp;#65292;&amp;#30452;&amp;#21040;&amp;#34987;&amp;#21628;&amp;#21483;&amp;#20572;&amp;#27490;&amp;#25110;&amp;#33258;&amp;#34892;&amp;#20572;&amp;#27490;&lt;br /&gt;  &amp;#22806;&amp;#37096;&amp;#21033;&amp;#29992;&amp;#21628;&amp;#21483;Context.startService()&amp;#21855;&amp;#21205;&lt;br /&gt;  &amp;#21628;&amp;#21483;Context.stopService()&amp;#20572;&amp;#27490;&lt;br /&gt;  Service&amp;#20839;&amp;#37096;&amp;#33258;&amp;#24049;&amp;#22519;&amp;#34892;Service.stopSelf()&amp;#25110;&lt;br /&gt;  Service.stopSelfResult()&amp;#20572;&amp;#27490;&lt;br /&gt;  &amp;#28961;&amp;#35542;startService()&amp;#21628;&amp;#21483;&amp;#20102;&amp;#24190;&amp;#27425;&amp;#65292;&amp;#20572;&amp;#27490;&amp;#37117;&amp;#21482;&amp;#38656;&amp;#35201;&lt;br /&gt;  &amp;#21628;&amp;#21483;&amp;#19968;&amp;#27425;stopService()&lt;br /&gt;2.&amp;#21033;&amp;#29992;&amp;#33287;Service&amp;#29289;&amp;#20214;&amp;#24314;&amp;#31435;&amp;#36899;&amp;#32218;&amp;#65292;&amp;#20351;&amp;#29992;&amp;#36899;&amp;#32218;&amp;#21628;&amp;#21483;&amp;#20351;&amp;#29992;Service&lt;br /&gt;  Client&amp;#21033;&amp;#29992;Context.bindService()&amp;#24314;&amp;#31435;&amp;#19968;&amp;#20491;&amp;#36899;&amp;#32218;&amp;#21040;Service&amp;#29289;&amp;#20214;&amp;#65292;&lt;br /&gt;  &amp;#20006;&amp;#20351;&amp;#29992;&amp;#36889;&amp;#36899;&amp;#32218;&amp;#21435;&amp;#21628;&amp;#21483;Service&amp;#12290;&lt;br /&gt;  &amp;#33509;&amp;#35201;&amp;#38364;&amp;#38281;&amp;#36899;&amp;#32218;&amp;#21063;&amp;#21033;&amp;#29992;Context.unbindService()&amp;#38364;&amp;#38281;&amp;#36899;&amp;#32218;&lt;br /&gt;  &amp;#22810;&amp;#20491;client&amp;#26159;&amp;#21487;&amp;#20197;&amp;#32129;&amp;#23450;&amp;#30456;&amp;#21516;&amp;#30340;service,&amp;#22914;&amp;#26524;&amp;#35201;&amp;#29992;&amp;#30340;service&amp;#36996;&amp;#27794;&amp;#34987;&lt;br /&gt;  &amp;#21855;&amp;#21205;&amp;#65292;&amp;#22312;bindService()&amp;#26178;&amp;#26371;&amp;#33258;&amp;#21205;&amp;#21855;&amp;#21205;&amp;#23427;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;這兩個模式並非是完全獨立的，你可以透過startService()後再bind Service。例如一個背景音樂播放的service利用傳遞一個包含音樂播放資訊的intent給startService(intent)來啟動，之後使用者要由這歌取得資訊，Activity會透過呼叫bindService()建立與service的連線，在這case裡stopService並不會真的停止service，因為已經被bind&lt;br /&gt;需要unbind後才會完全停止。&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Service LifeCycle Method&lt;/font&gt;&lt;br /&gt;Service的lifeCycle method只有以下三個，你可以overroide來掌握state的變化。&lt;br /&gt;與Activity的差別是,這裡的method是public,而Activity是protected&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public void onCreate() &lt;br /&gt;public void onStart(Intent intent) &lt;br /&gt;public void onDestroy()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Service 的幾個階段&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.entire lifetime&lt;br /&gt;    &amp;#22312;onCreate&amp;#33287;onDestroy()&amp;#20043;&amp;#38291;&lt;br /&gt;    &amp;#21033;&amp;#29992;onCreate()&amp;#20358;&amp;#20316;&amp;#21021;&amp;#22987;&amp;#21270;,&amp;#32780;&amp;#22312;onDestroy()&amp;#37323;&amp;#25918;&amp;#25152;&amp;#26377;&amp;#36039;&amp;#28304;&lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#38899;&amp;#27138;&amp;#25773;&amp;#25918;service&amp;#22312;onCreate()&amp;#26178;&amp;#29986;&amp;#29983;thread&amp;#20358;&amp;#25773;&amp;#25918;&lt;br /&gt;    &amp;#32780;&amp;#22312;onDestroy()&amp;#20572;&amp;#27490;thread&lt;br /&gt;&lt;br /&gt;2.active lifetime&lt;br /&gt;    &amp;#30001;onStart()&amp;#38283;&amp;#22987;,&amp;#36889;&amp;#38542;&amp;#27573;&amp;#26371;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#30001;startService()&amp;#20659;&amp;#20358;&lt;br /&gt;    &amp;#30340;intent&amp;#29289;&amp;#20214;&amp;#12290;&amp;#22914;&amp;#26524;&amp;#26159;&amp;#19968;&amp;#20491;&amp;#38899;&amp;#27138;&amp;#25773;&amp;#25918;&amp;#30340;Service&amp;#26371;&amp;#22312;&amp;#36889;&amp;#38542;&amp;#27573;&lt;br /&gt;    &amp;#21033;&amp;#29992;&amp;#21462;&amp;#24471;&amp;#30340;intent&amp;#29289;&amp;#20214;&amp;#65292;&amp;#25214;&amp;#21040;&amp;#35201;&amp;#25773;&amp;#25918;&amp;#30340;&amp;#38899;&amp;#27138;&amp;#36039;&amp;#26009;&amp;#20570;&amp;#25773;&amp;#25918; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;無論service是用Context.startService()或Context.bindService()啟動，都會觸發 onCreate()與onDestroy()，但onStart只有是在用 startService()啟動才會被觸發。&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.Bind流程會觸發的事件&lt;/font&gt;&lt;br /&gt;如果透過Bind來使用Service，以下事件在過程中被觸發，可以透過實作以下method。&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;IBinder onBind(Intent intent) &lt;br /&gt;boolean onUnbind(Intent intent) &lt;br /&gt;void onRebind(Intent intent)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;只要service 啟動後允許其他人來bind，那就會有以下事件會被觸發onBind() onUnbind()&lt;br /&gt;&lt;br /&gt;在onBind()被傳入一個來自Activity執行bindService的intent物件。onUnBind()被傳入一個來自Activity執行unbindService()的intent物件。無論service是被用哪種方式啟動,都還是可以隨時去bind()，所以service都可以接收onBind()與onUnbind()事件。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-668171530773206979?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/668171530773206979/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=668171530773206979' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/668171530773206979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/668171530773206979'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/ndroid-component-lifecycles-service.html' title='Android Component Lifecycles - Service(二)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-8469821627324374021</id><published>2010-10-25T11:24:00.006+08:00</published><updated>2010-11-22T11:58:37.022+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Component Lifecycles - Activity(一)</title><content type='html'>Android內幾種主要元件都有自己的生命週期,在其生命週期的每個階段，都有相對應的callBack method，也就是說當元件在進入該階段時，Android系統就會自動執行該階段的callBack。因此我們可以看到各種元件都會有一些內建的callBack method，如果我們希望在元件的某個階段去執行一些動作，你可以依照需要override認一階段的method&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;一.Activity的3種狀態(state)&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.active,running&lt;br /&gt;    &amp;#20986;&amp;#29694;&amp;#22312;&amp;#34722;&amp;#24149;&amp;#30340;&amp;#21069;&amp;#26223;,&amp;#20063;&amp;#23601;&amp;#26159;&amp;#22312;&amp;#30446;&amp;#21069;task&amp;#30340;activy&amp;#22534;&amp;#30090;&amp;#30340;&amp;#26368;&amp;#19978;&amp;#23652;&amp;#65292;&lt;br /&gt;    &amp;#36889;Activity&amp;#27491;&amp;#34987;focus&amp;#20006;&amp;#25509;&amp;#21463;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#30340;&amp;#21205;&amp;#20316;&lt;br /&gt;2.paused&lt;br /&gt;    &amp;#22833;&amp;#21435;&amp;#20102;focus,&amp;#20294;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#36996;&amp;#26159;&amp;#21487;&amp;#20197;&amp;#30475;&amp;#21040;Activity,&amp;#20854;&amp;#20182;activity&lt;br /&gt;    &amp;#22312;&amp;#20854;&amp;#19978;&amp;#26041;,&amp;#20063;&amp;#35377;&amp;#26159;&amp;#36879;&amp;#26126;&amp;#25110;&amp;#27794;&amp;#26377;&amp;#20840;&amp;#34722;&amp;#24149;&amp;#35206;&amp;#33995;&amp;#65292;&amp;#22240;&amp;#27492;paused&amp;#30340;Activity&lt;br /&gt;    &amp;#36996;&amp;#21487;&amp;#20197;&amp;#34987;&amp;#30475;&amp;#21040;,&amp;#19968;&amp;#20491;paused Activy&amp;#36996;&amp;#26159;&amp;#22312;&amp;#23384;&amp;#27963;&amp;#29376;&amp;#24907;(&amp;#36996;&amp;#20445;&amp;#26377;&amp;#25152;&amp;#26377;&amp;#36039;&amp;#26009;&amp;#65292;&lt;br /&gt;    &amp;#20006;&amp;#34987;window manager&amp;#25152;&amp;#31649;&amp;#29702;)&amp;#20294;&amp;#22312;&amp;#31995;&amp;#32113;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#36942;&amp;#20302;&amp;#26178;&amp;#36996;&amp;#26159;&amp;#21487;&amp;#33021;&amp;#34987;&amp;#30733;&amp;#25481;&lt;br /&gt;3.stopped&lt;br /&gt;    &amp;#30070;&amp;#23436;&amp;#20840;&amp;#34987;&amp;#20854;&amp;#20182;&amp;#30340;Activity&amp;#25152;&amp;#36974;&amp;#34109;&amp;#65292;&amp;#20182;&amp;#26159;&amp;#20445;&amp;#26377;&amp;#19968;&amp;#20123;&amp;#29376;&amp;#24907;&amp;#36039;&amp;#26009;&amp;#65292;&lt;br /&gt;    &amp;#20294;&amp;#24050;&amp;#32147;&amp;#30475;&amp;#19981;&amp;#21040;&amp;#65292;&amp;#20182;&amp;#30340;&amp;#35222;&amp;#31383;&amp;#24050;&amp;#32147;&amp;#34987;&amp;#38577;&amp;#34255;&amp;#65292;&amp;#30070;&amp;#31995;&amp;#32113;&amp;#35352;&amp;#25014;&amp;#39636;&amp;#36942;&amp;#20302;&amp;#26371;&amp;#34987;&amp;#30733;&amp;#25481;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;當系統記憶體過低，會將屬於paused與stopped狀態的Activity 砍掉，也就是呼叫其finish()或直接就砍了其process,當要再重新顯示在使用者面前，需要完全restart並restore之前的state 資料&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Activity LifeCycle Method&lt;/font&gt;&lt;br /&gt;當Activity由一個state轉到另一個state的過程中,以下幾個內部method會被自動觸發通知，所以我們若要在特定時間點執行特定動作需要override 相關protected method&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;protected    void onCreate(Bundle savedInstanceState) &lt;br /&gt;protected    void onStart() &lt;br /&gt;protected    void onRestart() &lt;br /&gt;protected    void onResume() &lt;br /&gt;protected    void onPause() &lt;br /&gt;protected    void onStop() &lt;br /&gt;protected    void onDestroy()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Activity 的幾個階段&lt;/font&gt;&lt;br /&gt;每個Activity一定要Override onCreate()來作初始化功能,有的會需要override onPause()&lt;br /&gt;去把資料改變記錄下來,以因應可能停止的動作&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.entire lifetime&amp;#23436;&amp;#25972;&amp;#29983;&amp;#21629;&amp;#36913;&amp;#26399;&lt;br /&gt;    &amp;#19968;&amp;#20491;Activity&amp;#30001;onCreate()&amp;#38283;&amp;#22987;,&amp;#21040;&amp;#26368;&amp;#24460;onDestroy()&amp;#32080;&amp;#26463;&amp;#65292;&amp;#26371;&amp;#22312;&lt;br /&gt;    onCreate()&amp;#26178;&amp;#20570;&amp;#25152;&amp;#26377;&amp;#21021;&amp;#22987;&amp;#21270;&amp;#30340;&amp;#21205;&amp;#20316;&amp;#65292;&amp;#22312;onDestroy()&amp;#20839;&amp;#37323;&amp;#25918;&amp;#25152;&amp;#26377;&amp;#30340;&lt;br /&gt;    &amp;#31995;&amp;#32113;&amp;#36039;&amp;#28304;&amp;#12290;&lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#26377;&amp;#19968;&amp;#20491;Thread&amp;#22312;&amp;#32972;&amp;#26223;&amp;#36914;&amp;#34892;&amp;#32178;&amp;#36335;&amp;#36039;&amp;#26009;&amp;#19979;&amp;#36617;,&amp;#36889;thread&amp;#26371;&amp;#22312;onCreat()&lt;br /&gt;    &amp;#31243;&amp;#24207;&amp;#20839;&amp;#29986;&amp;#29983;&amp;#65292;&amp;#32780;&amp;#22312;onDestroy()&amp;#20572;&amp;#27490;&amp;#36889;thread&lt;br /&gt;2.visible lifetime&lt;br /&gt;    &amp;#30001;&amp;#21628;&amp;#21483;onStart()&amp;#38283;&amp;#22987;&amp;#21040; onStop()&amp;#32080;&amp;#26463;,&amp;#22312;&amp;#36889;&amp;#36942;&amp;#31243;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#21487;&amp;#20197;&amp;#30475;&amp;#21040;&lt;br /&gt;    Activity&amp;#22312;&amp;#34722;&amp;#24149;&amp;#19978;&amp;#65292;&amp;#22312;&amp;#36889;&amp;#26399;&amp;#38291;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#21487;&amp;#20197;&amp;#30475;&amp;#21040;&amp;#20803;&amp;#20214;&amp;#39023;&amp;#31034;&amp;#22312;&amp;#30059;&amp;#38754;&amp;#19978;&amp;#65292;&lt;br /&gt;    &amp;#20294;&amp;#19981;&amp;#35211;&amp;#24471;&amp;#22312;&amp;#21069;&amp;#26223;&amp;#25110;&amp;#33287;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#20114;&amp;#21205;&amp;#12290;&lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#20320;&amp;#21487;&amp;#20197;&amp;#22312;onStart&amp;#35387;&amp;#20874;&amp;#19968;&amp;#20491;BroadcastReceiver,&amp;#32780;&amp;#22312;onStop()&lt;br /&gt;    &amp;#20013;&amp;#35299;&amp;#38500;&amp;#35387;&amp;#20874;&amp;#65292;&amp;#21033;&amp;#29992;BroadcastReceiver&amp;#30435;&amp;#30475;UI&amp;#19978;&amp;#30340;&amp;#35722;&amp;#21270;&amp;#65292;&amp;#36889;&amp;#27171;&amp;#23601;&amp;#21487;&lt;br /&gt;    &amp;#20197;&amp;#35264;&amp;#23519;&amp;#21040;&amp;#30456;&amp;#38364;&amp;#30340;&amp;#35722;&amp;#21270;&amp;#65292;&amp;#22312;Activity&amp;#36939;&amp;#20316;&amp;#19978;&amp;#65292;onStart()&amp;#33287;onStop()&lt;br /&gt;    &amp;#22312;&amp;#36914;&amp;#34892;&amp;#20013;&amp;#21487;&amp;#20197;&amp;#34987;&amp;#22810;&amp;#27425;&amp;#21628;&amp;#21483;&lt;br /&gt;3.foreground lifetime&lt;br /&gt;    &amp;#30001;&amp;#21628;&amp;#21483;onResume()&amp;#21040;onPause()&amp;#38291;,&amp;#22312;&amp;#36889;&amp;#21312;&amp;#38291;,Activity&amp;#22312;&amp;#21069;&amp;#26223;,&amp;#20006;&amp;#21487;&lt;br /&gt;    &amp;#33287;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#20114;&amp;#21205;&amp;#12290;Activity&amp;#32147;&amp;#24120;&amp;#22312;&amp;#36889;&amp;#20841;&amp;#20491;&amp;#29376;&amp;#24907;&amp;#38291;&amp;#36339;&amp;#21205;&amp;#12290;    &lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#30070;Device&amp;#36914;&amp;#20837;&amp;#30561;&amp;#30496;&amp;#29376;&amp;#24907;&amp;#25110;&amp;#21478;&amp;#19968;&amp;#20491;Activty&amp;#35201;&amp;#38283;&amp;#21855;&amp;#65292;&amp;#23601;&amp;#26371;&amp;#21628;&amp;#21483;&lt;br /&gt;    onPause()&amp;#65292;&amp;#32780;&amp;#30070;activity&amp;#32380;&amp;#32396;&amp;#22519;&amp;#34892;,&amp;#25110;&amp;#19968;&amp;#20491;&amp;#26032;&amp;#30340;intent&amp;#34987;&amp;#30332;&amp;#36865;&amp;#20986;&amp;#20358;&lt;br /&gt;    Activity&amp;#20839;&amp;#30340;onResume()&amp;#23601;&amp;#26371;&amp;#34987;&amp;#21628;&amp;#21483;&amp;#22519;&amp;#34892;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.Activity LifeCycle Method狀態說明&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.onCreate()&lt;br /&gt;    &amp;#30070;activity&amp;#31532;&amp;#19968;&amp;#27425;&amp;#34987;&amp;#29986;&amp;#29983;&amp;#24460;&amp;#65292;&amp;#26371;&amp;#34987;&amp;#22519;&amp;#34892;&amp;#12290;&lt;br /&gt;    &amp;#20320;&amp;#21487;&amp;#20197;&amp;#22312;&amp;#36889;&amp;#31243;&amp;#24207;&amp;#20839;create View,bind data&amp;#33287;list&amp;#65292;&lt;br /&gt;    &amp;#22312;&amp;#36889;method&amp;#34987;&amp;#22519;&amp;#34892;&amp;#26178;&amp;#26371;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#19968;&amp;#20491;Bundle&amp;#29289;&amp;#20214;&amp;#65292;&lt;br /&gt;    &amp;#36889;&amp;#29289;&amp;#20214;&amp;#21253;&amp;#21547;&amp;#20102;Activity&amp;#20043;&amp;#21069;&amp;#30340;state&amp;#36039;&amp;#26009;&lt;br /&gt;    &lt;br /&gt;    &amp;#25509;&amp;#19979;&amp;#20358;&amp;#26371;&amp;#22519;&amp;#34892;&amp;#30340;&amp;#26377;onStart()&lt;br /&gt;2.onRestart()&lt;br /&gt;    &amp;#30070;Activity&amp;#34987;&amp;#20572;&amp;#27490;&amp;#24460;&amp;#65292;&amp;#21448;&amp;#37325;&amp;#26032;&amp;#21855;&amp;#21205;&amp;#26178;&amp;#22519;&amp;#34892;(&amp;#33287;onStart&amp;#21516;)&lt;br /&gt;    &amp;#25509;&amp;#19979;&amp;#20358;&amp;#26371;&amp;#22519;&amp;#34892;&amp;#30340;&amp;#26377;onStart()&lt;br /&gt;3.onStart()&lt;br /&gt;    &amp;#22312;Activity&amp;#35201;&amp;#35722;&amp;#25104;Visible&amp;#21069;&amp;#22519;&amp;#34892;&lt;br /&gt;    &lt;br /&gt;    &amp;#22914;&amp;#26524;&amp;#25509;&amp;#19979;&amp;#20358;&amp;#35201;&amp;#25226;Activity&amp;#39023;&amp;#31034;&amp;#22312;&amp;#21069;&amp;#26223;,&amp;#21063;&amp;#20276;&amp;#38568;&amp;#33879;onResume()&lt;br /&gt;    &amp;#22914;&amp;#26524;&amp;#25509;&amp;#19979;&amp;#20358;&amp;#35201;&amp;#25226;Activity&amp;#38577;&amp;#34255;&amp;#65292;&amp;#21063;&amp;#20276;&amp;#38568;&amp;#33879;onStop()    &lt;br /&gt;4.onResume()&lt;br /&gt;    &amp;#22312;Activity&amp;#38283;&amp;#22987;&amp;#33287;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#20114;&amp;#21205;&amp;#21069;&amp;#34987;&amp;#21628;&amp;#21483;&lt;br /&gt;    &amp;#22312;&amp;#36889;&amp;#40670;Activity&amp;#26159;&amp;#22312;Activity&amp;#22534;&amp;#30090;&amp;#30340;&amp;#26368;&amp;#38914;&amp;#31471;&lt;br /&gt;    &lt;br /&gt;    &amp;#25509;&amp;#19979;&amp;#20358;&amp;#30340;&amp;#26371;&amp;#26159;onPause()&lt;br /&gt;5.onPause()&lt;br /&gt;    &amp;#30070;&amp;#31995;&amp;#32113;&amp;#35201;&amp;#21855;&amp;#21205;&amp;#20854;&amp;#20182;Activity&amp;#65292;&amp;#36889;&amp;#31243;&amp;#24207;&amp;#26371;&amp;#34987;&amp;#21628;&amp;#21483;&amp;#65292;&lt;br /&gt;    &amp;#22312;&amp;#36889;&amp;#31243;&amp;#24207;&amp;#20013;&amp;#38656;&amp;#35201;&amp;#21435;&amp;#34389;&amp;#29702;&amp;#65292;&amp;#25226;&amp;#23578;&amp;#26410;&amp;#20786;&amp;#23384;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#20786;&amp;#23384;&amp;#19979;&amp;#20358;&amp;#65292;&lt;br /&gt;    &amp;#20572;&amp;#27490;&amp;#21205;&amp;#30059;&amp;#33287;&amp;#20854;&amp;#20182;&amp;#26371;&amp;#28040;&amp;#32791;CPU&amp;#30340;&amp;#21205;&amp;#20316;&amp;#65292;&amp;#36889;&amp;#36942;&amp;#31243;&amp;#38656;&amp;#35201;&amp;#38750;&amp;#24120;&amp;#24555;&amp;#36895;&amp;#65292;&lt;br /&gt;    &amp;#22240;&amp;#28858;&amp;#19979;&amp;#19968;&amp;#20491;Activity&amp;#26371;&amp;#31561;&amp;#20182;return&amp;#25165;&amp;#26371;&amp;#22519;&amp;#34892;&lt;br /&gt;    &lt;br /&gt;    &amp;#33509;&amp;#25509;&amp;#19979;&amp;#20358;&amp;#36889;Activity&amp;#35201;&amp;#22238;&amp;#21040;&amp;#21069;&amp;#26223;,&amp;#25509;&amp;#19979;&amp;#20358;&amp;#30340;&amp;#26371;&amp;#26159;onResume()&lt;br /&gt;    &amp;#33509;&amp;#25509;&amp;#19979;&amp;#20358;&amp;#36889;Activity&amp;#35201;&amp;#35722;&amp;#38577;&amp;#34255;,&amp;#21063;&amp;#25509;&amp;#19979;&amp;#20358;&amp;#26371;&amp;#26159;onStop()&lt;br /&gt;6.onStop()&lt;br /&gt;    &amp;#30070;Activity&amp;#19981;&amp;#20877;&amp;#35731;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#30475;&amp;#21040;&amp;#26178;&amp;#21628;&amp;#21483;&lt;br /&gt;    &amp;#21487;&amp;#33021;&amp;#30332;&amp;#29983;&amp;#22312;&amp;#36889;Activity&amp;#28310;&amp;#20633;&amp;#35201;destroy&amp;#25110;&amp;#26159;&amp;#20854;&amp;#20182;&amp;#30340;Activity&lt;br /&gt;    &amp;#22238;&amp;#24489;&amp;#21040;&amp;#21069;&amp;#26223;&lt;br /&gt;    &lt;br /&gt;    &amp;#20551;&amp;#20351;&amp;#36889;Activity&amp;#35201;&amp;#22238;&amp;#21040;&amp;#21069;&amp;#26223;,&amp;#25509;&amp;#19979;&amp;#20358;&amp;#26371;&amp;#26159;onResume()&lt;br /&gt;    &amp;#20551;&amp;#33509;&amp;#36889;Activity&amp;#35201;&amp;#25972;&amp;#20491;&amp;#38364;&amp;#38281;,&amp;#25509;&amp;#19979;&amp;#20358;&amp;#26371;&amp;#26159;onDestroy()&lt;br /&gt;7.onDestroy()&lt;br /&gt;    &amp;#30070;Activity&amp;#34987;Destroyed&amp;#21069;&amp;#34987;&amp;#21628;&amp;#21483;&lt;br /&gt;    &amp;#36889;&amp;#26371;&amp;#26159;&amp;#36889;Activity&amp;#26368;&amp;#24460;&amp;#19968;&amp;#20491;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#36890;&amp;#30693;&amp;#65292;&lt;br /&gt;    &amp;#20182;&amp;#21487;&amp;#33021;&amp;#30332;&amp;#29983;&amp;#22312;&amp;#21628;&amp;#21483;&amp;#20102;finish()&amp;#20043;&amp;#24460;,&amp;#25110;&amp;#22240;&amp;#28858;&amp;#31995;&amp;#32113;&amp;#22240;&amp;#28858;&amp;#35352;&amp;#25014;&amp;#39636;&lt;br /&gt;    &amp;#19981;&amp;#36275;&amp;#35201;&amp;#31680;&amp;#23569;&amp;#31354;&amp;#38291;&amp;#32780;&amp;#21034;&amp;#38500;&amp;#65292;&amp;#21487;&amp;#20197;&amp;#21033;&amp;#29992;isFinishing()&amp;#20358;&amp;#21028;&amp;#26039;&amp;#26159;&lt;br /&gt;    &amp;#20160;&amp;#40636;&amp;#21407;&amp;#22240;&amp;#36896;&amp;#25104;    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.儲存Activity state&lt;/font&gt;&lt;br /&gt;若要在Activity被關閉重開啟後,可以保留之前的狀態，&lt;br /&gt;可以實做onSaveInstanceState()把資料存下來，儲存到Bundle物件上&lt;br /&gt;而在重啟後讀出來&lt;br /&gt;其相關順序為&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;onSaveInstanceState()-&amp;gt;onPause()&lt;br /&gt;onStart()-&amp;gt;onRestoreInstanceState() &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;在這過程中只儲存過渡性的資料,不要儲存固定的資料,因為onSaveInstanceState並非會一直被執行到&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-8469821627324374021?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/8469821627324374021/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=8469821627324374021' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8469821627324374021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8469821627324374021'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-component-lifecycles-activity.html' title='Android Component Lifecycles - Activity(一)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-388473275755954204</id><published>2010-10-25T10:44:00.002+08:00</published><updated>2010-10-25T10:44:45.644+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='音樂影像'/><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>Monday - God Is an Astronaut</title><content type='html'>星期一的早上&lt;br /&gt;天氣是舒服的秋涼&lt;br /&gt;有太陽&lt;br /&gt;上班的路上 也沒有太壅塞的車潮&lt;br /&gt;辦公室裡 陽光溫暖 也明亮&lt;br /&gt;&lt;br /&gt;一早的電話 帶來了幾許煩躁&lt;br /&gt;打壞了原本的美好&lt;br /&gt;&lt;br /&gt;打開音樂&lt;br /&gt;用God Is an Astronaut來恢復平靜&lt;br /&gt;&lt;object width="300" height="225"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Wekny2Bcssk?fs=1&amp;amp;hl=zh_TW"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Wekny2Bcssk?fs=1&amp;amp;hl=zh_TW" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-388473275755954204?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/388473275755954204/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=388473275755954204' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/388473275755954204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/388473275755954204'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/monday-god-is-astronaut.html' title='Monday - God Is an Astronaut'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7637100258013801438</id><published>2010-10-21T18:32:00.006+08:00</published><updated>2010-11-22T11:58:19.868+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>AndroidManifest 設定檔- 基本概念</title><content type='html'>&lt;font color='blue'&gt;一.說明&lt;/font&gt;&lt;br /&gt;在每個Android Application內一定會在Project根目錄下配置一個AndroidManifest.xml檔案&lt;br /&gt;這檔案提供以下幾個作用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#35373;&amp;#23450;&amp;#36889;&amp;#20491;Application&amp;#30340;Java Package Name&lt;br /&gt;  &amp;#20063;&amp;#23601;&amp;#26159;&amp;#35373;&amp;#23450;&amp;#19968;&amp;#20491;Java Package&amp;#36335;&amp;#24465;&amp;#29992;&amp;#20358;&amp;#20195;&amp;#34920;&amp;#36889;&amp;#20491;Application        &lt;br /&gt;2.&amp;#35373;&amp;#23450;&amp;#32068;&amp;#25104;&amp;#36889;App&amp;#30340;&amp;#25152;&amp;#26377;&amp;#20803;&amp;#20214;&lt;br /&gt;  &amp;#21253;&amp;#25324;Activity,Service,ContentProvider,BroadCast Receiver&amp;#31561;,&lt;br /&gt;  &amp;#38283;&amp;#30332;&amp;#22909;&amp;#30340;&amp;#20803;&amp;#20214;&amp;#37117;&amp;#38656;&amp;#35201;&amp;#35387;&amp;#20874;&amp;#22312;&amp;#36889;Manifest&amp;#27284;&amp;#26696;&amp;#20839;,&amp;#22914;&amp;#26524;&amp;#27794;&amp;#35387;&amp;#20874;&amp;#22312;&amp;#36889;&amp;#35041;&amp;#65292;&lt;br /&gt;  &amp;#20803;&amp;#20214;&amp;#28961;&amp;#27861;&amp;#34987;&amp;#20351;&amp;#29992;&amp;#12290;&amp;#38500;&amp;#20102;&amp;#35387;&amp;#20874;&amp;#20803;&amp;#20214;&amp;#65292;&amp;#20006;&amp;#21033;&amp;#29992;Intent Filter&amp;#35731;Android&lt;br /&gt;  &amp;#30693;&amp;#36947;&amp;#22312;&amp;#20160;&amp;#40636;&amp;#29376;&amp;#27841;&amp;#21487;&amp;#20197;&amp;#21855;&amp;#21205;&amp;#21738;&amp;#20491;&amp;#20803;&amp;#20214;        &lt;br /&gt;3.&amp;#27770;&amp;#23450;&amp;#21738;&amp;#20123;&amp;#31243;&amp;#24207;&amp;#23559;&amp;#21487;&amp;#20197;&amp;#25511;&amp;#21046;&amp;#20803;&amp;#20214;&lt;br /&gt;4.&amp;#23459;&amp;#21578;&amp;#20102;App&amp;#38656;&amp;#35201;&amp;#26377;&amp;#21738;&amp;#20123;&amp;#27402;&amp;#38480;&amp;#21435;&amp;#21462;&amp;#24471;&amp;#34987;&amp;#20445;&amp;#35703;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#25110;&amp;#22519;&amp;#34892;&amp;#20854;&amp;#20182;App&amp;#30340;&amp;#20803;&amp;#20214;&amp;#21151;&amp;#33021;      &lt;br /&gt;5.&amp;#23459;&amp;#21578;&amp;#20102;&amp;#26412;App&amp;#20801;&amp;#35377;&amp;#35731;&amp;#20854;&amp;#20182;App&amp;#20114;&amp;#21205;&amp;#30340;&amp;#27402;&amp;#38480;    &lt;br /&gt;6.&amp;#25552;&amp;#20379;&amp;#22519;&amp;#34892;&amp;#20013;Instrumention Classes&amp;#28165;&amp;#21934;&amp;#33287;&amp;#30456;&amp;#38364;&amp;#36039;&amp;#26009;&lt;br /&gt;  &amp;#36889;&amp;#20123;&amp;#36039;&amp;#26009;&amp;#21482;&amp;#26377;&amp;#38283;&amp;#30332;&amp;#38542;&amp;#27573;&amp;#26371;&amp;#23384;&amp;#22312;&amp;#65292;&amp;#30332;&amp;#24067;&amp;#24460;&amp;#26371;&amp;#34987;&amp;#31227;&amp;#38500;&lt;br /&gt;7.&amp;#23459;&amp;#21578;&amp;#20102;&amp;#36889;App&amp;#22519;&amp;#34892;&amp;#25152;&amp;#35201;&amp;#27714;&amp;#30340;&amp;#26368;&amp;#20302;Android API&amp;#29256;&amp;#26412;        &lt;br /&gt;8.&amp;#35373;&amp;#23450;&amp;#36889;App&amp;#38656;&amp;#35201;&amp;#36899;&amp;#32080;&amp;#30340;API Libraries&lt;br /&gt;    &amp;#38500;&amp;#20102;&amp;#38928;&amp;#35373;&amp;#20351;&amp;#29992;Android API&amp;#22806;&amp;#65292;&amp;#21487;&amp;#20197;&amp;#21033;&amp;#29992;&amp;#35373;&amp;#23450;&amp;lt;uses-library&amp;gt;&lt;br /&gt;    &amp;#20351;&amp;#29992;&amp;#20854;&amp;#20182;package&amp;#30340;&amp;#20803;&amp;#20214;&amp;#21151;&amp;#33021;API&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='blue'&gt;二.語法原則&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.element&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;lt;manifest&amp;gt; and &amp;lt;application&amp;gt;&amp;#21482;&amp;#33021;&amp;#20986;&amp;#29694;&amp;#19968;&amp;#27425;,&amp;#20854;&amp;#20182;&amp;#30340;&amp;#37117;&amp;#21487;&amp;#20197;&amp;#20986;&amp;#29694;&amp;#22810;&amp;#27425;&lt;br /&gt;2.&amp;lt;activity&amp;gt;, &amp;lt;provider&amp;gt;&amp;#33287;&amp;lt;service&amp;gt; &amp;#21487;&amp;#20197;&amp;#27794;&amp;#26377;&amp;#38918;&amp;#24207;&amp;#24615;&amp;#30340;&amp;#20986;&amp;#29694;&amp;#22312;&amp;#20219;&amp;#20309;&lt;br /&gt;  &amp;#22320;&amp;#26041;&amp;#65292;&amp;#20294;&amp;lt;activity-alias&amp;gt;&amp;#19968;&amp;#23450;&amp;#35201;&amp;#36319;&amp;#22312;&amp;lt;activity&amp;gt;&amp;#24460;&amp;#38754;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;2.attribute&lt;/font&gt;&lt;br /&gt;所有的屬性都是非必填的選項,除了manifest外，所有元素的屬性一定都是以android:命名&lt;br /&gt;&lt;font color='red'&gt;3.Class name&lt;/font&gt;&lt;br /&gt;在Manifest內,多數的元素都直接對應到Java Class,包括application本身&lt;br /&gt;如activities (activity), services (service), broadcast receivers (receiver)&lt;br /&gt;與content providers (provider)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果要在Manifest內加入這幾個class的subclass,subclass，則在name屬性上,&lt;br /&gt;輸入完整的Class名稱(包括package name)&lt;br /&gt;例 加入一個繼承自Service的subClass SecretService&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;manifest . . . &amp;gt;  &lt;br /&gt;      &amp;lt;application . . . &amp;gt;  &lt;br /&gt;           &amp;lt;service android:name="com.example.project.SecretService" . . . &amp;gt;  &lt;br /&gt;                . . .  &lt;br /&gt;           &amp;lt;/service&amp;gt;  &lt;br /&gt;           . . .  &lt;br /&gt;      &amp;lt;/application&amp;gt;  &lt;br /&gt; &amp;lt;/manifest&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;如果這subClass是在這Application的package下,則在name屬性上&lt;br /&gt;只要用.ClassName方式設定即可,系統看到.name會自動將Ap的package 加上去&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;manifest package="com.example.project" . . . &amp;gt;  &lt;br /&gt;      &amp;lt;application . . . &amp;gt;  &lt;br /&gt;           &amp;lt;service android:name=".SecretService" . . . &amp;gt;  &lt;br /&gt;                . . .  &lt;br /&gt;           &amp;lt;/service&amp;gt;  &lt;br /&gt;           . . .  &lt;br /&gt;      &amp;lt;/application&amp;gt;  &lt;br /&gt; &amp;lt;/manifest&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;當要啟動這元件時，若這subClass存在,系統會產生這subclass(範例是SecretService)的instance使用，&lt;br /&gt;若subclass不存在,則會產生其base class(範例是Service)的instance&lt;br /&gt;&lt;font color='red'&gt;4.Multiple values&lt;/font&gt;&lt;br /&gt;若一個項目可以有多個值存在,會用多個tag repeat,而不會在一個tag寫入多個值&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;intent-filter . . . &amp;gt;  &lt;br /&gt;      &amp;lt;action android:name="android.intent.action.EDIT" /&amp;gt;  &lt;br /&gt;      &amp;lt;action android:name="android.intent.action.INSERT" /&amp;gt;  &lt;br /&gt;      &amp;lt;action android:name="android.intent.action.DELETE" /&amp;gt;  &lt;br /&gt;      . . .  &lt;br /&gt; &amp;lt;/intent-filter&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;5.resource value&lt;/font&gt;&lt;br /&gt;會需要用到resource 當作屬性值時會以&lt;br /&gt;[package:]type:name表示&lt;br /&gt;若是來自於style theme的值則會是&lt;br /&gt;?[package:]type:name&lt;br /&gt;&lt;font color='red'&gt;6.String values&lt;/font&gt;&lt;br /&gt;當屬性值為字串會用到\\當跳脫字元,例\\n 換行&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.幾項元素功能作用&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.Intent Filters&lt;/font&gt;&lt;br /&gt;在manifest內，主要的幾個元件如Activity Service...等利用Intent Filter設定對intent的處理能力&lt;br /&gt;也就是說,用Intent Filter描述他可以處理那些intent，在一個元件可以是可以同時設定多組的intent filter。&lt;br /&gt;Android系統在收到intent後可以依此決定要啟動哪個元件來處理intent需求&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;2.Icons and Labels&lt;/font&gt;&lt;br /&gt;許多元素都有icon與label顯示小圖與文字在使用介面上,有的會有description 放比較多的說明文字。&lt;br /&gt;例如在permission上,這三個屬性都有,當Application對系統要求取得權限時，依照提供的permission設定&lt;br /&gt;就可以把這3個屬性的資料顯示在介面上&lt;br /&gt;&lt;br /&gt;如果在上層的container上設定icon與label,那麼其子元素的icon與label都會以上層設定&lt;br /&gt;當作預設值&lt;br /&gt;&lt;br /&gt;&lt;font color='red'&gt;3.Permissions&lt;/font&gt;&lt;br /&gt;用來設定去存取Device資料，啟動其他App的元件或是本身元件被其他App使用的權限設定&lt;br /&gt;一個Appication可以用permission保護其元件，所有的Permission都被定義在&lt;br /&gt;android.Manifest.permission Class內,也可以自行定義自己的Permission&lt;br /&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;manifest . . . &amp;gt;  &lt;br /&gt;      &amp;lt;permission android:name="com.example.project.DEBIT_ACCT" . . . /&amp;gt;  &lt;br /&gt;      . . .  &lt;br /&gt;      &amp;lt;application . . .&amp;gt;  &lt;br /&gt;           &amp;lt;activity android:name="com.example.project.FreneticActivity"  &lt;br /&gt;                      android:permission="com.example.project.DEBIT_ACCT"  &lt;br /&gt;                      . . . &amp;gt;  &lt;br /&gt;                . . .  &lt;br /&gt;           &amp;lt;/activity&amp;gt;  &lt;br /&gt;      &amp;lt;/application&amp;gt;  &lt;br /&gt;      . . .  &lt;br /&gt;      &amp;lt;uses-permission android:name="com.example.project.DEBIT_ACCT" /&amp;gt;  &lt;br /&gt;      . . .  &lt;br /&gt; &amp;lt;/manifest&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;以上除了定義permission外還要宣告uses-permission讓其他App可以使用這個元件&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;permission-tree&amp;gt;:&amp;#23450;&amp;#32681;&amp;#19968;&amp;#20491;permissions group&amp;#30340;namespace&lt;br /&gt;&amp;lt;permission-group&amp;gt; :&amp;#23450;&amp;#32681;&amp;#19968;&amp;#32068;permission&amp;#30340;label,&amp;#32020;&amp;#31929;&amp;#21482;&amp;#26159;&amp;#23450;&amp;#32681;&amp;#19968;&amp;#20491;&amp;#21517;&amp;#31281;&lt;br /&gt;&amp;lt;permission&amp;gt;:&amp;#33509;&amp;#35201;&amp;#23450;&amp;#32681;&amp;#23660;&amp;#26044;&amp;#21738;&amp;#20491;group,&amp;#21063;&amp;#22312;group&amp;#23660;&amp;#24615;&amp;#35373;&amp;#23450;&lt;br /&gt;     &amp;lt;permission-group&amp;gt;&amp;#35373;&amp;#23450;&amp;#30340;&amp;#21517;&amp;#31281;&amp;#21363;&amp;#21487;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='red'&gt;4.Libraries&lt;/font&gt;&lt;br /&gt;每個Application預設連結到Android Library,如果要使用其他Library的package&lt;br /&gt;則需要用uses-library宣告&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7637100258013801438?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7637100258013801438/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7637100258013801438' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7637100258013801438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7637100258013801438'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/androidmanifest.html' title='AndroidManifest 設定檔- 基本概念'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-4887278387265783762</id><published>2010-10-21T10:57:00.010+08:00</published><updated>2010-11-22T11:57:59.220+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Intent Filter-判斷intent傳遞對象</title><content type='html'>&lt;font color='blue'&gt;一.Intent接收原理&lt;/font&gt;&lt;br /&gt;當使用者發送一個intent出來,要求元件去執行動作，如果這個intent裡有很清楚的設定了ComponentName,那麼intent就會直接被送到指定的元件,並啟動該元件，如果沒有設定,則會由Android系統自動去判斷該把這intent送到哪個元件上啟動他。&lt;br /&gt;&lt;br /&gt;大多數在本身專案內元件可以處理的動作，intent通常都會直接指明要給哪個元件處理，如果沒有指定元件名稱的intent大多是用來啟動其他Application上的元件&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Intent Filter的作用&lt;/font&gt;&lt;br /&gt;Android系統如何判斷哪個元件可以接收哪個intent,就是依靠在ManiFest檔案內，宣告元件(Activity,Service)時所加入的Intent Filter設定，每個Activity內可以設定0～多組的intent filter,每一組的Intent Filter都是一份比對規則&lt;br /&gt;&lt;br /&gt;當intent發出來時,系統會去檢查Manifest內各元件內的intent filter,而啟動適合的元件，若元件沒有設定filter,那就只能接收到有清楚指定component的intent&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.Intent Filter&lt;/font&gt;&lt;br /&gt;Intent filter內會設定的資料包括action,data與category三種。也就是說filter只會與intent裡的這三種資料做比對動作，而在每個filter內可以同時存在著多個data action與category&lt;br /&gt;&lt;br /&gt;雖然每個Intent Filter都屬於IntentFilter類別,但因Android系統在元件啟動錢就必需測試其相容性，所以Intent Filter都是以XML方式寫在AndroidManifest.xml檔內,而不以Java Code去產生。唯一的例外是broadcast receivers的intent filter可以透過Context.registerReceiver()來動態設定&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Context.registerReceiver(BroadcastReceiver receiver, IntentFilter filter)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;在註冊時,把filter動態加入&lt;br /&gt;&lt;br /&gt;Intent Filter內要設定的值，包括action,data與category都定義在Intent Class內，也就是說在Intent物件內設定這3種資料的值與Intent Filter內要設定這3種資料的值都定義在Intent Class內，在JavaCode裡,可以透過Class引用參數，但在Manifest內設定,需要設定字串值,就要去查Class內參數實體的字串值&lt;br /&gt;&lt;br /&gt;例:Manifest.xml設定filter&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;intent-filter . . . &amp;gt;  &lt;br /&gt;      &amp;lt;category android:name="android.intent.category.DEFAULT" /&amp;gt;  &lt;br /&gt;      &amp;lt;category android:name="android.intent.category.BROWSABLE" /&amp;gt;  &lt;br /&gt;      . . .  &lt;br /&gt; &amp;lt;/intent-filter&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;JavaCode設定intent Object的Category&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;intent.setCategory(Intent.CATEGORY_DEFAULT);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.Intent Test 找到要接收intent的元件&lt;/font&gt;&lt;br /&gt;當intent發出來時,會與元件在Manifest內所定義的intent filter做比對，比對時需進行3個test,當這3個test都通過時,才會確認這元件可以接手處理這Intent。若同時有不只一個的Activity或Service通過Test,那系統會問你要啟動哪一個,若都不符合,則會發生錯誤&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.Intent Test-Action Test&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#30070;&amp;#19968;&amp;#20491;intent object&amp;#33509;&amp;#27794;&amp;#26377;&amp;#25351;&amp;#23450;Action,&amp;#21063;&amp;#36889;&amp;#38917;pass&lt;br /&gt;2.filter&amp;#20839;&amp;#33267;&amp;#23569;&amp;#35201;&amp;#26377;&amp;#19968;&amp;#38917;action,&amp;#33509;&amp;#37117;&amp;#27794;&amp;#26377;&amp;#23601;&amp;#27794;&amp;#26377;&amp;#20219;&amp;#20309;intent&lt;br /&gt;  &amp;#21487;&amp;#20197;&amp;#36890;&amp;#36942;&amp;#36889;filter&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;intent-filter . . . &amp;gt;  &lt;br /&gt;  &amp;lt;action android:name="com.example.project.SHOW_CURRENT" /&amp;gt;  &lt;br /&gt;  &amp;lt;action android:name="com.example.project.SHOW_RECENT" /&amp;gt;            &lt;br /&gt;      . . .  &lt;br /&gt; &amp;lt;/intent-filter&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;六.Intent Test-Category Test&lt;/font&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#33509;intent&amp;#26377;&amp;#35373;&amp;#23450;Category,&amp;#24517;&amp;#38920;intent object&amp;#21487;&amp;#20197;&amp;#36890;&amp;#36942;&amp;#25152;&amp;#26377;filter&amp;#35373;&amp;#23450;&lt;br /&gt;  &amp;#30340;Category&amp;#65292;Test&amp;#25165;&amp;#26371;pass&lt;br /&gt;2.&amp;#33509;intent&amp;#27794;&amp;#26377;&amp;#35373;&amp;#23450;Category,&amp;#21063;&amp;#35373;&amp;#23450;pass&lt;br /&gt;3.&amp;#30070;&amp;#22519;&amp;#34892;startActivity()&amp;#32780;&amp;#20351;&amp;#29992;&amp;#27794;&amp;#26377;&amp;#26126;&amp;#30906;&amp;#35373;&amp;#23450;&amp;#30446;&amp;#27161;&amp;#30340;intent,&amp;#37117;&amp;#26371;&amp;#30070;&amp;#20316;&amp;#20182;&lt;br /&gt;  &amp;#33267;&amp;#23569;&amp;#26371;&amp;#26377;&amp;#19968;&amp;#20491;Category: Intent.CATEGORY_DEFAULT&lt;br /&gt;  (&amp;#20063;&amp;#23601;&amp;#26159;&amp;quot;android.intent.category.DEFAULT&amp;quot;)    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;因此若Activity要能夠接收到這intent,則在Mainfest內定義這Activity的intent filter部份需要有Category為"android.intent.category.DEFAULT"的值,才會有可能接收到，也就是說在Manifest內的Activity,至少要有Intent.CATEGORY_DEFAUL(也就是"android.intent.category.DEFAULT")的值，而在已經設定為啟動的Activity內多設定Intent.CATEGORY_DEFAUL,也可以但並無用處&lt;br /&gt;&lt;br /&gt;在filter內設定category值,需設定完整字串值,這部份查Intent Class,因為在xml tag接受的值是字串，而在Java Code內設定intent的Category就可以用Class的常數去書寫&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;七.Intent Test-Data Test&lt;/font&gt;&lt;br /&gt;每個data tag都包含了URI與data type (MIME media type)&lt;br /&gt;而URI會以scheme, host, port,與 path來表示&lt;br /&gt;也就是可以把一個完整的URI看成&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;scheme://host:port/path&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;若host沒指定,則port可略&lt;br /&gt;data type可以用*代表允許任何型態的資料&lt;br /&gt;如text/*" or "audio/*"&lt;br /&gt;例&lt;br /&gt;URI為&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;content://com.example.project:200/folder/subfolder/etc&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;則設定Filter的寫法為 &lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;intent-filter . . . &amp;gt;  &lt;br /&gt;      &amp;lt;data android:mimeType="video/mpeg" android:scheme="content" android:host="com.example.project" android:port="200" android:path="folder/subfolder/etc"/&amp;gt;   &lt;br /&gt;      &amp;lt;data android:mimeType="audio/mpeg" android:scheme="http" . . . /&amp;gt;  &lt;br /&gt;      . . .  &lt;br /&gt; &amp;lt;/intent-filter&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;data在filter與intent內data比對的原則是&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#30070;filter&amp;#20839;&amp;#27794;&amp;#26377;&amp;#35373;&amp;#23450;&amp;#20219;&amp;#20309;data tag,&amp;#32780;intent&amp;#20839;&amp;#20063;&amp;#27794;&amp;#26377;&amp;#35373;&amp;#23450;URI&amp;#33287;data type,&lt;br /&gt;  &amp;#37027;&amp;#36889;test&amp;#23601;&amp;#36890;&amp;#36942;&lt;br /&gt;2.&amp;#30070;filter&amp;#26377;&amp;#35373;&amp;#23450;URI,&amp;#27794;&amp;#26377;&amp;#35373;&amp;#23450;data type,&amp;#32780;intent object&amp;#20063;&amp;#26159;&amp;#21482;&amp;#26377;URI&amp;#27794;&amp;#26377;&lt;br /&gt;  data type,&amp;#36889;&amp;#26178;&amp;#20505;&amp;#36890;&amp;#36942;&amp;#65292;&amp;#36889;&amp;#36890;&amp;#24120;&amp;#21482;&amp;#26371;&amp;#30332;&amp;#29983;&amp;#22312;mailto: &amp;#33287;tel: &amp;#26178;&lt;br /&gt;3.&amp;#30070;filter&amp;#20839;&amp;#21482;&amp;#26377;&amp;#35373;&amp;#23450;data type &amp;#27794;&amp;#26377;&amp;#35373;&amp;#23450;URI,&amp;#32780;intent object&amp;#26377;&amp;#35373;&amp;#23450;&amp;#30456;&amp;#21516;&lt;br /&gt;  &amp;#30340;data type&amp;#28961;URI&amp;#21063;&amp;#36890;&amp;#36942;&lt;br /&gt;4.&amp;#30070;filter&amp;#20839;&amp;#35373;&amp;#23450;&amp;#30340;data type&amp;#33287;URI&amp;#37117;&amp;#33287;intent Object&amp;#20839;&amp;#35373;&amp;#23450;&amp;#30340;&amp;#23565;&amp;#25033;&amp;#21363;&amp;#36890;&amp;#36942;&lt;br /&gt;  &amp;#33509;filter&amp;#20839;&amp;#21482;&amp;#26377;&amp;#35373;&amp;#23450;data type&amp;#32780;URI&amp;#19981;&amp;#35373;&amp;#23450;,&amp;#21482;&amp;#26377;&amp;#22312;intent Object&amp;#20839;&amp;#30340;&lt;br /&gt;  data type&amp;#26377;&amp;#23565;&amp;#25033;&amp;#65292;&amp;#32780;URI&amp;#28858;content: &amp;#25110;file:&amp;#25165;&amp;#26371;&amp;#36890;&amp;#36942;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;八.Example&lt;/font&gt;&lt;br /&gt;&lt;font color='red'&gt;1.設定元件可以顯示local端 任何Image檔案&lt;/font&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;data android:mimeType="image/*" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;當要由local contentProvider顯示檔案,這樣寫即可,不需再指定URI部份用content:或file:&lt;br /&gt;&lt;font color='red'&gt;2.設定允許播放來自internet的任何影片檔&lt;/font&gt; &lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;data android:scheme="http" android:type="video/*" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;當使用者透過web page連結要開啟一個資源,會先使用html page開啟看看,若不行,則會與未指定對象&lt;br /&gt;的intent一樣,去查找哪一個Activity適合去開啟這個資源,若不知道,則會開啟Download Manager去下載&lt;br /&gt;&lt;font color='red'&gt;3.設定啟動預設執行的Activity&lt;/font&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;intent-filter . . . &amp;gt;  &lt;br /&gt;      &amp;lt;action android:name="code android.intent.action.MAIN" /&amp;gt;  &lt;br /&gt;      &amp;lt;category android:name="code android.intent.category.LAUNCHER" /&amp;gt;  &lt;br /&gt; &amp;lt;/intent-filter&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;不需透過任何intent去觸發，在開啟App即會自動執行這個Activity&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;九.Intent與Intent Filter&lt;/font&gt;&lt;br /&gt;Intent Filter的作用，不僅是找出intent所要啟動的元件，還包括了設定元件該出現在Device的相關訊息&lt;br /&gt;例如在Filter內設定了&lt;br /&gt;"android.intent.action.MAIN"與"android.intent.category.LAUNCHER"&lt;br /&gt;這元件會出現在device最上層的Launch清單上&lt;br /&gt;&lt;br /&gt;若元件的filter設定了android.intent.category.HOME"&lt;br /&gt;那這元件就會顯示在Home screen上&lt;br /&gt;&lt;br /&gt;利用PackageManager Class的相關method針對指定intent找出適合的元件&lt;br /&gt;透過query..() method可以讓你找到可以接收指定intent的component&lt;br /&gt;透過resolve..()可以找到最適合接收指定intent的component&lt;br /&gt;例如queryIntentActivities()可以取得所有適合的Activity清單&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-4887278387265783762?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/4887278387265783762/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=4887278387265783762' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4887278387265783762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4887278387265783762'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-intent-filter-intent.html' title='Android Intent Filter-判斷intent傳遞對象'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7993371472543741073</id><published>2010-10-20T18:28:00.009+08:00</published><updated>2010-11-22T11:57:41.057+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Intent物件</title><content type='html'>&lt;font color='blue'&gt;一.說明&lt;/font&gt;&lt;br /&gt;在Android內三個核心元件activities, services, and broadcast receivers，都是靠Intents傳遞訊息來啟動&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;1.啟動Activity&lt;/font&gt;&lt;br /&gt;透過將intent放到 Context.startActivity(intent) 或 Activity.startActivityForResult(intent)內來啟動Activity,或取得一個已存在的Activity去執行。另外可透過Activity.setResult(resultCode,intent)取得由呼叫Activity.startActivityForResult()所回傳的資訊&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;2.啟動Service&lt;/font&gt;&lt;br /&gt;透過放intent到Context.startService(intent),去初始化啟動一個Service，亦可將intent傳給Context.bindService(intent),建立元件與service的連線。&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;3.發布給Broadcast Receivers&lt;/font&gt;&lt;br /&gt;將intent物件傳給任何broadcast methods，可以發布給所有有興趣的broadcast receivers，例如Context.sendBroadcast(), Context.sendOrderedBroadcast(), or Context.sendStickyBroadcast()&lt;br /&gt;&lt;br /&gt;當有intent被發出時(以上3種方式)，Android會找到適合的物件回應這intent，也就是說屬於broadcast的不會去處發到service，而透過startActivity()傳遞的intent只會被Activity接收到&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.Intent Object&lt;/font&gt; &lt;br /&gt;intent物件是一個資訊包,他包括了要接收到這intent的元件所會有興趣的資料，如要執行哪些動作，要用到哪些資料&lt;br /&gt;與Android系統所會有興趣的資料，如哪些類別的元件要來接收這intent，與要如何去啟動目標的Activity&lt;br /&gt;一個Intent物件包含以下資訊&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;1.Component name:ComponentName Class,非必填&lt;/font&gt;&lt;br /&gt;指定需要去處理這個intent的Component,這欄位資料為ComponentName 類別,包括這元件的完整class名稱(如com.oz.)與註冊在manifest內的Applcation package name，可利用 setComponent(), setClass(), or setClassName()寫入，用getComponent()讀取&lt;br /&gt;例&lt;br /&gt;ComponentName cn=intent.getComponent();&lt;br /&gt;cn.getClassName()&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;2.Action:String,非必填&lt;/font&gt;&lt;br /&gt;指定這intent要執行的動作，在Intent Class內已經定義好幾個const代表要執行的動作&lt;br /&gt;如&lt;br /&gt;ACTION_CALL：初始化phone call&lt;br /&gt;ACTION_EDIT:顯示資料讓使用者編輯&lt;br /&gt;可透過setAction() 設定，利用getAction()讀取，若要使用自己定義的Action sring,使用時需加完整的package路徑&lt;br /&gt;如"com.example.project.SHOW_COLOR"&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;3.Data:,非必填&lt;/font&gt;&lt;br /&gt;包含資料的URI與資料的MIME type，不同的Action會需要不同的data type,譬如說&lt;br /&gt;當action是設定Action_EDIT,data欄位會是需要要編輯的文件URI&lt;br /&gt;當action是設定ACTION_CALL,data欄位將會是一個 tel:電話號碼的URI&lt;br /&gt;當action是設定ACTION_VIEW,data欄位會是http:的URI&lt;br /&gt;接收到的Activity就會去下載顯示這URI&lt;br /&gt;&lt;br /&gt;當Activity去處理這些data時,會需要知道他的MIME Type才知道要如何處理&lt;br /&gt;譬如說image檔案就不會有play功能出現&lt;br /&gt;&lt;br /&gt;大多數都能由URI去猜測data type,譬如說，content: 的URI,資料會是在device上，可利用setData() setType() setDataAndType()來設定，而利用getData() and the type by getType()來讀取&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;4.Category:&lt;string&gt; string Set,非必填&lt;/font&gt;&lt;br /&gt;設定那一類型的元件可以去處理這個intent,在一個intent內可以放多個Category&lt;br /&gt;以下已經預定的常數為&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.CATEGORY_BROWSABLE:target Activity&amp;#21487;&amp;#20197;&amp;#34987;browswer&amp;#38283;&amp;#21855;,&lt;br /&gt;  &amp;#22914;email&amp;#25110;image&lt;br /&gt;2.CATEGORY_GADGET:&amp;#36889;Activity&amp;#21487;&amp;#20197;&amp;#23884;&amp;#22312;&amp;#36889;GADGET&amp;#30340;&amp;#21478;&amp;#19968;&amp;#20491;&lt;br /&gt;  Activity&amp;#20839;&lt;br /&gt;3.CATEGORY_HOME:Activity&amp;#26371;&amp;#39023;&amp;#31034;&amp;#22312;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#38283;&amp;#21855;device&amp;#30340;&amp;#31532;&lt;br /&gt;  &amp;#19968;&amp;#20491;&amp;#30059;&amp;#38754;,&amp;#20063;&amp;#23601;&amp;#26159;Home&amp;#25353;&amp;#37397;&amp;#38283;&amp;#21855;&amp;#30340;&amp;#30059;&amp;#38754;&amp;#19978;&lt;br /&gt;4.CATEGORY_LAUNCHER:Activity&amp;#26371;&amp;#34987;&amp;#21015;&amp;#22312;&amp;#26368;&amp;#19978;&amp;#23652;&amp;#30340;launcher&amp;#19978;&lt;br /&gt;5.CATEGORY_PREFERENCE:target Activity&amp;#26159;preference panel&lt;br /&gt;  &amp;#20063;&amp;#23601;&amp;#26159;&amp;#23660;&amp;#26044;preference panel&amp;#25165;&amp;#33021;&amp;#34389;&amp;#29702;&amp;#25509;&amp;#25910;&amp;#36889;intent &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;透過addCategory()加入,透過removeCategory()移除,透過getCategories()取得SET&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;5.Extras:Bundle類別,非必填&lt;/font&gt;&lt;br /&gt;intent要傳遞給元件的其他資訊,會以Key-value pairs型態存在，有一些intent個別會有一些特別的extra資料存在&lt;br /&gt;例如 &lt;br /&gt;ACTION_TIMEZONE_CHANGED 會有一個extra 'time-zone',值是最新的time zone&lt;br /&gt;ACTION_HEADSET_PLUG有 'state' 值為"plugged"或"unplugged"&lt;br /&gt;SHOW_COLOR 會有'color' 值為色碼值&lt;br /&gt;可透過一系列的putXXXExtra()設定,getXXXExtra()取得&lt;br /&gt;或用putExtra(Bundle)設定 getExtra()設定取得&lt;br /&gt;&lt;br /&gt;在intent裡加入Extra有很多方式&lt;br /&gt;可以先產生一個Bundle物件，把所有要加入的值都放到Bundle內&lt;br /&gt;再利用intent.putExtra(bundle)放進去&lt;br /&gt;也可以利用intent.putExtra(string key,string value)加入&lt;br /&gt;putExtra可以呼叫多次，所有加入的值都會被累加到extra物件上&lt;br /&gt;不管加入多少，都可以透過&lt;br /&gt;如 intent.getExtras().getString(stringKey)方式取得資料&lt;br /&gt;&lt;br /&gt;&lt;font color='color'&gt;6.Flags:String,非必填&lt;/font&gt;&lt;br /&gt;通知Android系統如何去啟動這Activity,例如要把這Activity加入到哪個Task內(或是啟動一個新的Task)在Intent Class內已經建好這些相關常數&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7993371472543741073?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7993371472543741073/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7993371472543741073' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7993371472543741073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7993371472543741073'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-intent.html' title='Android Intent物件'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1017930483986286685</id><published>2010-10-20T17:32:00.006+08:00</published><updated>2010-11-22T11:55:51.363+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Resources 資源檔-使用(三)</title><content type='html'>resourceID的值由兩個部份組成type(如string)與name(如hello)&lt;br /&gt;取得Resource的方式&lt;br /&gt;&lt;font color='blue'&gt;一.在Java Code中使用resource&lt;/font&gt;&lt;br /&gt;1.取得resourceID的語法為&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;package_name.R.resource_type.resource_name&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;若在自己專案內package_name可以不用寫&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;R.string.hello&lt;br /&gt;android.R.color.secondary_text_dark&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;2.取得Resource Class&lt;br /&gt;利用 Context.getResources()取得Resource Class&lt;br /&gt;再利用Resource提供的各項method來取得各類型的resource&lt;br /&gt;3.範例   &lt;br /&gt;例1：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Resources res=Context.getResources();&lt;br /&gt;String str=res.getString(R.string.hello)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;例2:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;TextView.setText(rsid:int)&amp;#23601;&amp;#21487;&amp;#30452;&amp;#25509;&amp;#20351;&amp;#29992;,&amp;#29992;&amp;#33258;&amp;#24049;&amp;#25214;&amp;#20986;resources&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;例3：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;imageView.setImageResource(R.drawable.myimage);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='blue'&gt;二.在XML中使用resource&lt;/font&gt;&lt;br /&gt;1.取得resourceID的語法為&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@package_name:resource_type/resource_name&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;如果是在自己專案內的resource就不用寫package_name&lt;br /&gt;在tag內將resourceID指定給tag,tag即會利用resourceID取得資源&lt;br /&gt;2.使用sttle的語法為&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;?package_name:resource_type/resource_name&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.範例 &lt;br /&gt;例1：&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;EditText xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;      android:layout_width="fill_parent"  &lt;br /&gt;      android:layout_height="fill_parent"  &lt;br /&gt;      android:textColor="@android:color/secondary_text_dark"  &lt;br /&gt;      android:text="@string/hello" /&amp;gt;       &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;以上範例,textColor用到android內建的資源,所以用@android:color/secondary_text_dark&lt;br /&gt;而text用到是自己專案內的資源,所以用@string/hello&lt;br /&gt;例2:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;EditText id="text"  &lt;br /&gt;           android:layout_width="fill_parent"  &lt;br /&gt;           android:layout_height="wrap_content"  &lt;br /&gt;           android:textColor="?android:textColorSecondary"  &lt;br /&gt;           android:text="@string/hello_world" /&amp;gt;       &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.使用系統內建resource&lt;/font&gt;&lt;br /&gt;若要使用系統預設的resource，可用android.R取得&lt;br /&gt;注意:R是本身專案的resource檔案，而android.R是系統提供的預設resource檔&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.執行過程中的異動&lt;/font&gt;&lt;br /&gt;當使用者的Device在使用過程中做了變動,譬如說,旋轉或改變語系,系統會因為這樣的改變而將正在進行的Activity進行onDestroy(),然後進行onCreate()重新顯示以套用新的改變。&lt;br /&gt;而在進行onDestroy()前會進行資料儲存動作,好讓重新建立後可以回復資料,其流程如下&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;onSaveInstanceState()-&amp;gt;onDestroy()-&amp;gt;onCreate()-&amp;gt;onRestoreInstanceState()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;其執行方式有以下兩種方式，各有優缺點&lt;br /&gt;&lt;font color='red'&gt;1.保留資訊,自動重新啟動&lt;/font&gt;&lt;br /&gt;當config改變發生時,允許Activity在自動restart,並把狀態資料帶到Activity新的instance上，若要重新建立新的instance,如果資料來源是來自網路,可能會因為重新建立連線而發生更久的時間。&lt;br /&gt;通常用來儲存狀態用的都是bundle物件,但bundle物件並不適合儲存大量資料(如點陣圖)，所以在runtime時要保留資料會是用以下作法&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.Override onRetainNonConfigurationInstance()&amp;#22238;&amp;#20659;&amp;#20320;&amp;#35201;&amp;#20786;&amp;#23384;&lt;br /&gt;  &amp;#30340;&amp;#29289;&amp;#20214;&amp;#65292;onRetainNonConfigurationInstance()&amp;#26371;&amp;#30332;&amp;#29983;&amp;#22312;&lt;br /&gt;  onStop()&amp;#33287;onDestroy()&amp;#20043;&amp;#38291;&lt;br /&gt;2.&amp;#30070;create&amp;#24460;&amp;#21628;&amp;#21483;getLastNonConfigurationInstance()&amp;#21462;&amp;#22238;&amp;#29289;&amp;#20214;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;例&lt;br /&gt;儲存&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@Override&lt;br /&gt;public Object onRetainNonConfigurationInstance() {&lt;br /&gt;    final MyDataObject data = collectMyLoadedData();&lt;br /&gt;    return data;&lt;br /&gt;}    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;取回&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@Override&lt;br /&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;    setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();&lt;br /&gt;    if (data == null) {&lt;br /&gt;        data = loadMyData();&lt;br /&gt;    }&lt;br /&gt;    ...&lt;br /&gt;}    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;2.取得通知，自己手動處理改變的訊息&lt;/font&gt;&lt;br /&gt;當config改變發生時,只發出相關通知，讓使用者自己決定是否要restart，為了效能考量,在部份config發生改變時,並不自動restart Activity,就需要使用者自己手動去處理外觀異動的部份，而無法享受到使用衍生res所帶來的方便&lt;br /&gt;作法如下:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#20808;&amp;#22312;Manifest&amp;#20839;&amp;#35373;&amp;#23450;Activity&amp;#35201;&amp;#30435;&amp;#32893;&amp;#21738;&amp;#20123;&amp;#20107;&amp;#20214;&amp;#35722;&amp;#21270;&lt;br /&gt;2.&amp;#35206;&amp;#23531;onConfigurationChanged(),&amp;#30070;&amp;#26377;config&amp;#25913;&amp;#35722;&amp;#26178;,&lt;br /&gt;  &amp;#36889;&amp;#35041;&amp;#26371;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#26032;&amp;#30340;config&amp;#29289;&amp;#20214;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;例&lt;br /&gt;manifest.xml&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;activity android:name=".MyActivity"  &lt;br /&gt;       android:configChanges="orientation|keyboardHidden"  &lt;br /&gt;       android:label="@string/app_name"&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Activity內&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@Override&lt;br /&gt;public void onConfigurationChanged(Configuration newConfig) {&lt;br /&gt;    super.onConfigurationChanged(newConfig);&lt;br /&gt;    // Checks the orientation of the screen&lt;br /&gt;    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {&lt;br /&gt;        Toast.makeText(this, &amp;quot;landscape&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){&lt;br /&gt;        Toast.makeText(this, &amp;quot;portrait&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;    }&lt;br /&gt;    // Checks whether a hardware keyboard is available&lt;br /&gt;    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {&lt;br /&gt;        Toast.makeText(this, &amp;quot;keyboard visible&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {&lt;br /&gt;        Toast.makeText(this, &amp;quot;keyboard hidden&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;    }&lt;br /&gt;}    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1017930483986286685?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1017930483986286685/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1017930483986286685' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1017930483986286685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1017930483986286685'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-resources_20.html' title='Android Resources 資源檔-使用(三)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1242076627729962770</id><published>2010-10-20T15:19:00.005+08:00</published><updated>2010-11-22T11:55:36.492+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Resources 資源檔-Sample與使用範例(二)</title><content type='html'>&lt;font color='blue'&gt;一.anim/:XML檔案&lt;/font&gt;&lt;br /&gt;定義所有的tween動畫&lt;br /&gt;例:res/anim/hyperspace_jump.xml&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;set xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;      android:shareInterpolator="false"&amp;gt;  &lt;br /&gt;      &amp;lt;scale  &lt;br /&gt;           android:interpolator="@android:anim/accelerate_decelerate_interpolator"  &lt;br /&gt;           android:fromXScale="1.0"   &lt;br /&gt;           android:toXScale="1.4"   &lt;br /&gt;           android:fromYScale="1.0"   &lt;br /&gt;           android:toYScale="0.6"   &lt;br /&gt;           android:pivotX="50%"  &lt;br /&gt;           android:pivotY="50%"  &lt;br /&gt;           android:fillAfter="false"  &lt;br /&gt;           android:duration="700" /&amp;gt;  &lt;br /&gt;      &amp;lt;set  &lt;br /&gt;           android:interpolator="@android:anim/accelerate_interpolator"  &lt;br /&gt;           android:startOffset="700"&amp;gt;  &lt;br /&gt;           &amp;lt;scale  &lt;br /&gt;                android:fromXScale="1.4"   &lt;br /&gt;                android:toXScale="0.0"  &lt;br /&gt;                android:fromYScale="0.6"  &lt;br /&gt;                android:toYScale="0.0"   &lt;br /&gt;                android:pivotX="50%"   &lt;br /&gt;                android:pivotY="50%"   &lt;br /&gt;                android:duration="400" /&amp;gt;  &lt;br /&gt;           &amp;lt;rotate  &lt;br /&gt;                android:fromDegrees="0"   &lt;br /&gt;                android:toDegrees="-45"  &lt;br /&gt;                android:toYScale="0.0"   &lt;br /&gt;                android:pivotX="50%"   &lt;br /&gt;                android:pivotY="50%"  &lt;br /&gt;                android:duration="400" /&amp;gt;  &lt;br /&gt;      &amp;lt;/set&amp;gt;  &lt;br /&gt; &amp;lt;/set&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;在Java內使用動畫&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;ImageView image = (ImageView) findViewById(R.id.image);&lt;br /&gt;Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);&lt;br /&gt;image.startAnimation(hyperspaceJump);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.color/:XML檔案&lt;/font&gt;&lt;br /&gt;定義colors state list,也就是以一個物件的方式設定在各種狀態時的color變化，如button會有各種state的color變化，可將這樣的color state設定成xml&lt;br /&gt;例:res/color/button_text.xml:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;selector xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;  &lt;br /&gt;      &amp;lt;item android:state_pressed="true"  &lt;br /&gt;            android:color="#ffff0000"/&amp;gt; &amp;lt;!-- pressed --&amp;gt;  &lt;br /&gt;      &amp;lt;item android:state_focused="true"  &lt;br /&gt;            android:color="#ff0000ff"/&amp;gt; &amp;lt;!-- focused --&amp;gt;  &lt;br /&gt;      &amp;lt;item android:color="#ff000000"/&amp;gt; &amp;lt;!-- default --&amp;gt;  &lt;br /&gt; &amp;lt;/selector&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;在XML Layout上套用到Button上&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;Button  &lt;br /&gt; android:layout_width="fill_parent"  &lt;br /&gt; android:layout_height="wrap_content"  &lt;br /&gt; android:text="@string/button_text"  &lt;br /&gt; android:textColor="@color/button_text" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.drawable/:bitmap檔案&lt;/font&gt;&lt;br /&gt;包括(.png .9.png .jpg .gif)，或透過XML檔案所描述的圖形，&lt;br /&gt;如State lists,Color drawables,Shapes&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.layout/:XML檔案&lt;/font&gt;&lt;br /&gt;定義使用者使用介面的layout，每一個Layout會相當於我們看到的一個page&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.menu/:XML檔案&lt;/font&gt;&lt;br /&gt;定義該App的menu,例如Options Menu, Context Menu, or Sub Menu&lt;br /&gt;例：res/menu/example_menu.xml:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;  &lt;br /&gt;      &amp;lt;item android:id="@+id/item1"  &lt;br /&gt;            android:title="@string/item1"  &lt;br /&gt;            android:icon="@drawable/group_item1_icon" /&amp;gt;  &lt;br /&gt;      &amp;lt;group android:id="@+id/group"&amp;gt;  &lt;br /&gt;           &amp;lt;item android:id="@+id/group_item1"  &lt;br /&gt;                 android:title="@string/group_item1"  &lt;br /&gt;                 android:icon="@drawable/group_item1_icon" /&amp;gt;  &lt;br /&gt;           &amp;lt;item android:id="@+id/group_item2"  &lt;br /&gt;                 android:title="G@string/group_item2"  &lt;br /&gt;                 android:icon="@drawable/group_item2_icon" /&amp;gt;  &lt;br /&gt;      &amp;lt;/group&amp;gt;  &lt;br /&gt;      &amp;lt;item android:id="@+id/submenu"  &lt;br /&gt;            android:title="@string/submenu_title" &amp;gt;  &lt;br /&gt;           &amp;lt;menu&amp;gt;  &lt;br /&gt;                &amp;lt;item android:id="@+id/submenu_item1"  &lt;br /&gt;                      android:title="@string/submenu_item1" /&amp;gt;  &lt;br /&gt;           &amp;lt;/menu&amp;gt;  &lt;br /&gt;      &amp;lt;/item&amp;gt;  &lt;br /&gt; &amp;lt;/menu&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;在Activity的Java內使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;  MenuInflater inflater = getMenuInflater();&lt;br /&gt;  inflater.inflate(R.menu.example_menu, menu);&lt;br /&gt;  return true;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;六.raw/:任意檔案用他原本的資料格式儲存&lt;/font&gt;&lt;br /&gt;系統不會對檔案做壓縮處理，要開啟這些檔案的InputStream，要透過Resources.openRawResource()呼叫該resourceID(R.raw.filename)取得，若是希望透過原始檔名來取得檔案，建議可以把檔案存在/assets/目錄下&lt;br /&gt;在/assets/目錄下的檔案是沒有resourceID的,都是透過AssetManager來存取&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;七.values/:XML檔案&lt;/font&gt;&lt;br /&gt;包含一些簡單的值設定，如string,color,style，通常會把同類型的寫在一個檔案內&lt;br /&gt;&lt;font color='red'&gt;1.arrays.xml&lt;/font&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;resources&amp;gt;  &lt;br /&gt;      &amp;lt;array name="icons"&amp;gt;  &lt;br /&gt;           &amp;lt;item&amp;gt;@drawable/home&amp;lt;/item&amp;gt;  &lt;br /&gt;           &amp;lt;item&amp;gt;@drawable/settings&amp;lt;/item&amp;gt;  &lt;br /&gt;           &amp;lt;item&amp;gt;@drawable/logout&amp;lt;/item&amp;gt;  &lt;br /&gt;      &amp;lt;/array&amp;gt;  &lt;br /&gt;      &amp;lt;array name="colors"&amp;gt;  &lt;br /&gt;           &amp;lt;item&amp;gt;#FFFF0000&amp;lt;/item&amp;gt;  &lt;br /&gt;           &amp;lt;item&amp;gt;#FF00FF00&amp;lt;/item&amp;gt;  &lt;br /&gt;           &amp;lt;item&amp;gt;#FF0000FF&amp;lt;/item&amp;gt;  &lt;br /&gt;      &amp;lt;/array&amp;gt;  &lt;br /&gt; &amp;lt;/resources&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;JAVA使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Resources res = getResources();&lt;br /&gt;TypedArray icons = res.obtainTypedArray(R.array.icons);&lt;br /&gt;Drawable drawable = icons.getDrawable(0);&lt;br /&gt;TypedArray colors = res.obtainTypedArray(R.array.icons);&lt;br /&gt;int color = colors.getColor(0,0);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;2.colors.xml&lt;/font&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;resources&amp;gt;  &lt;br /&gt;   &amp;lt;color name="opaque_red"&amp;gt;#f00&amp;lt;/color&amp;gt;  &lt;br /&gt;   &amp;lt;color name="translucent_red"&amp;gt;#80ff0000&amp;lt;/color&amp;gt;  &lt;br /&gt; &amp;lt;/resources&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;JAVA使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Resources res = getResources();&lt;br /&gt;int color = res.getColor(R.color.opaque_red);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;XML使用&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;TextView  &lt;br /&gt; android:layout_width="fill_parent"  &lt;br /&gt; android:layout_height="wrap_content"  &lt;br /&gt; android:textColor="@color/translucent_red"  &lt;br /&gt; android:text="Hello"/&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;3.dimens.xml&lt;/font&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;resources&amp;gt;  &lt;br /&gt;      &amp;lt;dimen name="textview_height"&amp;gt;25dp&amp;lt;/dimen&amp;gt;  &lt;br /&gt;      &amp;lt;dimen name="textview_width"&amp;gt;150dp&amp;lt;/dimen&amp;gt;  &lt;br /&gt;      &amp;lt;dimen name="ball_radius"&amp;gt;30dp&amp;lt;/dimen&amp;gt;  &lt;br /&gt;      &amp;lt;dimen name="font_size"&amp;gt;16sp&amp;lt;/dimen&amp;gt;  &lt;br /&gt; &amp;lt;/resources&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Java使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Resources res = getResources();&lt;br /&gt;float fontSize = res.getDimension(R.dimen.font_size);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;XML使用&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;TextView  &lt;br /&gt; android:layout_height="@dimen/textview_height"  &lt;br /&gt; android:layout_width="@dimen/textview_width"  &lt;br /&gt; android:textSize="@dimen/sixteen_sp"/&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;4.string.xml&lt;/font&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;resources&amp;gt;  &lt;br /&gt;      &amp;lt;string name="hello"&amp;gt;Hello!&amp;lt;/string&amp;gt;  &lt;br /&gt; &amp;lt;/resources&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;JAVA使用&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;String string = getString(R.string.hello);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;XML使用&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;TextView  &lt;br /&gt; android:layout_width="fill_parent"  &lt;br /&gt; android:layout_height="wrap_content"  &lt;br /&gt; android:text="@string/hello" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='red'&gt;5.style.xml&lt;/font&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;resources&amp;gt;  &lt;br /&gt;      &amp;lt;style name="CustomText" parent="@style/Text"&amp;gt;  &lt;br /&gt;           &amp;lt;item name="android:textSize"&amp;gt;20sp&amp;lt;/item&amp;gt;  &lt;br /&gt;           &amp;lt;item name="android:textColor"&amp;gt;#008&amp;lt;/item&amp;gt;  &lt;br /&gt;      &amp;lt;/style&amp;gt;  &lt;br /&gt; &amp;lt;/resources&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;XML使用&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;EditText  &lt;br /&gt;      style="@style/CustomText"  &lt;br /&gt;      android:layout_width="fill_parent"  &lt;br /&gt;      android:layout_height="wrap_content"  &lt;br /&gt;      android:text="Hello, World!" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;八.xml/:任何其他的xml檔案放在這目錄&lt;/font&gt;&lt;br /&gt;以Resource.getXML()讀取，各式的XML設定檔config都放在這目錄下&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1242076627729962770?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1242076627729962770/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1242076627729962770' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1242076627729962770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1242076627729962770'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-resources-sample.html' title='Android Resources 資源檔-Sample與使用範例(二)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7063381474002034787</id><published>2010-10-20T14:36:00.009+08:00</published><updated>2010-11-22T11:55:20.359+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android Resources 資源檔-基本概念(一)</title><content type='html'>&lt;font color='blue'&gt;一.說明&lt;/font&gt;&lt;br /&gt;在Android下會需要用到的各種資源都會放在res/目錄下，包括版面,圖片，文字字串，資料陣列，顏色...等各式實體內容都會放在這目錄下，而在res/下主要了包含以下8個目錄，分別代表8種不同類型的resource&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.anim/:XML&amp;#27284;&amp;#26696;,&amp;#12560;&amp;#23450;&amp;#32681;&amp;#25152;&amp;#26377;&amp;#30340;tween&amp;#21205;&amp;#30059;&lt;br /&gt;2.color/:XML&amp;#27284;&amp;#26696;,&amp;#23450;&amp;#32681;colors state list,&amp;#20063;&amp;#23601;&amp;#26159;&amp;#20197;&amp;#19968;&amp;#20491;&amp;#29289;&amp;#20214;&amp;#30340;&lt;br /&gt;  &amp;#26041;&amp;#24335;&amp;#35373;&amp;#23450;&amp;#22312;&amp;#21508;&amp;#31278;&amp;#29376;&amp;#24907;&amp;#26178;&amp;#30340;color&amp;#35722;&amp;#21270;&lt;br /&gt;3.drawable/:bitmap&amp;#27284;&amp;#26696;,&amp;#21253;&amp;#25324;(.png .9.png .jpg .gif)&lt;br /&gt;4.layout/:XML&amp;#27284;&amp;#26696;,&amp;#23450;&amp;#32681;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#20351;&amp;#29992;&amp;#20171;&amp;#38754;&amp;#30340;layout&lt;br /&gt;5.menu/:XML&amp;#27284;&amp;#26696;,&amp;#23450;&amp;#32681;&amp;#35442;App&amp;#30340;menu,&amp;#20363;&amp;#22914;Options Menu, Context Menu, or Sub Menu&lt;br /&gt;6.raw/:&amp;#20219;&amp;#24847;&amp;#27284;&amp;#26696;&amp;#29992;&amp;#20182;&amp;#21407;&amp;#26412;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#26684;&amp;#24335;&amp;#20786;&amp;#23384;&lt;br /&gt;7.values/:&amp;#21253;&amp;#21547;&amp;#19968;&amp;#20123;&amp;#31777;&amp;#21934;&amp;#30340;&amp;#20540;&amp;#35373;&amp;#23450;&amp;#65292;&amp;#22914;string,color,style&lt;br /&gt;8.xml/:&amp;#20219;&amp;#20309;&amp;#20854;&amp;#20182;&amp;#30340;xml&amp;#27284;&amp;#26696;&amp;#25918;&amp;#22312;&amp;#36889;&amp;#30446;&amp;#37636;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.作業原理&lt;/font&gt;&lt;br /&gt;在Android將整個專案Compile時,會將所有在res/目錄下的資源都會被Compile成一個R Class，而在res下的各種類型，則會成為R的subClass 如R.string R.drawable都是一個 class 。所以透過R Class可以讓你直接找到資源的resourceID,再利用resourceID來取到resource實體內容。無論資料內容是任何類型的資料,resourceID都只是個int值,而非實體資料內容，要取得實體內容,都需要依照要取得的resource類型,透過resourceID來取得&lt;br /&gt;例如&lt;br /&gt;在res/values/strings.xml內有一筆&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;string name='hello'&amp;gt;測試&amp;lt;/string&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;因此R.string.hello即是這筆資料的resourceID，透過getString()才能取得真正的內容&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;String string = getString(R.string.hello);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.R下SubClass&lt;/font&gt;&lt;br /&gt;R下面的subclass,並非由各目錄的名稱或xml檔案名稱所訂,而是對應到資料類型。譬如說R.string這個次類別,string是來自於strings.xml內有&lt;string&gt;tag，至於這tag所依附的xml檔名,是可以任意的設定(並非一定要設成strings.xml)&lt;br /&gt;也可以把不同類型的資料放到同一個xml檔案內,只是通常會把相同資源放在同一個xml檔案內，方便管理&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.res下更多的衍生類別目錄&lt;/font&gt;&lt;br /&gt;除了標準的八種類型目錄外，在res下可以看到更多的其他衍生出來的目錄。&lt;br /&gt;譬如說有layout/ 也可看到layout-land/目錄，這些衍生出來的目錄,都是因應可以讓你開發的應用程式,可以因偵測到使用者device的條件不同，而提供有不同的使用介面與設定,包括解析度尺寸不同,或多語系,都可設定各自的顯視介面，這些目錄名稱的命名都是有規則的,在規則性的命名下,Android系統即會自動判斷要取用哪個目錄下的資源，來顯示在使用者的Device上&lt;br /&gt;&lt;br /&gt;例如&lt;br /&gt;在res/下除了有一個 layout/目錄提供標準的版面給使用者外，另外還有一個layout-land/目錄提供給橫向螢幕使用，也就是說當使用者以直式使用時,畫面上是以layout/目錄下的設定來顯示，當使用者把device轉向成橫式時,就會自動切換到以layout-land/目錄下的設定顯示&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;五.res衍生目錄命名規則&lt;/font&gt;&lt;br /&gt;目錄名稱命名方式為resources_name-config_qualifier&lt;br /&gt;resources_name：即原來資源類型的名稱，如string,color,array,...&lt;br /&gt;config_qualifier:依照各類型資源各有不同的值可用&lt;br /&gt;例如:&lt;br /&gt;以Screen orientation螢幕方向來分,config_qualifier允許的值為port直,land橫&lt;br /&gt;res/layout:一般標準layout&lt;br /&gt;res/layout-land:針對橫向時用的layout&lt;br /&gt;&lt;br /&gt;幾個常見的config_qualifier包括&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.Language:&amp;#29992;&amp;#20358;&amp;#20786;&amp;#23384;&amp;#20381;&amp;#29031;&amp;#19981;&amp;#21516;&amp;#35486;&amp;#31995;&amp;#22320;&amp;#21312;&amp;#25152;&amp;#25552;&amp;#20379;&amp;#30340;resource&lt;br /&gt;  &amp;#20363; &amp;#20540;:en ,fr,tw,cn&lt;br /&gt;  &amp;#29986;&amp;#29983;&amp;#30340;&amp;#30446;&amp;#37636;&amp;#26371;&amp;#26159;&lt;br /&gt;  values-tw/&lt;br /&gt;2.Screen size:&amp;#34722;&amp;#24149;&amp;#35299;&amp;#26512;&amp;#24230;&lt;br /&gt;  &amp;#20540;:small,normal,large&lt;br /&gt;3.Wider/taller screens:&amp;#34722;&amp;#24149;&amp;#24418;&amp;#29376;,&amp;#38263;&amp;#24418;&amp;#25110;&amp;#19968;&amp;#33324;&lt;br /&gt;  &amp;#20540;:long,notlong&lt;br /&gt;4.Screen orientation:&amp;#34722;&amp;#24149;&amp;#26159;&amp;#30452;&amp;#24335;&amp;#25110;&amp;#27243;&amp;#24335;&lt;br /&gt;  &amp;#20540;:port&amp;#30452;,land&amp;#27243;&lt;br /&gt;5.Dock mode&amp;#65306;&amp;#19968;&amp;#33324;&amp;#25110;&amp;#36554;&amp;#19978;&amp;#27169;&amp;#24335; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;可以用多個config_qualifier串接如 drawable-port-hdpi/，但順序需依照規格書內列表的順序描述 &lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;六.res衍生目錄需要用到重複資源的處理方式&lt;/font&gt;&lt;br /&gt;當有一份resource(例如圖檔),要給多種設定檔使用,可以不用copy到每個folder各有一份，只需要建立Alias即可,並非所有resource都可提供Alias機制，如animation, menu, raw, 與其他在xml/ 目錄下的都不行&lt;br /&gt;1.drawable 圖檔&lt;br /&gt;例:如果有一張圖檔icon.png原本放在drawable目錄下,要給多個設定檔使用&lt;br /&gt;但又不希望直接copy檔案到各目錄&lt;br /&gt;&lt;br /&gt;1.將icon.png rename為 icon_oz.png(只要不是原檔名就好) &lt;br /&gt;將檔案放到drawable/目錄下     &lt;br /&gt;2.產生一個icon.xml檔案&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;bitmap xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;      android:src="@drawable/icon_oz" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;放到各drawable-xxx/目錄下&lt;br /&gt;3.使用上用&lt;br /&gt;R.drawable.icon可取得 &lt;br /&gt;2.layout&lt;br /&gt;例:有一份layout要提供多個設定檔使用&lt;br /&gt;1.將原layout main.xml 改名為main_oz.xml&lt;br /&gt;放到res/layout/&lt;br /&gt;2.產生一個main.xml&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;merge&amp;gt;  &lt;br /&gt;      &amp;lt;include layout="@layout/main_oz"/&amp;gt;  &lt;br /&gt; &amp;lt;/merge&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;放到各目錄下&lt;br /&gt;3.使用上&lt;br /&gt;R.layout.main&lt;br /&gt;3.string或其他&lt;br /&gt;在要alias的項目填上對應資料即可&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;resources&amp;gt;  &lt;br /&gt;      &amp;lt;string name="hello"&amp;gt;Hello&amp;lt;/string&amp;gt;  &lt;br /&gt;      &amp;lt;string name="hi"&amp;gt;@string/hello&amp;lt;/string&amp;gt;  &lt;br /&gt; &amp;lt;/resources&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7063381474002034787?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7063381474002034787/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7063381474002034787' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7063381474002034787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7063381474002034787'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android-resources.html' title='Android Resources 資源檔-基本概念(一)'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-316313452689870235</id><published>2010-10-19T16:31:00.001+08:00</published><updated>2010-11-22T11:57:12.059+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev Guide'/><title type='text'>Android基本概念</title><content type='html'>&lt;font color='blue'&gt;一.基本概念&lt;/font&gt;&lt;br /&gt;Android Application是使用Java開發，compile成Java code，再利用Appt Tool將相關的resource包裝成apk檔，讓使用者可以下載安裝到他的device上，每個Application會以下列方式在系統執行。&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.&amp;#27599;&amp;#20491;App&amp;#36305;&amp;#33258;&amp;#24049;&amp;#29544;&amp;#31435;&amp;#30340;Linux Process,&amp;#22312;&amp;#19981;&amp;#20351;&amp;#29992;&amp;#26178;&amp;#38364;&amp;#38281;&lt;br /&gt;2.&amp;#27599;&amp;#20491;Process&amp;#26377;&amp;#33258;&amp;#24049;&amp;#30340;VM,&amp;#25152;&amp;#20197;Ap&amp;#26159;&amp;#22312;&amp;#19968;&amp;#20491;&amp;#23436;&amp;#20840;&amp;#38548;&amp;#38626;&amp;#30340;&amp;#29872;&amp;#22659;&amp;#19979;&amp;#36939;&amp;#20316;&lt;br /&gt;3.&amp;#38928;&amp;#35373;&amp;#27599;&amp;#20491;App&amp;#25351;&amp;#23450;&amp;#19968;&amp;#20491;&amp;#21807;&amp;#19968;&amp;#30340;Linux user ID&amp;#65292;App file&amp;#21482;&amp;#20801;&amp;#35377;&amp;#35442;&lt;br /&gt;  App&amp;#33287;&amp;#35442;User&amp;#20351;&amp;#29992;&amp;#65292;&amp;#33509;&amp;#35201;&amp;#35731;&amp;#19981;&amp;#21516;&amp;#30340;App&amp;#20849;&amp;#29992;&amp;#36039;&amp;#26009;&amp;#21063;&amp;#35201;&amp;#35373;&amp;#23450;&amp;#30456;&amp;#21516;&amp;#30340;&lt;br /&gt;  User ID&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;二.元件&lt;/font&gt;&lt;br /&gt;Android一個相當重要的特性是，每個App內包含了許多的元件，每個元件的功能都可以提供其他的App使用，你所開發的App想要使用其他App已經開發好的功能元件，不需要在程式內全部包進來或是去link它，也就是說系統會自行判斷，可以任何需要的時候去啟動任何Application的任何部份功能。&lt;br /&gt;&lt;br /&gt;Android App並沒有一個單一的程式進入點(如main())，而是存在著以下四種元件，在必要時就實體化來使用執行&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.Activities&lt;br /&gt;    &amp;#27599;&amp;#20491;Activity&amp;#37117;&amp;#32380;&amp;#25215;&amp;#33258;Activity Class&amp;#12290;&lt;br /&gt;    Activity&amp;#36000;&amp;#36012;&amp;#25552;&amp;#20379;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#20171;&amp;#38754;&amp;#35731;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#25805;&amp;#20316;&amp;#33287;&amp;#20114;&amp;#21205;&amp;#12290;&lt;br /&gt;    &amp;#19968;&amp;#20491;App&amp;#21487;&amp;#20197;&amp;#21253;&amp;#21547;&amp;#19968;&amp;#21040;&amp;#22810;&amp;#20491;Activity,&amp;#22312;App&amp;#36215;&amp;#22987;&amp;#26178;&amp;#21855;&amp;#21205;&amp;#65292;&amp;#19968;&amp;#20491;&lt;br /&gt;    Activity&amp;#65292;&amp;#20877;&amp;#30001;&amp;#24050;&amp;#38283;&amp;#21855;&amp;#30340;Activity&amp;#21435;&amp;#38283;&amp;#21855;&amp;#20854;&amp;#20182;&amp;#30340;Activity&amp;#12290;&lt;br /&gt;    &amp;#27599;&amp;#20491;Activity&amp;#37117;&amp;#26371;&amp;#21253;&amp;#21547;&amp;#19968;&amp;#20491;Window&amp;#29992;&amp;#20358;&amp;#39023;&amp;#31034;&amp;#30059;&amp;#38754;&amp;#65292;&amp;#38928;&amp;#35373;window&amp;#26371;&lt;br /&gt;    &amp;#22635;&amp;#28415;&amp;#25972;&amp;#20491;screen(&amp;#25163;&amp;#27231;)&amp;#65292;&amp;#20294;window&amp;#21487;&amp;#20197;&amp;#35373;&amp;#23450;&amp;#30340;&amp;#26356;&amp;#23567;&amp;#25110;&amp;#28014;&amp;#21205;&amp;#22312;&amp;#20854;&amp;#20182;&lt;br /&gt;    window&amp;#19978;&amp;#65292;&amp;#20363;&amp;#22914;popup window&amp;#65292;window&amp;#19978;&amp;#25152;&amp;#25918;&amp;#30340;&amp;#29289;&amp;#20214;&amp;#37117;&amp;#26159;&amp;#32380;&amp;#25215;&amp;#33258;&lt;br /&gt;    View Class&amp;#65292;&amp;#27599;&amp;#20491;view&amp;#37117;&amp;#20308;&amp;#25818;&amp;#33879;window&amp;#20839;&amp;#30340;&amp;#19968;&amp;#20491;&amp;#30697;&amp;#24418;&amp;#21312;&amp;#22602;&amp;#65292;&amp;#19978;&amp;#23652;&lt;br /&gt;    &amp;#30340;view&amp;#36000;&amp;#36012;&amp;#20854;&amp;#23376;&amp;#20803;&amp;#32032;&amp;#30340;layout&amp;#23433;&amp;#25490;&amp;#65292;&amp;#32780;&amp;#26368;&amp;#24213;&amp;#23652;&amp;#30340;child view&amp;#21063;&amp;#36000;&lt;br /&gt;    &amp;#36012;&amp;#30452;&amp;#25509;&amp;#22238;&amp;#25033;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#30340;&amp;#21205;&amp;#20316;&amp;#33287;&amp;#36664;&amp;#20837;&amp;#65292;&amp;#21033;&amp;#29992;Activity.setContentView()&lt;br /&gt;    &amp;#35373;&amp;#23450;Activity&amp;#26368;&amp;#19978;&amp;#23652;&amp;#20351;&amp;#29992;&amp;#30340;View&lt;br /&gt;    &lt;br /&gt;2.Services&lt;br /&gt;    Service&amp;#25552;&amp;#20379;&amp;#19968;&amp;#20491;&amp;#21487;&amp;#20197;&amp;#22312;&amp;#32972;&amp;#26223;&amp;#23450;&amp;#26178;&amp;#22519;&amp;#34892;&amp;#65292;&amp;#28961;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#20171;&amp;#38754;&amp;#30340;&amp;#26381;&amp;#21209;&amp;#12290;&lt;br /&gt;    &amp;#35692;&amp;#22914;&amp;#35498;&amp;#22312;&amp;#32972;&amp;#26223;&amp;#25773;&amp;#25918;&amp;#38899;&amp;#27138;&amp;#65292;&amp;#25110;&amp;#26159;&amp;#22312;internet&amp;#19978;&amp;#21462;&amp;#24471;&amp;#36039;&amp;#26009;&amp;#25552;&amp;#20379;&amp;#32102;&lt;br /&gt;    Activity&amp;#20351;&amp;#29992;&amp;#12290;    &lt;br /&gt;    &lt;br /&gt;3.Broadcast receivers&lt;br /&gt;    &amp;#32380;&amp;#25215;&amp;#33258;BroadcastReceiver Class&lt;br /&gt;    Broadcast receiver &amp;#26159;&amp;#29992;&amp;#20358;&amp;#25509;&amp;#25910;&amp;#24291;&amp;#25773;&amp;#30340;&amp;#35338;&amp;#24687;&amp;#20006;&amp;#20570;&amp;#22238;&amp;#25033;&amp;#65292;&amp;#35377;&amp;#22810;&amp;#30340;&lt;br /&gt;    &amp;#24291;&amp;#25773;&amp;#26159;&amp;#20358;&amp;#33258;&amp;#26044;&amp;#31995;&amp;#32113;&amp;#65292;&amp;#35692;&amp;#22914;&amp;#35498;&amp;#26178;&amp;#21312;&amp;#25913;&amp;#35722;&amp;#12289;&amp;#38651;&amp;#27744;&amp;#38651;&amp;#21147;&amp;#19981;&amp;#36275;&amp;#25110;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#25913;&lt;br /&gt;    &amp;#35722;&amp;#35486;&amp;#31995;&amp;#31561;&amp;#65292;&amp;#21478;&amp;#22806;&amp;#24291;&amp;#25773;&amp;#20063;&amp;#21487;&amp;#20358;&amp;#33258;&amp;#26044;App&amp;#30340;&amp;#20854;&amp;#20182;&amp;#20803;&amp;#20214;&amp;#25152;&amp;#30332;&amp;#20986;&amp;#20358;&amp;#65292;&amp;#20363;&amp;#22914;&lt;br /&gt;    App&amp;#22312;&amp;#19979;&amp;#36617;&amp;#23436;&amp;#36039;&amp;#26009;&amp;#21487;&amp;#20197;&amp;#25552;&amp;#20379;&amp;#32102;&amp;#20854;&amp;#20182;App&amp;#20351;&amp;#29992;&amp;#26178;&amp;#65292;&amp;#21487;&amp;#20197;&amp;#36879;&amp;#36942;&amp;#24291;&amp;#25773;&amp;#35731;&amp;#20854;&lt;br /&gt;    &amp;#20182;App&amp;#30340;Broadcast receiver&amp;#21487;&amp;#20197;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#20006;&amp;#20351;&amp;#29992;&lt;br /&gt;    &lt;br /&gt;    Broadcast receiver&amp;#27794;&amp;#26377;UI&amp;#65292;&amp;#20294;&amp;#20182;&amp;#21487;&amp;#21855;&amp;#21205;Activity&amp;#21435;&amp;#39023;&amp;#31034;&amp;#22238;&amp;#25033;&amp;#65292;&lt;br /&gt;    &amp;#25110;&amp;#20351;&amp;#29992;NotificationManager&amp;#21435;&amp;#25552;&amp;#31034;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#12290;&lt;br /&gt;    Notification&amp;#21487;&amp;#20197;&amp;#26159;device&amp;#25391;&amp;#21205;&amp;#12289;&amp;#25110;&amp;#26159;&amp;#38275;&amp;#29197;...&amp;#25773;&amp;#25918;&amp;#38899;&amp;#25928;&amp;#31561;&amp;#21487;&amp;#20197;&lt;br /&gt;    &amp;#21560;&amp;#24341;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#27880;&amp;#24847;&amp;#65292;&amp;#36890;&amp;#24120;&amp;#37117;&amp;#26371;&amp;#22312;&amp;#34722;&amp;#24149;&amp;#19978;&amp;#25918;&amp;#19968;&amp;#20491;icon&amp;#65292;&amp;#30070;Broadcast&lt;br /&gt;    receiver&amp;#25509;&amp;#25910;&amp;#21040;&amp;#35338;&amp;#24687;&amp;#35201;&amp;#25552;&amp;#31034;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#65292;&amp;#21487;&amp;#20197;&amp;#29992;NotificationManager&lt;br /&gt;    &amp;#35731;icon&amp;#26377;&amp;#25152;&amp;#35722;&amp;#21270;    &lt;br /&gt;    &lt;br /&gt;4.Content providers&lt;br /&gt;    &amp;#32380;&amp;#25215;&amp;#33258;ContentProvider&lt;br /&gt;    Content provider&amp;#25552;&amp;#20379;&amp;#21487;&amp;#20197;&amp;#35731;&amp;#20854;&amp;#20182;App&amp;#20351;&amp;#29992;&amp;#30340;data&amp;#65292;data&amp;#21487;&amp;#20197;&amp;#29992;&lt;br /&gt;    file&amp;#25110;sqlite&amp;#24418;&amp;#24335;&amp;#20786;&amp;#23384;&amp;#65292;&amp;#25552;&amp;#20379;&amp;#35731;&amp;#20854;&amp;#20182;App&amp;#21487;&amp;#20197;&amp;#35712;&amp;#21462;&amp;#33287;&amp;#20786;&amp;#23384;&amp;#36039;&amp;#26009;&amp;#30340;&lt;br /&gt;    &amp;#26041;&amp;#27861;&amp;#12290;App&amp;#20006;&amp;#19981;&amp;#33021;&amp;#30452;&amp;#25509;&amp;#21628;&amp;#21483;ContentProvider&amp;#30340;method&amp;#65292;&amp;#32780;&amp;#26159;&amp;#38656;&amp;#35201;&lt;br /&gt;    &amp;#36879;&amp;#36942;ContentResolver&amp;#29289;&amp;#20214;&amp;#20358;&amp;#21628;&amp;#21483;ContentProvider&amp;#12290;&lt;br /&gt;    ContentResolver&amp;#21487;&amp;#20197;&amp;#36319;&amp;#20219;&amp;#20309;&amp;#30340;ContentProvider&amp;#20570;&amp;#28317;&amp;#36890;&amp;#65292;&amp;#21033;&amp;#29992;&amp;#20182;&lt;br /&gt;    &amp;#20358;&amp;#31649;&amp;#29702;&amp;#20839;&amp;#37096;&amp;#31243;&amp;#24207;&amp;#19978;&amp;#30340;&amp;#28317;&amp;#36890;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;三.使用intent啟動元件&lt;/font&gt; &lt;br /&gt;除了ContentProvider是透過ContentResolver來驅動使用外，其他三種元件的啟動都是透過Intent來啟動，一個intent物件是包含了要執行的內容資訊。對activities 與 services來說，intent包含了要執行的action與要用的data URI，譬如開啟圖片的連結位置等資訊，對Broadcast receiver來說，包含了要發布的action，例如當相機按鈕被按下時，將這按下按鈕的訊息發布給接收者&lt;br /&gt;&lt;br /&gt;以下是各種元件的啟動方式&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.Activity&lt;br /&gt;    &amp;#36879;&amp;#36942;&amp;#20659;&amp;#36958;intent&amp;#29289;&amp;#20214;&amp;#32102;Context.startActivity()&amp;#20358;&amp;#21855;&amp;#21205;&amp;#12290;&amp;#25509;&amp;#25910;&lt;br /&gt;    &amp;#21040;&amp;#36889;intent&amp;#30340;Activity&amp;#65292;&amp;#22312;Activity&amp;#20839;&amp;#21487;&amp;#20197;&amp;#36879;&amp;#36942;getIntent()&amp;#21462;&lt;br /&gt;    &amp;#24471;&amp;#35442;intent&amp;#36039;&amp;#26009;&amp;#12290;    &lt;br /&gt;    &amp;#19968;&amp;#20491;Activity&amp;#36890;&amp;#24120;&amp;#26159;&amp;#30001;&amp;#21478;&amp;#19968;&amp;#20491;Activity&amp;#25152;&amp;#35320;&amp;#30332;&amp;#65292;&amp;#22914;&amp;#26524;&amp;#22312;&amp;#35320;&amp;#30332;&amp;#30340;&lt;br /&gt;    Activity&amp;#24460;&amp;#24819;&amp;#35201;&amp;#24471;&amp;#21040;&amp;#22238;&amp;#20659;&amp;#36039;&amp;#26009;&amp;#65292;&amp;#21063;&amp;#25913;&amp;#29992;&lt;br /&gt;    Activity.startActivityForResult()&amp;#20358;&amp;#21855;&amp;#21205;Activity&amp;#12290;&lt;br /&gt;    &amp;#20363;&amp;#22914;&amp;#35201;&amp;#21855;&amp;#21205;&amp;#21478;&amp;#19968;&amp;#20491;Activity&amp;#35731;&amp;#20351;&amp;#29992;&amp;#32773;&amp;#21487;&amp;#20197;&amp;#36984;&amp;#21462;&amp;#22294;&amp;#29255;&amp;#65292;&amp;#30070;&amp;#20351;&amp;#29992;&amp;#32773;&lt;br /&gt;    &amp;#36984;&amp;#22909;&amp;#24460;&amp;#65292;&amp;#24076;&amp;#26395;&amp;#25226;&amp;#36984;&amp;#22909;&amp;#30340;&amp;#22294;&amp;#29255;&amp;#22238;&amp;#20659;&amp;#22238;&amp;#20358;&amp;#65292;&amp;#22238;&amp;#20659;&amp;#30340;&amp;#36039;&amp;#26009;&amp;#26371;&amp;#26159;&amp;#29992;intent&lt;br /&gt;    &amp;#29289;&amp;#20214;&amp;#34987;&amp;#22238;&amp;#20659;&amp;#21040;&amp;#21407;&amp;#21628;&amp;#21483;&amp;#32773;&amp;#30340;onActivityResult()&amp;#20839;&lt;br /&gt;2.Service&lt;br /&gt;    &amp;#36879;&amp;#36942;&amp;#20659;&amp;#36958;intent&amp;#21040; Context.startService()&amp;#20839;&amp;#25110;&amp;#26159;&amp;#21628;&amp;#21483;Service&lt;br /&gt;    &amp;#30340;onStart()&amp;#20358;&amp;#21855;&amp;#21205;Service&amp;#12290;&lt;br /&gt;    &amp;#21516;&amp;#27171;&amp;#30340;&amp;#21487;&amp;#20197;&amp;#23559;intent&amp;#20659;&amp;#32102;Context.bindService()&amp;#22312;&amp;#20803;&amp;#20214;&amp;#33287;Service&lt;br /&gt;    &amp;#38291;&amp;#24314;&amp;#31435;&amp;#19968;&amp;#20491;&amp;#25345;&amp;#32396;&amp;#24615;&amp;#30340;&amp;#36899;&amp;#32218;&amp;#65292;&amp;#30070;&amp;#24314;&amp;#31435;&amp;#36899;&amp;#32218;&amp;#26178;&amp;#65292;&amp;#31995;&amp;#32113;&amp;#21363;&amp;#26371;&amp;#33258;&amp;#21205;&amp;#35320;&amp;#30332;&lt;br /&gt;    Service&amp;#20839;&amp;#30340;onBind(),&amp;#21516;&amp;#26178;&amp;#25226;intent&amp;#29289;&amp;#20214;&amp;#19999;&amp;#32102;onBind()&amp;#65292;&amp;#33509;&amp;#22312;&amp;#21628;&lt;br /&gt;    &amp;#21483;onBind&amp;#26178;,&amp;#33509;&amp;#36996;&amp;#27794;&amp;#24314;&amp;#31435;&amp;#36899;&amp;#32218;,&amp;#21063;&amp;#26371;&amp;#33258;&amp;#21205;&amp;#21628;&amp;#21483;bindService()&amp;#24314;&amp;#31435;&amp;#65292;&lt;br /&gt;    &amp;#25509;&amp;#19979;&amp;#20358;&amp;#23601;&amp;#21487;&amp;#20197;&amp;#20351;&amp;#29992;Service&amp;#26412;&amp;#36523;&amp;#30340;method&amp;#20358;&amp;#29992;&lt;br /&gt;3.Broadcast receiver&lt;br /&gt;     &amp;#36879;&amp;#36942;&amp;#20659;&amp;#36958;intent&amp;#21040;Context.sendBroadcast()&amp;#12289;Context.sendOrderedBroadcast()&amp;#65292;&lt;br /&gt;     &amp;#33287;Context.sendStickyBroadcast()&amp;#65292;&amp;#23601;&amp;#21487;&amp;#20197;&amp;#25226;intent&amp;#21253;&amp;#22909;&amp;#30340;&amp;#35338;&amp;#24687;&lt;br /&gt;     &amp;#24291;&amp;#25773;&amp;#20986;&amp;#21435;&amp;#65292;&amp;#31995;&amp;#32113;&amp;#23601;&amp;#26371;&amp;#33258;&amp;#21205;&amp;#35320;&amp;#30332;&amp;#26377;&amp;#33288;&amp;#36259;&amp;#30340;Broadcast receiver&amp;#20839;&amp;#37096;&amp;#30340;&lt;br /&gt;     onReceive()&amp;#65292;&amp;#21516;&amp;#26178;onReceive()&amp;#26371;&amp;#25509;&amp;#25910;&amp;#21040;&amp;#36889;&amp;#20491;intent&amp;#29289;&amp;#20214;&amp;#22312;&amp;#20570;&amp;#24460;&amp;#32396;&lt;br /&gt;     &amp;#30340;&amp;#34389;&amp;#29702;&amp;#31243;&amp;#24207;    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;四.關閉元件&lt;/font&gt;&lt;br /&gt;ContentProvider只回應ContentResolver的需求,Broadcast receiver只在回應廣播時啟動，所以這兩種元件都不需要手動去關閉它，需要被關閉的元件只有Activity與Service。&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;1.Activity&amp;#26412;&amp;#36523;&amp;#21487;&amp;#36879;&amp;#36942;finish()&amp;#20358;&amp;#38364;&amp;#38281;&amp;#65292;&amp;#32780;&amp;#35201;&amp;#38364;&amp;#38281;&amp;#20854;&amp;#20182;&amp;#30340;Activity&amp;#65292;&lt;br /&gt;  &amp;#20363;&amp;#22914;&amp;#21033;&amp;#29992;startActivityForResult()&amp;#65292;&amp;#25152;&amp;#21855;&amp;#21205;&amp;#30340;Activity&amp;#21487;&amp;#20197;&amp;#21033;&amp;#29992;&lt;br /&gt;  finishActivity()&amp;#20358;&amp;#38364;&amp;#38281;&amp;#20854;&amp;#20182;Activity&lt;br /&gt;2.service&amp;#26412;&amp;#36523;&amp;#21487;&amp;#20197;&amp;#36879;&amp;#36942;stopSelf()&amp;#38364;&amp;#38281;&amp;#65292;&amp;#25110;&amp;#30001;&amp;#22806;&amp;#37096;&amp;#36879;&amp;#36942;&lt;br /&gt;  Context.stopService()&amp;#38364;&amp;#38281;&amp;#65292;&amp;#30070;&amp;#20803;&amp;#20214;&amp;#24050;&amp;#32147;&amp;#19981;&amp;#20877;&amp;#34987;&amp;#20351;&amp;#29992;&amp;#25110;&amp;#30070;&amp;#31995;&amp;#32113;&amp;#35352;&lt;br /&gt;  &amp;#25014;&amp;#39636;&amp;#19981;&amp;#36275;&amp;#26178;&amp;#26371;&amp;#34987;&amp;#24375;&amp;#21046;&amp;#38364;&amp;#38281;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;font color='blue'&gt;五.manifest設定檔&lt;/font&gt;&lt;br /&gt;一個Android程式包含了許多的元件還有resource檔案,在Android使用之前，需先確認資料的存在，每個App內都會有一個結構性的描述檔 AndroidManifest.xml，包含了包括activity,service,receiver,provider 等元素宣告，activity,service,provider若沒宣告在manifest檔案內,在系統內是無法使用的，只有receiver除了可以宣告在manifest內,也可以透過Context.registerReceiver()動態產生註冊到系統內&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-316313452689870235?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/316313452689870235/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=316313452689870235' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/316313452689870235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/316313452689870235'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/android.html' title='Android基本概念'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-3521863278236461607</id><published>2010-10-01T13:23:00.000+08:00</published><updated>2010-10-01T13:23:46.114+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><title type='text'>Air File實體檔案路徑</title><content type='html'>在開發AIR專案,如果需要利用File對使用者端做檔案存取&lt;br /&gt;取得需要的實體檔案路徑,需要透過File的static變數來取得&lt;br /&gt;以下是各變數所對應在Windows下的實體檔案位置&lt;br /&gt; &lt;br /&gt;1.File.userDirectory:使用者目錄&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;C:\Documents and Settings\username&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.File.applicationDirectory:AIR APP執行檔所在路徑&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;D:\MyAirApp&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;3.File.applicationStorageDirectory:使用者本機可供該AIR應用程式,儲存資料的路徑&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;C:\Documents and Settings\username\Application Data\MyAirApp\Local Store&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.File.desktopDirectory:使用者桌面&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;C:\Documents and Settings\username\&amp;#26700;&amp;#38754;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;5.File.documentsDirectory:使用者我的文件資料夾&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;C:\Documents and Settings\username\My Documents&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-3521863278236461607?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/3521863278236461607/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=3521863278236461607' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3521863278236461607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3521863278236461607'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/10/air-file.html' title='Air File實體檔案路徑'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-8807152333744259602</id><published>2010-09-27T18:37:00.000+08:00</published><updated>2010-09-27T18:37:42.071+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex 使用fxg</title><content type='html'>要在Flash CS5內將圖檔輸出成fxg檔案,供Flex使用，以下步驟流程&lt;br /&gt;&lt;br /&gt;一.Flash FXG輸出&lt;br /&gt;&lt;br /&gt;   在Flash上繪製圖片，可繪製多個物件同時輸出，Export Image，&lt;br /&gt;   選擇fxg格式，即自動產生FXG File&lt;br /&gt;   如果flash內的物件有使用到外部的圖檔,那麼在輸出fxg檔案的同時,&lt;br /&gt;   會產生一個asset目錄,包含外部點陣圖檔案&lt;br /&gt;   例如MyBall.fxg&lt;br /&gt;   在所輸出的fxg檔案內可看到&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; 1.&amp;lt;Graphic viewWidth viewHeight&amp;gt;:  &lt;br /&gt;     &amp;lt;Graphic&amp;gt;為fxg document的root node,viewWidth   &lt;br /&gt;     viewHeight即為flash所設定的stage大小  &lt;br /&gt; 2.&amp;lt;Library&amp;gt;:當場景上有多個物件會被定義到Libray內,  &lt;br /&gt;     可以重複使用裡面所定義的物件       &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;二.放置到Flex可連結到的目錄&lt;br /&gt;   可將輸出的fxg檔案放置到Flex對應的class Path內&lt;br /&gt;   例如 com/ozzysun/flex/fxg/MyBall.fxg&lt;br /&gt;   就可把fxg看作在nameSpace com.ozzysun.flex.fxg下的一個物件類別&lt;br /&gt; &lt;br /&gt;   FXG本身是一個獨立的文件，其內部不可參考到別的fxg或mxml檔案&lt;br /&gt;   但可以連結到點陣圖或是系統字型&lt;br /&gt;&lt;br /&gt;三.在Flex Application使用fxg物件&lt;br /&gt;&lt;br /&gt;   fxg物件只能被加到spark container內，不能加到mx container內&lt;br /&gt;  &lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;  &amp;lt;s:Application backgroundColor="0xFFFFFF"     &lt;br /&gt;    xmlns:s="library://ns.adobe.com/flex/spark"  &lt;br /&gt;    xmlns:oz="com.ozzysun.flex.fxg.*"&amp;gt;  &lt;br /&gt;      &amp;lt;oz:MyBall id="graphic1"/&amp;gt;  &lt;br /&gt;   &amp;lt;/s:Application&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; &lt;br /&gt;四.在ActionScription上使用fxg物件&lt;br /&gt;&lt;br /&gt;   在AS中fxg物件會被當作是park.core.SpriteVisualElement物件&lt;br /&gt;   並使用addElement加到spark container內&lt;br /&gt;   例&lt;br /&gt;   &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var _item:SpriteVisualElement=new MyBall();&lt;br /&gt;vGroup.addElement(_item);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;五.FXG Document語法架構&lt;br /&gt;&lt;br /&gt;   fxg檔案以&lt;Graphic&gt;當作文件的根節點,下面可包含0~多個container(如Group)&lt;br /&gt;   或繪圖元素(如Rect,Ellipse,BitmapImage) &lt;br /&gt;   &lt;Graphic&gt;根節點下可以包含有&lt;Library&gt;或&lt;mask&gt;,若有,一定要放在其他tag之前&lt;br /&gt;   如果這兩個tag都有,那就把&lt;Library&gt;放在第一位&lt;br /&gt;&lt;br /&gt;六.FXG的座標與大小控制&lt;br /&gt;&lt;br /&gt;   fxg使用可以使用兩種座標系統,document coordinater與user coordinater&lt;br /&gt;   document coordinater是以整個輸出的swf左上方為參考點&lt;br /&gt;   user coordinater則是以這個fxg document的&lt;Graphic&gt;tag為參考點&lt;br /&gt;   預設fxg內部元素都會使用user coordinater&lt;br /&gt; &lt;br /&gt;   每個fxg內部元素都會有width height屬性可以設定,而在根節點&lt;Graphic&gt;上的&lt;br /&gt;   viewWidth viewHeight為整個fxg元件大小,如果內部元素寬高小於viewWidth viewHeight&lt;br /&gt;   就會出現空白間距&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-8807152333744259602?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/8807152333744259602/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=8807152333744259602' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8807152333744259602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8807152333744259602'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/flex-fxg.html' title='Flex 使用fxg'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-142292293472548965</id><published>2010-09-23T15:22:00.000+08:00</published><updated>2010-09-23T15:22:01.498+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>颱風 回家</title><content type='html'>高鐵左營站擠滿了要北上的乘客&lt;br /&gt;坐在車廂裡看個車子緩緩的移動&lt;br /&gt;&lt;br /&gt;早上8點半，硬是把還在睡覺的這對母女挖起來&lt;br /&gt;妹妹張開眼笑笑後，還是繼續抱著被子翹著屁股賴床&lt;br /&gt;好不容易讓他有點醒過來的感覺&lt;br /&gt;就要出門坐車&lt;br /&gt;&lt;br /&gt;這個假日自己一個人要把妹妹帶回高雄&lt;br /&gt;塞滿的背包裡除了自己的筆電&lt;br /&gt;還多放了妹妹的畫板 還有那黃色的小鴨鴨&lt;br /&gt;一桶的小饅頭餅乾 一瓶泡好的牛奶再加上一瓶水&lt;br /&gt;我們在回家的路上&lt;br /&gt;&lt;br /&gt;南下列車 車廂沒有坐滿&lt;br /&gt;跟妹妹在最後一排的座位上 一路玩回左營&lt;br /&gt;坐計程車回家，車進巷子內&lt;br /&gt;遠遠看到老媽就在門口等著我們回來&lt;br /&gt;還沒下車 &lt;br /&gt;看到遠遠的阿嬤 &lt;br /&gt;妹妹就阿嬤阿嬤的叫著&lt;br /&gt;&lt;br /&gt;妹妹還是跟在台北一樣 精神超好 不會想睡覺&lt;br /&gt;到樓上 把妹妹的車車拿下來&lt;br /&gt;外面鄰居的小朋友 已經等著跟妹妹玩&lt;br /&gt;果然他回來 一點都沒不適應 想媽媽的問題&lt;br /&gt;&lt;br /&gt;禮拜天 雨變大了風也變強了 這是今年第一個有影響的颱風&lt;br /&gt;關在家裡不能出門 看樣子沒辦法回台北&lt;br /&gt;除了睡覺 就是跟妹妹玩&lt;br /&gt;還有就是老媽煮的飯菜 整天吃不停&lt;br /&gt;難得 可以好好的睡一覺&lt;br /&gt;躺在 老家的床上 還是感覺比較溫暖&lt;br /&gt;看著妹妹在調皮搗蛋&lt;br /&gt;老媽也被逗的開心的一直笑著&lt;br /&gt;&lt;br /&gt;下午風雨更大了&lt;br /&gt;妹妹吵著要出去&lt;br /&gt;只好把鐵門打開一些&lt;br /&gt;放個小椅子在門口&lt;br /&gt;讓妹妹好奇的看到外面下雨的景象&lt;br /&gt;妹妹 好奇的把腳伸到門外 吹著風淋著雨&lt;br /&gt;臉上盡是開心的笑容&lt;br /&gt;&lt;br /&gt;這次的颱風 雨下了一天一夜&lt;br /&gt;家裡的鐵門門柱也被風吹開來&lt;br /&gt;看到新聞才知道 整個高雄受災是如此嚴重&lt;br /&gt;&lt;br /&gt;禮拜一早上一早搭計程車到左營&lt;br /&gt;再搭高鐵回台北&lt;br /&gt;坐上車&lt;br /&gt;開始會想念妹妹了&lt;br /&gt;想念他叫爸爸的聲音&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-142292293472548965?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/142292293472548965/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=142292293472548965' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/142292293472548965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/142292293472548965'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/blog-post_23.html' title='颱風 回家'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7444338287705767405</id><published>2010-09-16T14:21:00.003+08:00</published><updated>2010-09-16T16:35:36.341+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP Send Mail</title><content type='html'>&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;$to = 'user@xxx.com' . ', ';&lt;br /&gt;$subject = '&amp;#20449;&amp;#20214;&amp;#27161;&amp;#38988;';&lt;br /&gt;$message = '&amp;#20839;&amp;#23481;';&lt;br /&gt;$headers  = 'MIME-Version: 1.0' . &amp;quot;\n&amp;quot;;&lt;br /&gt;$headers .= 'Content-type: text/html; charset=utf-8' . &amp;quot;\n&amp;quot;;&lt;br /&gt;$headers .= 'From: sender@xxx.com' . &amp;quot;\n&amp;quot;;&lt;br /&gt;if(!mail($to, $subject, $message, $headers)){&lt;br /&gt;    die(&amp;quot;send error!&amp;quot;);&lt;br /&gt;}else{&lt;br /&gt;    echo &amp;quot;send mail ok!&amp;quot;;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;如果$from $to $msg資料是透過$_POST或$_GET取得&lt;br /&gt;則需加""處理&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;mail(&amp;quot;$to&amp;quot;, &amp;quot;$subject&amp;quot;, &amp;quot;$message&amp;quot;, $headers)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7444338287705767405?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7444338287705767405/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7444338287705767405' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7444338287705767405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7444338287705767405'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/php-send-mail.html' title='PHP Send Mail'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2720632234026161267</id><published>2010-09-10T14:46:00.000+08:00</published><updated>2010-09-10T14:46:23.475+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>My Wish List</title><content type='html'>等我有錢 我就買給你&lt;br /&gt;等我有錢 我就送你～～～&lt;br /&gt;如果有錢我要買~~~&lt;br /&gt;我的Wish List好像越來越長&lt;br /&gt;能實現的機會越來越小&lt;br /&gt;&lt;br /&gt;還記得自己幾年前的生活&lt;br /&gt;想要買個電腦，去領個錢就買了&lt;br /&gt;買個PS2 嗯嗯...下個月領薪水就可以買了&lt;br /&gt;需要個硬碟....馬上衝去光華商場敗了下來&lt;br /&gt;離現在最近 敗的奢侈品 大概就是那台&lt;br /&gt;手把已經已經壞掉的Wii了.....還是因為太少在玩&lt;br /&gt;讓電池漏液弄壞手把~~&lt;br /&gt;&lt;br /&gt;現在要養家養小孩&lt;br /&gt;生活除了忙 還是忙&lt;br /&gt;假日的娛樂 大概就是去24小時紅茶店寫程式&lt;br /&gt;沒時間玩電動，電影也只能等到小孩睡覺後才能好好看完一部&lt;br /&gt;PS3出來了....看起來我是沒什麼興趣&lt;br /&gt;也許新的XBox360出來 搭配新的Kinect出來 會想體驗看看&lt;br /&gt;&lt;br /&gt;想買台Android手機，有個好理由是把自己寫的程式放上去測試&lt;br /&gt;但還是跟自己說，還是等Android2.2出來再買吧...&lt;br /&gt;&lt;br /&gt;買個硬碟吧，理由是該把電腦內的資料好好備份下來&lt;br /&gt;家裡那台用了5年的電腦也該換了&lt;br /&gt;&lt;br /&gt;再買台AIO的觸控電腦送給老爸吧....&lt;br /&gt;現在老爸對電腦這麼有興趣在學&lt;br /&gt;那麼大的AIO電腦，應該會比現在給他用的那台老舊筆電好很多&lt;br /&gt;&lt;br /&gt;買台可以看漫畫的平板吧，現在的平板發展已經可以達到我想要&lt;br /&gt;看漫畫的理想了，但是我有時間看嗎&lt;br /&gt;&lt;br /&gt;想去日本，又到了有年假又可以看楓紅的季節&lt;br /&gt;但是今年的日圓升值，要存錢去日本，應該是很困難&lt;br /&gt;好想好想~~~~&lt;br /&gt;&lt;br /&gt;想買雙勃肯鞋，之前在德國買的勃肯壞了，好想再買一雙&lt;br /&gt;....這大概是最容易實現，也最不會買了有道德愧疚的一個了&lt;br /&gt;&lt;br /&gt;今天早上又多了一個大的Wish，想帶著家人到再到德國走走&lt;br /&gt;還要去上次沒去的布拉格...&lt;br /&gt;當然要是妹妹可以很乖的一起出遊的條件下&lt;br /&gt;我想這是現在最大的一個願望吧...&lt;br /&gt;&lt;br /&gt;如果哪天真中了統一發票&lt;br /&gt;還是中了樂透&lt;br /&gt;就可以一次都把他完成&lt;br /&gt;現在就先放在口袋裡~~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2720632234026161267?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2720632234026161267/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2720632234026161267' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2720632234026161267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2720632234026161267'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/my-wish-list.html' title='My Wish List'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-3877612453362001231</id><published>2010-09-10T10:25:00.003+08:00</published><updated>2010-12-09T12:27:13.626+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>Flash跨網域JS注意要項</title><content type='html'>在Flash程式開發應用於網頁上時&lt;br /&gt;常會需要用到與JS的互動，也就是呼叫JS或被JS呼叫&lt;br /&gt;抑或載入外部檔案等，如果發生跨網域的狀況&lt;br /&gt;常會讓工作無法順利執行下去&lt;br /&gt;以下幾點概念可以讓CrossDomain問題，降到最低&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;1.swf所屬網域，以其所在網頁為準&lt;/font&gt;&lt;br /&gt;當你在A網域放了一個網頁A.htm，在這網頁內連結了B網域上的&lt;br /&gt;swf與JS File，如果你在執行的A.htm上的flash有呼叫到了JS上的&lt;br /&gt;function，雖然swf與JS實體檔案同在B domain上，但是在這時候，會被視為非&lt;br /&gt;同一個Domain&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;2.讓Flash呼叫外部script function&lt;/font&gt;&lt;br /&gt;在網頁上嵌入Flash的Tag 有一個參數allowScriptAccess預設值為SameDomain&lt;br /&gt;亦即允許swf與同Domain上的JS做互動，若需要跨網域呼叫執行，則需要將值設定&lt;br /&gt;為always，例如在A Domain上的swf被嵌入到B Domain上的網頁上時，要讓他可以&lt;br /&gt;執行在A Domain上的JS Function，就需要做always設定&lt;br /&gt;但通常在安全性考量，大部分允許讓你貼embed code的網站都會把這個參數忽略掉&lt;br /&gt;而如果要完全不允許flash與script做互動，則可以設定成none&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;3.讓Flash可以讓script呼叫執行&lt;/font&gt;&lt;br /&gt;如果要讓JS可以操作執行Flash內的function&lt;br /&gt;當然是利用ExternalInterface來連結，但若是涉及跨網域的呼叫執行&lt;br /&gt;則需要先在Flash內設定&lt;br /&gt;Security.allowDomain(設定允許的domain)&lt;br /&gt;這樣就可以允許跨網域被呼叫了&lt;br /&gt;&lt;br /&gt;&lt;font color='blue'&gt;4.載入跨網域外部檔案到flash內&lt;/font&gt;&lt;br /&gt;要載入非同網域的圖片或檔案到flash內，需要在提供被讀取資料的網站下&lt;br /&gt;放置crossdomain.xml這policy file，然後在flash內使用&lt;br /&gt;Security.loadPolicyFile(policy file路徑)，&lt;br /&gt;先讀取，接下來就可以任意的讀取該網站上的資料&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-3877612453362001231?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/3877612453362001231/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=3877612453362001231' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3877612453362001231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3877612453362001231'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/flashjs.html' title='Flash跨網域JS注意要項'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-5187359867636617771</id><published>2010-09-08T15:44:00.004+08:00</published><updated>2010-09-08T15:48:22.163+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>高四生活- Just In Time</title><content type='html'>在自己的記憶裡,重考的那年 像是段空白一般&lt;br /&gt;回想起來只有很瑣碎的片段加片段&lt;br /&gt;&lt;br /&gt;高中畢業後 大學聯考沒有考上&lt;br /&gt;似乎不會感覺到是很大的事&lt;br /&gt;因為班上同學幾乎都一起到了補習班重考&lt;br /&gt;&lt;br /&gt;黑黃相間的小兜風是每天上課的交通工具&lt;br /&gt;拆掉菜籃與後照鏡，加長了避震器翹起車尾&lt;br /&gt;在車前方裝上紫色霧燈，側邊貼上國旗還有拳四郎的貼紙&lt;br /&gt;改裝過的摩托車，似乎也會讓自己覺得與眾不同&lt;br /&gt;下課後與同學騎到西子灣 十八王公廟&lt;br /&gt;蹺課到國際戲院看2部50塊的二輪電影&lt;br /&gt;還是走過港隧道,到旗津試車,看車可以加速到多快&lt;br /&gt;&lt;br /&gt;上課？其實都忘記了在補習班上課的畫面&lt;br /&gt;有印象的是在一堂三民主義課中，新聞傳來蔣經國去世的消息&lt;br /&gt;在那個年代，充滿著有如偉人崩落國家將面臨重大改變的氣息....&lt;br /&gt;那個時候，我正偷偷用隨身聽聽著黃舒駿 馬不停蹄的憂傷&lt;br /&gt;為著他那唱片文案中寫著要擊倒羅大佑這樣自大的話&lt;br /&gt;感到無法苟同&lt;br /&gt;不過在經過這20多年的現在，再聽他的音樂，&lt;br /&gt;雖然覺得還是沒能擊倒羅大佑&lt;br /&gt;但也是一張很棒的國語經典&lt;br /&gt;&lt;br /&gt;下課騎車回家，沿著中華路一直走，中山路圓環邊是遠東百貨&lt;br /&gt;每個禮拜總有幾個晚上，會在大門口旁搭起簡單舞台&lt;br /&gt;辦起活動，有時會是安排樂團表演&lt;br /&gt;每回看到有樂團表演，總會直接把摩托車停在旁邊&lt;br /&gt;走到舞台前看著表演&lt;br /&gt;聽眾大多只有三三兩兩&lt;br /&gt;唱著流行歌曲最容易引起台下聽眾的迴響&lt;br /&gt;偶爾可以聽到陌生卻又令人感動的搖滾樂&lt;br /&gt;第一次聽到Chris de Burgh的歌曲，就在這裡&lt;br /&gt;還請主唱幫我寫下那天所唱的歌&lt;br /&gt;&lt;br /&gt;&lt;a href='http://vlog.xuite.net/play/Y3dJWHJELTI2NjgzNjkuZmx2' target='_balnk'&gt;Just In Time&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;還有&lt;br /&gt;The Girl With April In Her Eyes&lt;br /&gt;&lt;object width="300" height="225"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FRp_KGtdQpU?fs=1&amp;amp;hl=zh_TW"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FRp_KGtdQpU?fs=1&amp;amp;hl=zh_TW" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-5187359867636617771?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/5187359867636617771/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=5187359867636617771' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5187359867636617771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5187359867636617771'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/blog-post.html' title='高四生活- Just In Time'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-5386132122545449721</id><published>2010-09-07T11:37:00.000+08:00</published><updated>2010-09-07T11:37:45.822+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>String轉uint</title><content type='html'>在開發Flash有color方面的應用&lt;br /&gt;如果要透過使用者由文字欄位輸入的文字，或是由一段文字內容中&lt;br /&gt;parse出要轉成顏色的色碼字串&lt;br /&gt;需要將string轉成uint型別&lt;br /&gt;轉換的方式很簡單，只要字串形式是以0x開頭的都可直接轉換&lt;br /&gt;example&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var str:String=&amp;quot;0xff0000&amp;quot;&lt;br /&gt;var myColor:uint=uint(str);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-5386132122545449721?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/5386132122545449721/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=5386132122545449721' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5386132122545449721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/5386132122545449721'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/stringuint.html' title='String轉uint'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-3019721530907137265</id><published>2010-09-07T11:31:00.002+08:00</published><updated>2010-09-07T11:31:32.975+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>使用FlashDevelop 輸出Flex 降低檔案大小設定</title><content type='html'>在使用FlashDevelop開發Flex專案，完成後常會發現swf檔案大的驚人&lt;br /&gt;以下兩個步驟設定可大幅度降低檔案大小&lt;br /&gt;1.使用Runtime shared Library&lt;br /&gt;   Project/Property/Compiler Option/Static Link RSL=false&lt;br /&gt;   這步驟就不需要把整個Flex Framwork都Compiler到swf內&lt;br /&gt;   大約可以減少500kb檔案大小&lt;br /&gt;2.Build Project選擇release mode輸出&lt;br /&gt;   在release mode下輸出,所有trace info都會看不到&lt;br /&gt;   但檔案大小大約可以減少一半&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-3019721530907137265?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/3019721530907137265/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=3019721530907137265' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3019721530907137265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/3019721530907137265'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/flashdevelop-flex.html' title='使用FlashDevelop 輸出Flex 降低檔案大小設定'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-6725298256249548566</id><published>2010-09-07T11:21:00.000+08:00</published><updated>2010-09-07T11:21:15.149+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>使用自訂ItemRenderer</title><content type='html'>在Flex上使用如TileList的Component，如果不想使用預設的ItemRenderer&lt;br /&gt;要自訂ItemRenderer,以下三個步驟&lt;br /&gt;一.在Component上指定要使用的ItemRenderer完整路徑&lt;br /&gt; &lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;mx:TileList id="tileList" .....            &lt;br /&gt;      itemRenderer="com.ozzysun.flex.xxx.MyItemRenderer"&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;二.設定資料來源&lt;br /&gt; example:&lt;br /&gt; &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var _array:Array = new Array();&lt;br /&gt;    for each(var node:XML in e.target.xml.elements()){&lt;br /&gt;        if (node.name().localName == &amp;quot;image&amp;quot;) {&lt;br /&gt;            var obj:Object = new Object();&lt;br /&gt;            obj.title = node.attribute('title');&lt;br /&gt;            obj.thumb = node.attribute('thumb');            &lt;br /&gt;            _array.push(new ObjectProxy(obj))                        &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    var _fileArray:ArrayCollection = new ArrayCollection(_array);&lt;br /&gt;    tileList.dataProvider = _fileArray;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; &lt;br /&gt;每筆資料可以用一般物件儲存，但在儲存後需用ObjectProxy&lt;br /&gt;包裝後再丟到陣列&lt;br /&gt;dataProvider使用的資料type為ArrayCollection，&lt;br /&gt;所以需透過new ArrayCollection(_array)&lt;br /&gt;取得所要的格式&lt;br /&gt;&lt;br /&gt;三.ItemRenderer設計&lt;br /&gt; example:&lt;br /&gt; &lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt;      &amp;lt;mx:Image source="{data.thumb}" xmlns:mx="http://www.adobe.com/2006/mxml" /&amp;gt;       &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;itemrenderer本身會有一個data property&lt;br /&gt;這data property即對應到dataProvider所傳進來的資料&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-6725298256249548566?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/6725298256249548566/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=6725298256249548566' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6725298256249548566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6725298256249548566'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/09/itemrenderer.html' title='使用自訂ItemRenderer'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-8400380110939868283</id><published>2010-08-09T11:29:00.001+08:00</published><updated>2010-08-09T11:30:27.721+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>我媽媽</title><content type='html'>我偷偷打開媽媽的行李袋，打開裡面那小小的錢包，放了兩張一千塊，&lt;br /&gt;再小心翼翼的放回原位，因為我知道要親手拿錢給他，&lt;br /&gt;怎麼樣他也不會跟我拿&lt;br /&gt;&lt;br /&gt;記得 在我很小的時候，作過這樣的事，偷偷打開媽的錢包，但那是偷錢，&lt;br /&gt;也曾經騙媽說學校要繳什麼錢，拿了去買我想要的故事書，&lt;br /&gt;因為媽不懂，也不識字，只知道是我讀書要用的，我開口要，就會給我&lt;br /&gt;其實 家裡並不是那麼的好過&lt;br /&gt;&lt;br /&gt;以前媽很少離開高雄，有了妹妹以後，媽就常上台北來了&lt;br /&gt;爸還笑媽說，現在很常讓他坐到高鐵了&lt;br /&gt;在台北的生活，老媽每天早上 還是一大早起床，&lt;br /&gt;把我們家前一天的衣服丟到洗衣機洗，然後到家後面的公園散步，&lt;br /&gt;買好菜，回到家，煮好稀飯，曬好衣服，在我起床時&lt;br /&gt;已經都把家裡整理好，等著我們&lt;br /&gt;在樓下陪他看電視聊聊天，聽他說著今天要煮什麼什麼來吃&lt;br /&gt;聽到妹妹醒過來的聲音，他就趕緊上樓把妹妹抱下來&lt;br /&gt;餵著妹妹吃稀飯 然後我去上班，這是一天的開始&lt;br /&gt;&lt;br /&gt;老媽在台北的日子，我的生活有了許多的不一樣，&lt;br /&gt;每天大概9點就已經到公司&lt;br /&gt;也在每天8點前就會回到家，&lt;br /&gt;衣櫃裡的衣服，老媽都會重新折過而特別整齊，&lt;br /&gt;晚上10點多看完連續劇，媽才去洗澡也順便整理一下，再到書房睡覺&lt;br /&gt;&lt;br /&gt;聽到妹妹就這樣"阿嬷 阿嬤 背背"的叫，&lt;br /&gt;然後就看著老媽背著妹妹走到外面去散步&lt;br /&gt;家裡吃的飯菜水果，都是媽媽拿自己的錢買來給我們吃&lt;br /&gt;想要把菜錢塞給他，怎樣就是不肯拿&lt;br /&gt;只好偷偷把錢放到他的錢包裡&lt;br /&gt;&lt;br /&gt;老婆說只要媽在台北的日子，你的心情總是特別開心，&lt;br /&gt;&lt;br /&gt;今天媽就要回高雄了，早上上班，也帶著媽去坐客運，&lt;br /&gt;大家都說坐客運回高雄，時間好久，他卻笑笑跟我說&lt;br /&gt;他覺得很舒服很好，&lt;br /&gt;車來了，帶他坐到位子上，怕他會錯過下車的地方，&lt;br /&gt;寫了張家裡地址的紙條給他，放在身上，&lt;br /&gt;再去交待司機先生，到了中正路記得幫忙叫我媽下車，&lt;br /&gt;老媽就笑笑跟我說，坐過站也沒關係&lt;br /&gt;到總站再坐計程車回家就好&lt;br /&gt;看著車子 慢慢遠離了我的視線，再轉身搭捷運去公司&lt;br /&gt;&lt;br /&gt;我想，晚上回家睡覺時，還是會想&lt;br /&gt;如果媽就在隔壁睡覺&lt;br /&gt;多好&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-8400380110939868283?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/8400380110939868283/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=8400380110939868283' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8400380110939868283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8400380110939868283'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/08/blog-post.html' title='我媽媽'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-579658367034537601</id><published>2010-07-06T12:15:00.001+08:00</published><updated>2010-07-06T12:48:56.767+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>常見的SWC使用方式</title><content type='html'>&lt;pre&gt;一.使用Flash IDE產生SWC檔案&lt;br /&gt;1.產生Component供其他fla安裝使用&lt;br /&gt;    1.產生好要用的movieClip,在Library內在物件上按右鍵Linkage&lt;br /&gt;    2.Class名稱填上要連結的class檔案名稱,例如com.ozzysun.xxx.TestC&lt;br /&gt;    3.在物件上按滑鼠右鍵Export SWC File輸出swc檔案&lt;br /&gt;2.將整個fla所作的內容產生swc當作其他程式Library使用&lt;br /&gt;    1.將Library上所有物件都設定Linkage(在物件上按右鍵Linkage)&lt;br /&gt;    2.Class名稱填上你要的名稱(在as內就可用這class名稱 new出新物件)&lt;br /&gt;    3.如果linkage的物件對應到一個供多物件使用的class&lt;br /&gt;        class:設定呼叫的class name(MyClass)&lt;br /&gt;        baseclass:提供連結的class name&lt;br /&gt;        程式使用&lt;br /&gt;        var kk:MyClass&lt;br /&gt;    4.如果linkage的物件對應到唯一使用的class&lt;br /&gt;        class:提供連結的class name&lt;br /&gt;        baseclass:flash.display.MovieClip&lt;br /&gt;    5.依以上步驟,把所有的物件linkage都設定好&lt;br /&gt;    6.設定輸出整個swc ,在Flash IDE上，&lt;br /&gt;      File/public setting/export swc打勾&lt;br /&gt;    5.public 產生swc檔案&lt;br /&gt; &lt;br /&gt;二.安裝設定&lt;br /&gt;    1.把Component裝到Flash IDE內&lt;br /&gt;        1.複製netgeo.swc到&lt;br /&gt;        C:\Documents and Settings\使用者名稱\Local Settings&lt;br /&gt;          \Application Data\Adobe\Flash CS3\en\Configuration&lt;br /&gt;          \Components下&lt;br /&gt;        2.restart Flash CS3&lt;br /&gt;        3.在Components Panel內即可看到Standard Component目錄&lt;br /&gt;    2.把Component提供FlashDevelop程式使用&lt;br /&gt;        1.開啟原本的AS3 Project&lt;br /&gt;        2.複製 yourComponent.swc 到lib目錄下&lt;br /&gt;        3.在yourComponent.swc上按右鍵/Add To Library&lt;br /&gt;    3.把SWC當作Library提供FlashDevelop程式使用&lt;br /&gt;        1.開啟原本的AS3 Project&lt;br /&gt;        2.複製 yourComponent.swc 到lib目錄下&lt;br /&gt;        3.在yourComponent.swc上按右鍵/Add To Library  &lt;br /&gt;  &lt;br /&gt;二.使用SWC檔案&lt;br /&gt;    1.在Flash IDE上使用元件&lt;br /&gt;        由Components Panel拉一個MySWC_Component到Stage上&lt;br /&gt;        設定instance name 例如'player'&lt;br /&gt;        即可在程式內呼叫使用component的method&lt;br /&gt;        例&lt;br /&gt;        player.load("xxxx")&lt;br /&gt;    2.在FlashDevelop上使用SWC Component&lt;br /&gt;        var player:MySWC_Component=new MySWC_Component();&lt;br /&gt;        player.load("xxxxx");&lt;br /&gt;    3.在FlashDevelop上使用SWC Library&lt;br /&gt;        把整個fla輸出的swc當library,原本stage上的layout並不存在&lt;br /&gt;        用的只是fla內的library,所有要用物件,都要透過libray內所設&lt;br /&gt;        定物件linkage的class name來產生新物件放到stage上&lt;br /&gt;        例  &lt;br /&gt;        public var myS:MyClassName1;&lt;br /&gt;        myS = new MyClassName1();&lt;br /&gt;        myS.x = 100;&lt;br /&gt;        myS.y = 100; &lt;br /&gt;        addChild(myS);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-579658367034537601?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/579658367034537601/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=579658367034537601' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/579658367034537601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/579658367034537601'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/07/swc.html' title='常見的SWC使用方式'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2565296419870406790</id><published>2010-05-18T12:12:00.003+08:00</published><updated>2011-01-04T13:56:49.884+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 21 Proxy</title><content type='html'>有的物件在初始化時，需要消耗較大的系統效能，也比較花費時間&lt;br /&gt;若要加速整個系統的初始化效能，不至於loading過久&lt;br /&gt;如果可以讓物件在真正被使用時，才被實體化&lt;br /&gt;那就可以加速整個系統的初始化載入&lt;br /&gt;這就是Proxy Pattern所要提供的功能&lt;br /&gt;&lt;br /&gt;原本的程式執行流程是，&lt;br /&gt;一開始先初始化物件 real=new Real()&lt;br /&gt;要執行功能時就呼叫物件的method real.method()&lt;br /&gt;若改成利用Proxy Pattern&lt;br /&gt;則是變成，在要執行物件的功能時&lt;br /&gt;才去初始化物件實體，並呼叫其功能&lt;br /&gt;而在這裡，讓功能物件與使用的Proxy繼承自相同的Interface&lt;br /&gt;因為具備有相同的method&lt;br /&gt;&lt;br /&gt;這樣你就可以在外部程式很輕鬆的切換並決定是否要使用proxy&lt;br /&gt;或在Prxoy內作一些額外的處理後，再傳遞給真正的執行物件&lt;br /&gt;參與者&lt;br /&gt;1.Printable Interface&lt;br /&gt;定義一個執行物件與Proxy的共通介面&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public interface Printable {&lt;br /&gt;    public void print(String msg);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.Printer 真正的功能執行物件&lt;br /&gt;實作介面所定義的必要功能&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class Printer implements Printable {&lt;br /&gt;    @Override&lt;br /&gt;    public void print(String msg) {&lt;br /&gt;        System.out.print(&amp;quot;Run Print=&amp;quot;+msg);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.PrinterProxy&lt;br /&gt;在Proxy內儲存了一個真正執行物件的實體(real)&lt;br /&gt;而在實作功能上，才去初始化產生出物件&lt;br /&gt;並執行功能&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class PrinterProxy implements Printable {&lt;br /&gt;    private Printer real;&lt;br /&gt;    @Override&lt;br /&gt;    public void print(String msg) {        &lt;br /&gt;        if(real==null){&lt;br /&gt;            real=new Printer();            &lt;br /&gt;        }&lt;br /&gt;        real.print(&amp;quot;From Proxy:&amp;quot;+msg);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.Main外部應用程式&lt;br /&gt;可以很簡單的切換使用proxy或物件本體&lt;br /&gt;去執行功能&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public static void main(String[] args) {&lt;br /&gt;    PrinterProxy myP=new PrinterProxy();&lt;br /&gt;    //Printer myP=new Printer();&lt;br /&gt;    myP.print(&amp;quot;HELLO&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2565296419870406790?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2565296419870406790/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2565296419870406790' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2565296419870406790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2565296419870406790'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/05/design-pattern-21-proxy.html' title='Design Pattern : 21 Proxy'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-9014720566810643058</id><published>2010-05-17T10:37:00.007+08:00</published><updated>2011-01-04T13:56:35.376+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 20 Flyweight</title><content type='html'>Flyweight的目的在減輕記憶體的使用量，&lt;br /&gt;也就是減少new出新的物件佔據記憶體。&lt;br /&gt;&lt;br /&gt;在整個Pattern的運作上，利用一個Factory Pool，&lt;br /&gt;當需要新的物件會先向Factory查詢，&lt;br /&gt;如果在Pool內已經存在，那就直接由pool內取得回傳，&lt;br /&gt;若pool內沒有，才new出新物件，並存到pool內，&lt;br /&gt;讓以後要用的可以取用&lt;br /&gt;如此，所有相同的物件都只會被new出一個實體，&lt;br /&gt;若有需要用到相同的實體，只需取用既有的instance即可&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Animal 產生各式物件的Class&lt;br /&gt;使用者要產生animal 實體，若在一般程式上會直接&lt;br /&gt;new Animal，但在這Pattern下，new Animal動作是由&lt;br /&gt;Factory來執行，而非由外部程式來直接產生物件 &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class Animal {&lt;br /&gt;    private String name;&lt;br /&gt;    public Animal(String name){&lt;br /&gt;        this.name=name;&lt;br /&gt;        System.out.println(this.name+&amp;quot;--Created\n&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    public void run(){&lt;br /&gt;        System.out.print(this.name+&amp;quot;--run\n&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.Factory 管理所有物件的Factory&lt;br /&gt;利用一個Hashtable當作pool來儲存可攻使用的instance&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class Factory {&lt;br /&gt;    private Hashtable&amp;lt;String, Animal&amp;gt; pool=new Hashtable&amp;lt;String, Animal&amp;gt;();&lt;br /&gt;    private static Factory instance=new Factory();&lt;br /&gt;    public static Factory getInstance(){&lt;br /&gt;        return instance;&lt;br /&gt;    }&lt;br /&gt;    public synchronized Animal getAnimal(String name){&lt;br /&gt;        if(pool.get(name)==null){&lt;br /&gt;            Animal tmpAnimal=new Animal(name);            &lt;br /&gt;            pool.put(name,tmpAnimal);&lt;br /&gt;            return tmpAnimal;&lt;br /&gt;        }else{&lt;br /&gt;            return pool.get(name); &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.Main外部程式&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class Main {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Factory factory=Factory.getInstance();&lt;br /&gt;        factory.getAnimal(&amp;quot;man&amp;quot;).run();&lt;br /&gt;        factory.getAnimal(&amp;quot;dog&amp;quot;).run();&lt;br /&gt;        factory.getAnimal(&amp;quot;man&amp;quot;).run();&lt;br /&gt;        factory.getAnimal(&amp;quot;cat&amp;quot;).run();&lt;br /&gt;        factory.getAnimal(&amp;quot;dog&amp;quot;).run();&lt;br /&gt;        factory.getAnimal(&amp;quot;dog&amp;quot;).run();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;4輸出結果&lt;br /&gt;由結果可以看出，每種animal都只會被產生一次&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;man--Created&lt;br /&gt;man--run&lt;br /&gt;&lt;br /&gt;dog--Created&lt;br /&gt;dog--run&lt;br /&gt;&lt;br /&gt;man--run&lt;br /&gt;&lt;br /&gt;cat--Created&lt;br /&gt;cat--run&lt;br /&gt;&lt;br /&gt;dog--run&lt;br /&gt;&lt;br /&gt;dog--run&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-9014720566810643058?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/9014720566810643058/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=9014720566810643058' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9014720566810643058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9014720566810643058'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/05/design-pattern-20-flyweight.html' title='Design Pattern : 20 Flyweight'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7497738433743785570</id><published>2010-05-07T12:12:00.003+08:00</published><updated>2011-01-04T13:56:23.135+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 19 State</title><content type='html'>如果在開發程式裡，會需要對不同的狀態，有不同的處理方式&lt;br /&gt;可以把各種狀態的處理，各自包裝形成一個獨立的State Class&lt;br /&gt;也就是說，透過State切割，把複雜的處理，切割成各自獨立小的區塊，&lt;br /&gt;每個State很單純的處理該狀態下的執行功能，&lt;br /&gt;以這方式執行，亦可很輕易的擴充程式功能&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.State 介面&lt;br /&gt;定義出所有State所允許被呼叫的共同function&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public interface State {&lt;br /&gt;   public void showMessage(String user);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.DayState 依照State實作出的Class&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class DayState implements State {&lt;br /&gt;    private static DayState instance=new DayState();&lt;br /&gt;    public static DayState getInstance(){&lt;br /&gt;        return instance;&lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public void showMessage(String user) {        &lt;br /&gt;        System.out.println(user+&amp;quot; : Its Day&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.NightState 依照State實作出的Class&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class NightState implements State {&lt;br /&gt;    private static NightState instance=new NightState();&lt;br /&gt;    public static NightState getInstance(){&lt;br /&gt;        return instance;&lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public void showMessage(String user) {        &lt;br /&gt;        System.out.println(user+&amp;quot; : its Night&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.MyFrame 使用State的主要程式&lt;br /&gt;包含了setState function作為狀態轉移使用&lt;br /&gt;在這裡要執行的動作，都只需要呼叫state的method即可，不需要&lt;br /&gt;考慮真正的State實體是哪一個，&lt;br /&gt;State的轉換都會透過外部呼叫setState來改變&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class MyFrame {&lt;br /&gt;    private State state;&lt;br /&gt;    public MyFrame(){}&lt;br /&gt;    public void setState(String info){&lt;br /&gt;        if(info==&amp;quot;day&amp;quot;){&lt;br /&gt;            state=DayState.getInstance();&lt;br /&gt;        }else{&lt;br /&gt;            state=NightState.getInstance();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    public void showMessage(String user){&lt;br /&gt;        state.showMessage(user);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;5.Main 外部程式&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;MyFrame frame=new MyFrame();&lt;br /&gt;for(int hour=1;hour&amp;lt;=24;hour++){&lt;br /&gt;    if((hour&amp;gt;=8)&amp;amp;&amp;amp;(hour&amp;lt;=18)){&lt;br /&gt;        frame.setState(&amp;quot;day&amp;quot;);&lt;br /&gt;    }else{&lt;br /&gt;        frame.setState(&amp;quot;night&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    frame.showMessage(&amp;quot;ozzy&amp;quot;);&lt;br /&gt;    try{&lt;br /&gt;        Thread.sleep(1000);&lt;br /&gt;    }catch(InterruptedException e){}&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7497738433743785570?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7497738433743785570/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7497738433743785570' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7497738433743785570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7497738433743785570'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/05/design-pattern-19-state.html' title='Design Pattern : 19 State'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-853081595567820588</id><published>2010-05-06T11:21:00.010+08:00</published><updated>2010-06-25T10:26:03.829+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='音樂影像'/><category scheme='http://www.blogger.com/atom/ns#' term='片段的回憶'/><title type='text'>Always Somewhere - 大一印象</title><content type='html'>&lt;img src="http://image.allmusic.com/00/amg/cov200/drn400/n401/n40151mjbm4.jpg" /&gt;&lt;br /&gt;十月十號是放假的日子&lt;br /&gt;宿舍裡是空空蕩蕩&lt;br /&gt;住的近的都已經回家放假&lt;br /&gt;外面的陽光是那麼的刺眼&lt;br /&gt;穿著拖鞋,白色的汗衫,走下樓梯&lt;br /&gt;理二社一樓總是比房間來的涼快&lt;br /&gt;&lt;br /&gt;看看牆上留言箱,是否有新的小紙條在&lt;br /&gt;踱出宿舍&lt;br /&gt;大大的太陽,走過系館 走過外語學院&lt;br /&gt;走過小巴黎 穿過圓環,走到校門口&lt;br /&gt;穿過馬路 老葉牛肉麵 還開著&lt;br /&gt;吃個麵 再到地面的雜貨舖買些生活用品&lt;br /&gt;&lt;br /&gt;校門外的中正路上一樣車水馬龍&lt;br /&gt;校園裡 安靜的似乎可以聽到風的聲音&lt;br /&gt;再散步回宿舍&lt;br /&gt;坐到桌前，把卡帶放到錄音機裡&lt;br /&gt;1989年，在輔大的第一個連續假期&lt;br /&gt;聽著Scorpions的Always Somewhere&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.youtube.com/v/e47R7Z_jwkA&amp;hl=zh_TW&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="225"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-853081595567820588?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/853081595567820588/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=853081595567820588' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/853081595567820588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/853081595567820588'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/05/always-somewhere.html' title='Always Somewhere - 大一印象'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-20716458796910353</id><published>2010-05-05T10:51:00.003+08:00</published><updated>2010-05-05T11:06:51.961+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>Android,Flash,Java EventListener比較</title><content type='html'>在Flash,Java,Android上對於事件的處理&lt;br /&gt;同樣使用Listener，有著類似但有些差異的語法&lt;br /&gt;以下以常用的滑鼠click事件做簡單比較&lt;br /&gt;&lt;br /&gt;一.Flash&lt;br /&gt;Flash在對於所有的Event統一使用addEventListner method來做監聽&lt;br /&gt;主要傳入的兩個參數，分別是要監聽的事件類型與要觸發的function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;btn:Button=new Button();&lt;br /&gt;addChild(btn);&lt;br /&gt;btn.addEventListner(MouseEvent.CLICK,onClickHandler)&lt;br /&gt;function onClickHandler(e:MouseEvent):void{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//..do something..&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;二.Java&lt;br /&gt;在Java上要監聽不同的事件，要使用不同的addXXXListener method&lt;br /&gt;例如addActionListener,addWindowListener...&lt;br /&gt;每個不同的addXXXListener method所接收的參數&lt;br /&gt;都是不同的Listner物件instance，&lt;br /&gt;所要執行的動作則是在這Listner物件內 implement&lt;br /&gt;要監聽的動作 handler&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Button btn=new Button();&lt;br /&gt;add(btn);&lt;br /&gt;btn.addActionListener(myactionListener);&lt;br /&gt;ActionListener myactionListener=new ActionListener(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void actionPerformed(ActionEvent e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//..do something..&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;三.Android&lt;br /&gt;在Android上同樣是對不同的事件，有不同的setXXXListener&lt;br /&gt;每個setXXXListener所接收參數都是不同的listener物件&lt;br /&gt;與Java的差異是method名稱addXXXListener與setXXXListener&lt;br /&gt;的不同而已&lt;br /&gt;例setOnClickListener ,setOnFocuseChangeListener,&lt;br /&gt;setKeyListener..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Button btn=(Button)findViewById(R.id.mybtnid);&lt;br /&gt;btn.setOnClickListener(myclickListener);&lt;br /&gt;Button.OnClickListener myclickListener=new Button.OnClickListener(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void onClick(View v){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//..do something..&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-20716458796910353?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/20716458796910353/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=20716458796910353' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/20716458796910353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/20716458796910353'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/05/androidflashjava-eventlistener.html' title='Android,Flash,Java EventListener比較'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1760116929061025285</id><published>2010-04-30T15:47:00.002+08:00</published><updated>2011-01-04T13:56:02.689+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 18 Memonto</title><content type='html'>當我們希望在所開發的程式裡，可以提供Redo Undo的功能&lt;br /&gt;可以利用Memonto Pattern達到這個目標&lt;br /&gt;把Memonto物件放在要提供Undo功能的程式中(Subject)&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Memonto&lt;br /&gt;Memonto本身利用一個陣列來儲存資料，當要restor資料，再&lt;br /&gt;由陣列倒回來&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class Memonto {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Vector&amp;lt;String&amp;gt; memos=new Vector&amp;lt;String&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void save(String value){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memos.add(value);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public String restoreLast(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memos.removeElementAt(memos.size()-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.Subject&lt;br /&gt;要使用memo功能的主程式&lt;br /&gt;當主程式執行save功能時，是把資料丟給memo去儲存&lt;br /&gt;當要undo時，再利用memo把資料取回，寫回本應用程式的變數中&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class Subject {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Memonto memo;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private String myText;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public Subject(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memo=new Memonto();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void save(String value){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;myText=value;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memo.save(myText);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public String undo(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;myText=memo.restoreLast();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return myText; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.Main&lt;br /&gt;外部程式,只要呼叫應用程式提供的save跟undo method即可&lt;br /&gt;不用管subject內部memo如何運作&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;TextField text=new TextField()&lt;br /&gt;Subject subject=new Subject();&lt;br /&gt;儲存&lt;br /&gt;subject.save(text.getText());&lt;br /&gt;Undo&lt;br /&gt;text.setText(subject.undo());&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1760116929061025285?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1760116929061025285/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1760116929061025285' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1760116929061025285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1760116929061025285'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/design-pattern-18-memonto.html' title='Design Pattern : 18 Memonto'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-8174751952659611882</id><published>2010-04-28T12:16:00.006+08:00</published><updated>2011-01-04T13:55:45.978+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 17 Observer</title><content type='html'>在一個程式主體(Generator)，如果內部運算後產生一些變化，希望可以把變化的結果，通知外部特定對象，可以把要通知的對象都設定成Observer&lt;br /&gt;&lt;br /&gt;在Generator內需要有把observer加入觀察的method(addObserver)&lt;br /&gt;與通知observer的功能(notifyObserver)，而在observer內，會需要有一個update的method&lt;br /&gt;可以在接收到Generator的通知後，到Generator內取到結果，這樣當主體程式有所變化，所有設定的observer都會接收到通知，而做適當的訊息處理&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Generator&lt;br /&gt;&amp;nbsp;&amp;nbsp; 可以使用Observer的Class&lt;br /&gt;&amp;nbsp;&amp;nbsp; addObserver:把觀察者加進來的method&lt;br /&gt;&amp;nbsp;&amp;nbsp; notifyObserver:用來通知所有observer的method&lt;br /&gt;&amp;nbsp;&amp;nbsp; excute:執行程序，在這類別真正要執行的工作，當工作完成&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;         &lt;/span&gt;一定要觸發notifyObserver通知所有的觀察者&lt;br /&gt;&amp;nbsp;&amp;nbsp; getNumber:這是讓Observer接收到通知後，回來取值得method&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public abstract class Generator {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Vector&amp;lt;Observer&amp;gt; observers=new Vector&amp;lt;Observer&amp;gt;(); &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private int number;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void addObserver(Observer observer){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;observers.add(observer); &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void deletObserver(Observer observer){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;observers.remove(observer);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private void notifyObserver(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Iterator&amp;lt;Observer&amp;gt; it=observers.iterator();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(it.hasNext()){ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((Observer)it.next()).update(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void excute(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Random random=new Random();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;number=random.nextInt(50);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;notifyObserver();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getNumber(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return number;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;};&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2.Observer interface&lt;br /&gt;&amp;nbsp;&amp;nbsp; Observer可能有很多個，先設定一個所有observer需遵循的統一介面&lt;br /&gt;&amp;nbsp;&amp;nbsp; update:當obsever被通知，就是被Generator呼叫了這個updtae method&lt;br /&gt;&amp;nbsp;&amp;nbsp; 在這個method內可以利用傳進來的Generator物件，再回去取到變化的值&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public interface Observer {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract void update(Generator gen);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3.FirstObserver 實作類別&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class FirstObserver implements Observer { &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void update(Generator gen) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.out.println("First:"+gen.getNumber());&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4.SecondObserver&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class SecondObserver implements Observer {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void update(Generator gen) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.out.println("Second:"+gen.getNumber());&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5.Main外部程式&lt;br /&gt;只要產生Generator，加入關聯的observer後&lt;br /&gt;就可以執行他要做的動作,同時在這動作內也已經&lt;br /&gt;包含了通知observer的功能&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Generator gen=new Generator();&lt;br /&gt;gen.addObserver(new FirstObserver());&lt;br /&gt;gen.addObserver(new SecondObserver());&lt;br /&gt;gen.excute();&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-8174751952659611882?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/8174751952659611882/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=8174751952659611882' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8174751952659611882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/8174751952659611882'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/design-pattern-17-observer.html' title='Design Pattern : 17 Observer'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2143875965355121878</id><published>2010-04-27T15:51:00.005+08:00</published><updated>2011-01-04T13:55:33.375+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 16 Mediator</title><content type='html'>Mediator的角色，通常都是當作UIComponent的代理人&lt;br /&gt;UIComponent是使用者會直接接觸到的元件&lt;br /&gt;如Button,TextField等，當我們在操作這些UIComponent&lt;br /&gt;UIComponent 只是用來當作View顯示，而不做邏輯處理&lt;br /&gt;也就是說，當接收到使用者的指令，如按鈕，輸入文字..&lt;br /&gt;會把這些事件丟出去，往外通知&lt;br /&gt;UIComponent..只是單純被操作&lt;br /&gt;事件丟出的方式，可以是用dispatchEvent方式廣播&lt;br /&gt;或是通知mediatior來處理&lt;br /&gt;而Mediator的角色，就是主程式與UIComponent間的橋樑&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Mediator 介面&lt;br /&gt;createColleagus:利用這method把所有的UIComponent登錄到Mediator上&lt;br /&gt;colleagusChanged:當有登錄的UIComponent狀態改變時都會呼叫這method&lt;br /&gt;通知mediator作處理&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public interface Mediator {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract void createColleagus();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract void colleagusChanged(Colleagus colleagus);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.Colleagus&lt;br /&gt;所有的UIComponent都implement這介面，讓UIComponent都有可以跟&lt;br /&gt;mediator溝通的共同method&lt;br /&gt;setColleagusEnabled:要改變UComponent不要直接去操作到UIComponent,&lt;br /&gt;而是透過一個public API去操作&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public interface Colleagus {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract void setMediator(Mediator mediator);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract void setColleagusEnabled(boolean enabled);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.ColleagusTextField 實作的Colleagus&lt;br /&gt;本身是TextField,同時也以自己當作TextListener&lt;br /&gt;textValueChanged:當TextEvent被觸發時會執行這method&lt;br /&gt;在這method中通知mediator&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class ColleagusTextField extends TextField implements Colleagus,TextListener{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Mediator mediator;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public ColleagusTextField(String text,int columns){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(text,columns);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void setColleagusEnabled(boolean enabled) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setEnabled(enabled);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setBackground(enabled?Color.white:Color.gray);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void setMediator(Mediator mediator) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.mediator=mediator;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void textValueChanged(TextEvent arg0) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.mediator.colleagusChanged(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.LoginFrame 實作的Mediator&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class LoginFrame extends Frame implements Mediator,ActionListener{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private ColleagusTextField textUser;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public LoginFrame(String title){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(title);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setBackground(Color.lightGray);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setLayout(new GridLayout(4,2)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createColleagus();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add(textUser);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pack();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setVisible(true); &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void colleagusChanged(Colleagus c) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void createColleagus() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textUser=new ColleagusTextField("input user name",10);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textUser.setMediator(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textUser.addTextListener(textUser); &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void actionPerformed(ActionEvent arg0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;5.Main 外部程式&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;new LoginFrame("Main Frame");&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2143875965355121878?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2143875965355121878/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2143875965355121878' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2143875965355121878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2143875965355121878'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/design-pattern-16-mediator.html' title='Design Pattern : 16 Mediator'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2989295010191300969</id><published>2010-04-26T18:27:00.004+08:00</published><updated>2010-10-13T15:12:43.054+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android 開發入門注意事項</title><content type='html'>一.在模擬器安裝apk&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;在網路上下載到已經開發好的Android程式(*.apk)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;要如何安裝到模擬器上執行?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;1.先在電腦環境變數內(path)加入Android_SDK/tools目錄&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; 讓SDK內tools下的指令可以直接執行&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;2.在cmd下執行&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; adb install xxx.apk,即可把程式安裝到模擬器內&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;3.解除安裝&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; adb shell rm data/app/xxx,apk&lt;br /&gt;&lt;br /&gt;二.Compile錯誤處理&lt;br /&gt;&amp;nbsp;&amp;nbsp; 在Eclipse中Compile Android 是針對Activity Java Compile&lt;br /&gt;&amp;nbsp;&amp;nbsp; 如果不小心在layout xml上compile發生錯誤後&lt;br /&gt;&amp;nbsp;&amp;nbsp; 將產生的out.xml刪除，再到Problems Panel內刪除錯誤的列表&lt;br /&gt;&amp;nbsp;&amp;nbsp; 才可以再重新Compile&lt;br /&gt;&lt;br /&gt;三.xml檔案名稱必須要是小寫&lt;br /&gt;&amp;nbsp;&amp;nbsp; 在設計layout xml時，檔案名稱一定要使用全小寫&lt;br /&gt;&amp;nbsp;&amp;nbsp; loginPage.xml~~這是不允許的&lt;br /&gt;&amp;nbsp;&amp;nbsp; 可改用login_page.xml代替 &lt;br /&gt;&lt;br /&gt;四.View元件屬性設定不完全錯誤&lt;br /&gt;&amp;nbsp;&amp;nbsp; 若在layout xml內加入 view元件，layout_width與layout_height&lt;br /&gt;&amp;nbsp;&amp;nbsp; 一定要設定，否則即使compile成功，在模擬器上執行一定會發生錯誤&lt;br /&gt;&lt;br /&gt;五.將元件參考變數設定在class範圍&lt;br /&gt;&amp;nbsp;&amp;nbsp; 在Activity內會利用findViewById來取得各個view元件參考&lt;br /&gt;&amp;nbsp;&amp;nbsp; 如 TextView mytext=(TextView)findViewById(R.id.myText)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 這些變數，不要當作function內的local變數使用&lt;br /&gt;&amp;nbsp;&amp;nbsp; 最好是宣告在class的變數上，否則，在其他function內是無法操作&lt;br /&gt;&amp;nbsp;&amp;nbsp; 來改變這些view元件的屬性&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2989295010191300969?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2989295010191300969/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2989295010191300969' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2989295010191300969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2989295010191300969'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/android-03.html' title='Android 開發入門注意事項'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7522328835799825419</id><published>2010-04-22T12:43:00.010+08:00</published><updated>2010-11-24T10:47:28.448+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><title type='text'>FlashDevelop 上發布Air Project相關事項</title><content type='html'>一.設定讓FlashDevelop Air API Auto Complete&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;在Project Properties/compiler Option/SWC Include Lib&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;加入air swc的路徑&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;C:\Program Files\Adobe\Adobe Flash CS4\AIK1.5\frameworks\libs\air\airglobal.swc&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;C:\Program Files\Adobe\Adobe Flash CS4\AIK1.5\frameworks\libs\air\servicemonitor.swc&lt;br /&gt;&lt;br /&gt;二.產生AIR&lt;br /&gt;1.當設定的Project為AIR&lt;br /&gt;&amp;nbsp;&amp;nbsp; 在Project目錄下會有兩個bat檔CreateCertificate.bat與PackageApplication.bat&lt;br /&gt;2.CreateCertificate.bat&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;產生認證檔&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;編輯&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1.設定Flex SDK路徑&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;set PATH=%PATH%;C:\flex_sdk_4\bin&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.設定這認證pfx檔案的，名字,密碼與輸出檔名&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;set NAME=MyName&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;set PASSWORD=MyPassword&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;set CERTIFICATE=MyName.pfx&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;這在產生air檔案時，會需要這帳號密碼確認&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3.修改完，執行，即會產生一個pfx檔&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;3.PackageApplication.bat 封裝AIR&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;編輯&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;1.設定Flex SDK路徑&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;set PATH=%PATH%;C:\flex_sdk_4\bin&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;2.指定要使用的數位認證檔&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; set CERTIFICATE=MyName.pfx&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;3.設定要輸出的檔案路徑&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; set AIR_FILE=air/FlexTest1.air&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;4.執行,即產生AIR檔&lt;br /&gt;4.注意&lt;br /&gt;&amp;nbsp;&amp;nbsp;若在封裝AIR檔案發生錯誤&lt;br /&gt;&amp;nbsp;&amp;nbsp;如application.xml error 102:invaid namespace&lt;br /&gt;&amp;nbsp;&amp;nbsp;請確認，系統安裝的AIRSDK版本，與application.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;namespace設定的版本是否相符&lt;br /&gt;&lt;br /&gt;三.發布到網頁&lt;br /&gt;1.下載 Badge Sample&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Adobe Badge Sample&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://download.macromedia.com/pub/developer/air/badge_install_samples.zip&lt;br /&gt;2.修改網頁參數&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.flaVar參數&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;appname:AIR App名稱(需URL encode,也就是經過escape過)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;appurl:要下載的air檔案網址&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;airversion:要跑這個air的 runtime版本需求&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;imageurl:(非必填)要放到badge內的圖片路徑&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;buttoncolor:(非必填)按鈕顏色，預設為000000&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;messagecolor:(非必填)訊息文字顏色,預設為000000&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;lt;noscript&amp;gt;內放當不支援flash player時,要提供顯示的文字連結內容&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;br /&gt;3.手動讓Web Server認得AIR檔案&lt;br /&gt;&amp;nbsp;&amp;nbsp;在Apache 的http.conf 加入&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;IfModule&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;AddType application/vnd.adobe.air-application-installer-package+zip .air&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/IfModule&amp;gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;4.若使用Flash Player Detection Kit，可以讓使用者在站上就直接更新flash player&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://www.adobe.com/products/flashplayer/download/detection_kit/&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;5.執行程序&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;在網站上點badge安裝時&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;系統會先檢查，是否有Air RunTime,如果沒有會自動安裝下載&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;結束後，自動安裝應用程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;若已經安裝過，會檢查版本是否有更新過，如無，則可直接開啟程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;若有新版，則會安裝新版本&lt;br /&gt;6.資料來源&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://www.adobe.com/devnet/air/articles/air_badge_install.html&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;四.安裝AIR runtime到Ubuntu上&lt;br /&gt;1.下載&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; http://airdownload.adobe.com/air/lin/download/1.5/AdobeAIRInstaller.bin&lt;br /&gt;2.設定為可執行檔&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; chmod +x AdobeAIRInstaller.bin&lt;br /&gt;3.安裝&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; sudo ./AdobeAIRInstaller.bin&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;五.AIR 自動Update機制&lt;br /&gt;1.AIR Project的Application.xml內設定了這個app的版本&lt;br /&gt;&amp;nbsp;&amp;nbsp; 安裝到client上，client上以這作為已安裝版本依據&lt;br /&gt;2.在發布新的air更新檔，同時要放置一個updateInfo.xml到網站上&lt;br /&gt;&amp;nbsp;&amp;nbsp; 當作一個版本比對的參考，只要有更新AIR版本，就要修改這份XML內容&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;﻿&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;lt;update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;url&amp;gt;http://192.168.11.80/air/myApp.air&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;description&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; &amp;lt;text xml:lang="en_US"&amp;gt;AIR AutoUpdate&amp;lt;/text&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; &amp;lt;text xml:lang="zh_TW"&amp;gt;AIR 自動更新&amp;lt;/text&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;lt;/description&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;lt;/update&amp;gt;&lt;br /&gt;3.當使用者在執行其已安裝的app時，會去連線檢查&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;server上updateInfo.xml內的版本跟本機的是否一致&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;如有新版，則自動更新&lt;br /&gt;4.所以，在你的AIR App程式內&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;需要利用ApplicationUpdater 這Class來載入Server上的updateInfo.xml&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;讀取版本資料來做比對，並做更新下載 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;noscript&gt;內放當不支援flash player時,要提供顯示的文字連結內容&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;br /&gt;3.手動讓Web Server認得AIR檔案&lt;br /&gt;&amp;nbsp;&amp;nbsp;在Apache 的http.conf 加入&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;ifmodule&gt;&lt;/ifmodule&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;AddType application/vnd.adobe.air-application-installer-package+zip .air&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;4.若使用Flash Player Detection Kit，可以讓使用者在站上就直接更新flash player&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://www.adobe.com/products/flashplayer/download/detection_kit/&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;5.執行程序&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;在網站上點badge安裝時&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;系統會先檢查，是否有Air RunTime,如果沒有會自動安裝下載&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;結束後，自動安裝應用程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;若已經安裝過，會檢查版本是否有更新過，如無，則可直接開啟程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;若有新版，則會安裝新版本&lt;br /&gt;6.資料來源&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://www.adobe.com/devnet/air/articles/air_badge_install.html&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;四.安裝AIR runtime到Ubuntu上&lt;br /&gt;1.下載&lt;br /&gt;http://airdownload.adobe.com/air/lin/download/1.5/AdobeAIRInstaller.bin&lt;br /&gt;2.設定為可執行檔&lt;br /&gt;chmod +x AdobeAIRInstaller.bin&lt;br /&gt;3.安裝&lt;br /&gt;sudo ./AdobeAIRInstaller.bin&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;五.AIR 自動Update機制&lt;br /&gt;1.AIR Project的Application.xml內設定了這個app的版本&lt;br /&gt;&amp;nbsp;&amp;nbsp;安裝到client上，client上以這作為已安裝版本依據&lt;br /&gt;2.在發布新的air更新檔，同時要放置一個updateInfo.xml到網站上&lt;br /&gt;&amp;nbsp;&amp;nbsp;當作一個版本比對的參考，只要有更新AIR版本，就要修改這份XML內容&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;﻿&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"&gt;&lt;/update&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;version&gt;1.0&lt;/version&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;url&gt;http://192.168.11.80/air/myApp.air&lt;/url&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &lt;description&gt;&lt;/description&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; &lt;text xml:lang="en_US"&gt;AIR AutoUpdate&lt;/text&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; &lt;text xml:lang="zh_TW"&gt;AIR 自動更新&lt;/text&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;br /&gt;3.當使用者在執行其已安裝的app時，會去連線檢查&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;server上updateInfo.xml內的版本跟本機的是否一致&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;如有新版，則自動更新&lt;br /&gt;4.所以，在你的AIR App程式內&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;需要利用ApplicationUpdater 這Class來載入Server上的updateInfo.xml&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;讀取版本資料來做比對，並做更新下載 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;noscript&gt;內放當不支援flash player時,要提供顯示的文字連結內容&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;br /&gt;3.手動讓Web Server認得AIR檔案&lt;br /&gt;&amp;nbsp;&amp;nbsp;在Apache 的http.conf 加入&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;amp;lt;IfModule&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AddType application/vnd.adobe.air-application-installer-package+zip .air &amp;nbsp; &lt;br /&gt;&amp;amp;lt;/IfModule&amp;amp;gt; &amp;nbsp; &amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.若使用Flash Player Detection Kit，可以讓使用者在站上就直接更新flash player&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://www.adobe.com/products/flashplayer/download/detection_kit/&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;5.執行程序&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;在網站上點badge安裝時&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;系統會先檢查，是否有Air RunTime,如果沒有會自動安裝下載&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;結束後，自動安裝應用程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;若已經安裝過，會檢查版本是否有更新過，如無，則可直接開啟程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;若有新版，則會安裝新版本&lt;br /&gt;6.資料來源&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;http://www.adobe.com/devnet/air/articles/air_badge_install.html&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;四.安裝AIR runtime到Ubuntu上&lt;br /&gt;1.下載&lt;br /&gt;http://airdownload.adobe.com/air/lin/download/1.5/AdobeAIRInstaller.bin&lt;br /&gt;2.設定為可執行檔&lt;br /&gt;chmod +x AdobeAIRInstaller.bin&lt;br /&gt;3.安裝&lt;br /&gt;sudo ./AdobeAIRInstaller.bin&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;五.AIR 自動Update機制&lt;br /&gt;1.AIR Project的Application.xml內設定了這個app的版本&lt;br /&gt;&amp;nbsp;&amp;nbsp;安裝到client上，client上以這作為已安裝版本依據&lt;br /&gt;2.在發布新的air更新檔，同時要放置一個updateInfo.xml到網站上&lt;br /&gt;&amp;nbsp;&amp;nbsp;當作一個版本比對的參考，只要有更新AIR版本，就要修改這份XML內容&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;﻿&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;amp;lt;?xml version="1.0" encoding="utf-8"?&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;lt;update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;lt;url&amp;amp;gt;http://192.168.11.80/air/myApp.air&amp;amp;lt;/url&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;lt;description&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;lt;text xml:lang="en_US"&amp;amp;gt;AIR AutoUpdate&amp;amp;lt;/text&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;lt;text xml:lang="zh_TW"&amp;amp;gt;AIR 自動更新&amp;amp;lt;/text&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;lt;/description&amp;amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;lt;/update&amp;amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.當使用者在執行其已安裝的app時，會去連線檢查&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;server上updateInfo.xml內的版本跟本機的是否一致&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;如有新版，則自動更新&lt;br /&gt;4.所以，在你的AIR App程式內&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;需要利用ApplicationUpdater 這Class來載入Server上的updateInfo.xml&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;讀取版本資料來做比對，並做更新下載&lt;br /&gt;&lt;/noscript&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;六.另外需要注意的是，在FlashDevelop上開啟AIR Project在Property OutPut的設定上，需使用預定的Run Custom Command，也就是執行&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;C:\flex_sdk_4.1\bin\adl.exe;application.xml bin&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;如果只是當作一般SWF輸出到Tab上，AIR相關API會失效&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-7522328835799825419?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/7522328835799825419/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=7522328835799825419' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7522328835799825419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/7522328835799825419'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/flashdevelop-air-project.html' title='FlashDevelop 上發布Air Project相關事項'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1396320758337580314</id><published>2010-04-20T11:01:00.007+08:00</published><updated>2011-01-04T13:55:20.219+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 15 Facade</title><content type='html'>當要執行複雜的多物件功能呼叫使用&lt;br /&gt;可以利用Facade提供單一介面，整合這些要做的功能&lt;br /&gt;讓使用者只要透過呼叫Facade所提供的單一介面窗口&lt;br /&gt;就可執行整個複雜的工作內容&lt;br /&gt;例如，希望載入外部資料庫(DataBase),並利用這些載入的資料，&lt;br /&gt;產生網頁(HtmlWriter),這工作&lt;br /&gt;參與者&lt;br /&gt;1.DataBase&lt;br /&gt;&amp;nbsp;&amp;nbsp;用來載入外部資料的類別&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class Database {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Database(){}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public static Properties getProperties(String dbName){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String fileName=dbName;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Properties prop=new Properties();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prop.load(new FileInputStream(fileName));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return prop; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.HtmlWriter&lt;br /&gt;&amp;nbsp;&amp;nbsp;用來產生網頁檔案的類別&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class HtmlWriter {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Writer writer;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public HtmlWriter(Writer writer){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.writer=writer;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void title(String title)throws IOException{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.write("&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;"); &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.write("&amp;lt;title&amp;gt;"+title+"&amp;lt;/title");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.write("&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.write("&amp;lt;h1&amp;gt;"+title+"&amp;lt;/h1&amp;gt;\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void close()throws IOException{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.write("&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.Facade&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;用來整合功能的介面&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class Facade {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Facade(){}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public static void makeWelcomePage(String dbFileName,String addr, String outFileName){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Properties mailProp=Database.getProperties(dbFileName);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String userName=mailProp.getProperty(addr); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HtmlWriter writer=new HtmlWriter(new FileWriter(outFileName));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.title("Welcome "+userName); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.Main&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;外部程式&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Facade.makeWelcomePage("d:\\list.txt","xxx@xxx.com","d:\\newPage.htm");&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1396320758337580314?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1396320758337580314/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1396320758337580314' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1396320758337580314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1396320758337580314'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/design-pattern-15-facad.html' title='Design Pattern : 15 Facade'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1752111624704838110</id><published>2010-04-16T16:25:00.003+08:00</published><updated>2010-04-16T16:26:50.746+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>focusEnabled對Event影響</title><content type='html'>當我們要讓一個物件可以監聽到滑鼠或鍵盤的動作&lt;br /&gt;通常會把addEventListener到該物件上，&lt;br /&gt;但如果該物件沒有取得Focus，那所有的動作將都不會有所作用&lt;br /&gt;利用focusEnabled屬性的設定，可以讓滑鼠click到該物件&lt;br /&gt;由該物件取得focus，而非由其上層物件取得focus&lt;br /&gt;例如&lt;br /&gt;將一個TileList包裝在一個mxml的Component上&lt;br /&gt;希望TileList可以監聽到Keyboard動作而有所回應&lt;br /&gt;設定如下&lt;br /&gt;tileList.focusEnabled=true;&lt;br /&gt;tileList.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownEvent)&lt;br /&gt;&lt;br /&gt;1.KeyboardEvent需直接加在tileList上,不可加在他上層的mxml上&lt;br /&gt;&lt;br /&gt;2.利用tileList.focusEnabled = true讓滑鼠click到myList即讓&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;tileList變成focus狀態，讓上面的event可以有作用&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1752111624704838110?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1752111624704838110/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1752111624704838110' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1752111624704838110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1752111624704838110'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/focusenabledevent.html' title='focusEnabled對Event影響'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-6179048479210676812</id><published>2010-04-16T12:08:00.008+08:00</published><updated>2010-05-05T10:54:06.583+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 14 Chain of Responsibility</title><content type='html'>&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;轉送,當對於一個複雜的問題處理，可以把問題拆解成多個單一的問題處理方法(Support)每個Support,遇到丟進來的問題,會試著去解決&lt;br /&gt;Support.support(trouble)&lt;br /&gt;當無法解決時,就看看是否已經有利用Support.setNext(nextSupport)，設定好下一個Support&lt;br /&gt;如果有,就把問題丟給下一個support處理&lt;br /&gt;nextSupport.support(trouble)&lt;br /&gt;這樣的做法，可以讓每個Class可以很單純的處理一個問題，而且可以彈性的串接不同的Command&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.abstract Support&lt;br /&gt;在Support這主要的Class內定義好程式判斷的流程，也就是support function&lt;br /&gt;決定了判斷邏輯，後面繼承者，只需要把問題處理的部份(resolve)實作即可&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public abstract class Support {&lt;br /&gt;&amp;nbsp;&amp;nbsp;public Support setNext(Support next){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; this.next=next;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; return next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;public final void support(Trouble trouble){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(resolve(trouble)){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;success();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}else{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fail();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(next!=null){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;next.support(trouble);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;protected abstract boolean resolve(Trouble trouble);&lt;br /&gt;&amp;nbsp;private void success(){}&lt;br /&gt;&amp;nbsp;private void fail(){}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2.RealSupport&lt;br /&gt;可以針對各式的解決方法，產生多個不同的support子類別&lt;br /&gt;每個class的都只要針對resolve function實作處理的結果即可&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public Class RealSupport01 extends Support{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected boolean resolve(Trouble trouble){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;......&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public Class RealSupport02 extends Support{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; protected boolean resolve(Trouble trouble){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ......&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4.Trouble&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public Class Trouble{...}&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5.Main&lt;br /&gt;外部程式,產生各個解決問題的support實體,並利用&lt;br /&gt;setNext設定其解決問題的順序&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Support sp1=new RealSupport01();&lt;br /&gt;Support sp2=new RealSupport02();&lt;br /&gt;sp1.setNext(sp2);&lt;br /&gt;sp1.support(new Trouble());&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-6179048479210676812?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/6179048479210676812/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=6179048479210676812' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6179048479210676812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/6179048479210676812'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/design-pattern-14-chain-of.html' title='Design Pattern : 14 Chain of Responsibility'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-447153687419001699</id><published>2010-04-15T11:52:00.008+08:00</published><updated>2011-01-04T13:55:07.162+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 13 Visitor</title><content type='html'>如果我們需要對一個複雜系統架構(Acceptor)，針對整個系統做一巡訪&lt;br /&gt;並做不同的動作處理，將把這處理器(Visitor)的部份獨立出來成為物件&lt;br /&gt;也就是將資料處理由資料結構中分離出來，就是Visitor Pattern&lt;br /&gt;&lt;br /&gt;例如，你有一個檔案架構系統，你希望把整個檔案目錄架構整個列印出來&lt;br /&gt;我們需要有一個print_Visitor是負責來做把檔案列印出來的工作，&lt;br /&gt;只要把這print_Visitor丟到一個複雜架構(acceptor)內，就會達到這目的&lt;br /&gt;&lt;br /&gt;如果我們希望在這檔案架構內，希望可以把所有圖檔都可以產生一個縮圖&lt;br /&gt;這時候，你可以產生另一個thumb_Visitor，用來負責產生縮圖的工作&lt;br /&gt;只要把這thumb_Visitor丟到架構內，就會達到目的&lt;br /&gt;&lt;br /&gt;對於一個複雜架構的系統(Acceptor),丟進去不同功能的Visitor&lt;br /&gt;就可以對整個系統做不同功能的事&lt;br /&gt;&lt;br /&gt;實作Visitor Pattern會用到一個比較複雜的遞迴(Double dispatch)&lt;br /&gt;一般遞迴是自己呼叫自己，在這裡面是Acceptor與Visitor的彼此呼叫遞迴&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Acceptor&lt;br /&gt;Acceptor內需要定義一個accept method,這method只是都固定用來&lt;br /&gt;把自己當作參數，呼叫啟動visitor的巡訪動作&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public Class Acceptor {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; public void accept(Visitor v){&lt;br /&gt;&amp;nbsp;&amp;nbsp; v.visit(this)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; .....&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.Visitor&lt;br /&gt;程式的運作核心是在Visitor的visit function&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public Class Visitor{&lt;br /&gt;&amp;nbsp;public void visit(Acceptor entry){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;Iterator it=entry.iterator()&lt;br /&gt;&amp;nbsp;&amp;nbsp;while(it.hasNext()){&lt;br /&gt;&amp;nbsp;&amp;nbsp; Acceptor en=it.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp; en.accept(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.Main&lt;br /&gt;外部程式&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Acceptor rootdir=new Acceptor("root");&lt;br /&gt;rootdir.accept(new Visitor());&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;4.在Visitor實作迴圈上&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;private String currentdir=""&lt;br /&gt;public void visit(Directory dir){&lt;br /&gt;&amp;nbsp;String savedir=currentdir+"/"+dir.getName()&lt;br /&gt;&amp;nbsp;Iterator it=dir.iterator();&lt;br /&gt;&amp;nbsp;while(it.hasNext()){&lt;br /&gt;&amp;nbsp;&amp;nbsp;Entry entry=(Entry)it.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp;entry.accept(this)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;currentdir=savedir;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;在這範例內，先以一個currentdir儲存目前所在的目錄名稱&lt;br /&gt;savedir會是下一層的entry所在的目錄名稱&lt;br /&gt;所以在while迴圈內，利用it.next()取到的entry是與目前entry同層級的物件&lt;br /&gt;entry.accept(this)裡 的this內的currentdir與現在所在的相同&lt;br /&gt;while迴圈處裡完，也就是同層級的都處裡完了&lt;br /&gt;&lt;br /&gt;currentdir=savedir是設定好，下一層級所在的目錄&lt;br /&gt;下一個層級的this取到currentdir就會是目前層級得savedir&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-447153687419001699?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/447153687419001699/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=447153687419001699' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/447153687419001699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/447153687419001699'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/design-pattern-13-visitor.html' title='Design Pattern : 13 Visitor'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2655605738253688230</id><published>2010-04-08T17:18:00.003+08:00</published><updated>2010-04-20T11:09:07.894+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>非同步指令實作</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;在Class內，開發好多個獨立基本功能的function，希望以這些獨立的functio&lt;br /&gt;如同積木般去組合成各式不同應用，把這些function看成一個個獨立的command&lt;br /&gt;這時候會需要可以做到，讓command可以非同步的依順序執行，在執行過程中，&lt;br /&gt;提供給command的參數，除了是使用一般變數外，可能需要是上一個command作用&lt;br /&gt;完的結果，再丟到下一個command內執行&lt;br /&gt;要達到這目標，建立一個用來控制Command用的MultiCommander來處理所有要做的功能&lt;br /&gt;包括提供&lt;br /&gt;1.addCommand():讓使用者設定，當接收到什麼evnet，要去執行什麼command&lt;br /&gt;2.dispatchComplete():在使用者所開發好的各項command function內，在執行&lt;br /&gt;&amp;nbsp;&amp;nbsp;command完成後，去執行dispatchComplete(),好讓控制流程的commander知道&lt;br /&gt;&amp;nbsp;&amp;nbsp;接下來要去執行哪個command&lt;br /&gt;3.execute():呼叫，即開始執行整個command list&lt;br /&gt;4.當有需要將上一個command執行的結果傳遞給下一個command當作參數去執行&lt;br /&gt;&amp;nbsp;&amp;nbsp;這部分利用外部一個共用object物件，把要傳遞的參數放到object內傳遞&lt;br /&gt;&amp;nbsp;&amp;nbsp;達到command要執行時，才讀到真正要給的變數值，而非一開始設定addCommand&lt;br /&gt;&amp;nbsp;&amp;nbsp;時提供的值&lt;br /&gt;&lt;br /&gt;虛擬code&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;class MyClass{&lt;br /&gt;&amp;nbsp;public const cmd1Complete:String = "cmd1Complete";&lt;br /&gt;&amp;nbsp;public const cmd2Complete:String = "cmd2Complete";&lt;br /&gt;&amp;nbsp;public var commander:MultiCommander;&lt;br /&gt;&amp;nbsp;public var infoObj:Object = new Object();&lt;br /&gt;&amp;nbsp;public function TestMultiCommander(){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;infoObj.x = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander = new MultiCommander(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.addEventListener(MultiCommander.CommandComplete, onCommandComplete);&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.addCommand(MultiCommander.CommandStart,run1,infoObj).addCommand(cmd1Complete,run2,infoObj).execute();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public function run1(_info:Object):void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;_info.x++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;trace("run1 infoObj.x=",infoObj.x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.dispatchComplete(cmd1Complete); &amp;nbsp;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public function run2(_info:int):void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;_info.x++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;trace("run2 infoObj.x=",infoObj.x) &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.dispatchComplete(cmd2Complete);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;執行結果&lt;br /&gt;run1 infoObj.x=2&lt;br /&gt;run2 infoObj.x=3&lt;br /&gt;&lt;br /&gt;說明&lt;br /&gt;1.產生一個commander物件,並將commander所在的主程式class丟進去當參考&lt;br /&gt;&amp;nbsp;commander=new MultiCommander(this)&lt;br /&gt;2.設定所有會觸發的事件名稱,與用來交換資訊的物件&lt;br /&gt;&amp;nbsp;private var Run1Complete:String="Run1Complete";&lt;br /&gt;&amp;nbsp;private var Run2Complete:String="Run2Complete";&lt;br /&gt;&amp;nbsp;public var infoObj:Object=new Object()&lt;br /&gt;3.設定監聽所有指令列完成，所發出的通知&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.addEventListener(MultiCommander.CommandComplete, onCommandComplete);&lt;br /&gt;4.加入要執行的command&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.addCommand(EventType,function,args...):MultiCommander&lt;br /&gt;&amp;nbsp;&amp;nbsp;EventType:設定當接收到這eventType時&lt;br /&gt;&amp;nbsp;&amp;nbsp;function:就會去執行設定的function&lt;br /&gt;&amp;nbsp;&amp;nbsp;args:可以放所有要給function執行的參數&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;若是第一個執行的command,EventType設定就是用MultiCommander.CommandStart&lt;br /&gt;&amp;nbsp;&amp;nbsp;addCommand可以用串接方式執行&lt;br /&gt;&amp;nbsp;&amp;nbsp;例:&lt;br /&gt;&amp;nbsp;&amp;nbsp;commander.addCommand(MultiCommander.CommandStart,run1,...).addCommand(Run1Complete,run2,...)..&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;如果要在各個command間交換的變數，希望在command執行時，才到上層取值的部分&lt;br /&gt;&amp;nbsp;&amp;nbsp;將通用的變數包裝在上層的infoObj物件,再將物件傳遞給command執行&lt;br /&gt;5.所有執行的command,在完成時,都需dispatchComplete()&lt;br /&gt;&amp;nbsp;&amp;nbsp;例:&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;function run1(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;commander.dispatchComplete(Run1Complete);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6.執行&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;commander.execute();&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2655605738253688230?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2655605738253688230/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2655605738253688230' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2655605738253688230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2655605738253688230'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/blog-post.html' title='非同步指令實作'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1386786257835218503</id><published>2010-04-08T16:23:00.004+08:00</published><updated>2010-04-20T11:10:14.897+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>呼叫Function,參數以值傳遞與物件傳遞的差異</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;在呼叫執行function時，參數以物件傳遞與以變數傳遞是有相當的不同的&lt;br /&gt;如果以變數傳遞，變數值傳到function內會變成一個獨立的值，傳入後就與function外部無關&lt;br /&gt;若是把變數包在一個外部的物件上，改傳入物件，則在function內改變物件內的變數值&lt;br /&gt;改變到的是funcion外部的物件，就會跟其他程式發生關聯,也就是說傳遞到function內的&lt;br /&gt;物件可以看作只是一個物件的參考&lt;br /&gt;&lt;br /&gt;用物件傳遞的好處是，若希望做非同步多function依序執行&lt;br /&gt;以物件傳遞，可以達到，在function真正要執行時，&lt;br /&gt;才透過物件參考取到要傳進去的值&lt;br /&gt;也就是說只要利用一個class變數的object,來傳遞，要在各個function交換的值&lt;br /&gt;&lt;br /&gt;以下範例,是不考慮非同步執行的虛擬程式碼&lt;br /&gt;&lt;br /&gt;值傳遞&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;class MyClass{&lt;br /&gt;&amp;nbsp;protected var x=1&lt;br /&gt;&amp;nbsp;public function MyClass():void{&lt;br /&gt;&amp;nbsp;&amp;nbsp;run1(x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;run2(x)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public function run1(_input:int):void{&lt;br /&gt;&amp;nbsp;&amp;nbsp;_input++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;trace('run1=',x)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public function run2(_input):void{&lt;br /&gt;&amp;nbsp;&amp;nbsp;_input++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;trace('run2=',x)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;得到的結果是&lt;br /&gt;run1=1&lt;br /&gt;run2=1&lt;br /&gt;&lt;br /&gt;物件傳遞&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;class MyClass2{&lt;br /&gt;&amp;nbsp;protected var infoObj:Object=new Object();&lt;br /&gt;&amp;nbsp;public function MyClass2():void{&lt;br /&gt;&amp;nbsp;&amp;nbsp;infoObj.x=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;run1(infoObj);&lt;br /&gt;&amp;nbsp;&amp;nbsp;run2(infoObj)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public function run1(_info:Object):void{&lt;br /&gt;&amp;nbsp;&amp;nbsp;_info.x++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;trace('run1=',infoObj.x)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;public function run2(_info:Object):void{&lt;br /&gt;&amp;nbsp;&amp;nbsp;_info.x++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;trace('run2=',infoObj.x)&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;得到的結果是&lt;br /&gt;run1=2&lt;br /&gt;run2=3&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1386786257835218503?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1386786257835218503/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1386786257835218503' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1386786257835218503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1386786257835218503'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/function.html' title='呼叫Function,參數以值傳遞與物件傳遞的差異'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-1868509886696866431</id><published>2010-04-06T01:29:00.006+08:00</published><updated>2010-10-13T15:12:24.203+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android Activity與Layout XML關係</title><content type='html'>Activity與Layout XML關係&lt;br /&gt;在Android上，視覺外觀的View部分都是以XML型態存放在res/layout/目錄下&lt;br /&gt;真正執行動作的Activity程式碼，是以Java型態&lt;br /&gt;放在src的目錄下，這部份是真正執行的程式碼&lt;br /&gt;&lt;br /&gt;1.XML與Java關係&lt;br /&gt;Java與XML的關係，可以看成相當於Flex下MXML與AS的關係，&lt;br /&gt;如果以MVC架構來看，可以把Layout XML當作一個單純的view，&lt;br /&gt;而Java Code的Activity則相當於Mediator的角色，&lt;br /&gt;由Activity去控制XML的顯示內容&lt;br /&gt;&lt;br /&gt;2.如何讓Activity與XML關聯在一起？&lt;br /&gt;可以在Activity內找到setContentView這Method&lt;br /&gt;就是利用這Method把Java與XML的關係串起來&lt;br /&gt;讓Java可以操作到XML上設定的view元素&lt;br /&gt;&lt;br /&gt;3.在Java如何取得並操作XML上的元素&lt;br /&gt;要操作xml上的view元素，都是要靠id來找到要控制的物件&lt;br /&gt;&lt;br /&gt;4.如何在Layout XML內設定id值&lt;br /&gt;在layout xml內，每個元件都要設定一個id值以供辨識&lt;br /&gt;這view物件，設定值為 :@+id/要設定的id名稱&lt;br /&gt;例 &lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;Button android:id="@+id/shareBtn" android:layout_width="wrap_content"  &lt;br /&gt; android:layout_height="35px" android:text="@string/music_shareBtn" /&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;5.如何在Activity Java Code利用id值取到物件&lt;br /&gt;主要利用R.id.viewID來取得&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;TextView myText=(TextView)findViewById(R.id.myTextId);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;6.Activity取得layout view物件的標準流程&lt;br /&gt;在Activity 的onCreate內將layout xml與Activity連結在一起 &lt;br /&gt;&lt;br /&gt;例&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;    setContentView(R.layout.main);&lt;br /&gt;    TextView myText=(TextView)findViewById(R.id.myTextId);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-1868509886696866431?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/1868509886696866431/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=1868509886696866431' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1868509886696866431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/1868509886696866431'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/android-01-activitylayout-xml.html' title='Android Activity與Layout XML關係'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2736406723455415285</id><published>2010-04-02T12:40:00.003+08:00</published><updated>2010-04-20T11:12:37.556+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>Garbage Collection</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;在Flash內GC的工作是Player本身會自動會去執行，但在程式開發時要&lt;br /&gt;去儘可能回收不必要的記憶體暫存，降低記憶體使用量&lt;br /&gt;1.對Loader物件&lt;br /&gt;在使用Loader物件載入外部圖檔或swf，當已經不再需要使用時&lt;br /&gt;可以loader.unloadAndStop(true)，會強制卸載載入物件並做GC&lt;br /&gt;2.對BitmapData&lt;br /&gt;當BitmapData不再使用，要釋放bitmapData內存的資料&lt;br /&gt;可以用bitmapData.dispose();&lt;br /&gt;3.一般DisplayObjectContainer&lt;br /&gt;除了對不必要的child做remove&lt;br /&gt;DisplayObjectContainer.removeChildAt(0);&lt;br /&gt;若是屬AIR專案&lt;br /&gt;可以執行System.gc()強制立刻執行GC&lt;br /&gt;4.判別Child的Class 類型&lt;br /&gt;當要移除Child時，要知道Child的Class類型才可以使用適當的方式處理&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var sourceName:String = getQualifiedClassName(_source.getChildAt(0));&lt;br /&gt;var sourceType:Class = getDefinitionByName( sourceName) as Class;&lt;br /&gt;if (sourceType == FlexLoader) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_source.unloadAndStop(true); &amp;nbsp; &lt;br /&gt;}else if (sourceType == Bitmap) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Bitmap(_source.getChildAt(0)).bitmapData.dispose(); &lt;br /&gt;}&lt;br /&gt;_source.removeChildAt(0);&lt;br /&gt;System.gc();&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2736406723455415285?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2736406723455415285/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2736406723455415285' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2736406723455415285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2736406723455415285'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/garbage-collection.html' title='Garbage Collection'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-4015249915607910774</id><published>2010-04-02T11:46:00.005+08:00</published><updated>2010-09-26T09:00:51.077+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Action Script'/><title type='text'>BitmapData與ByteArray的操作</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;在Flash內，我們如果需要對外部載入圖檔，或是stage上的Sprite&lt;br /&gt;做一些點陣圖形的操作(變形旋轉或其他)&lt;br /&gt;要將處理過後的點陣資料，做頁面上顯示或是另做檔案儲存&lt;br /&gt;在這過程中，都是在於DisplayObject，BitmapData與ByteArray這三者的轉換處理&lt;br /&gt;以下是常用處理範例&lt;br /&gt;BitmapData操作&lt;br /&gt;1.如何取得DisplayObject的bitmapData&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var bitmapData:BitmapData=new BitmapData(w,h);&lt;br /&gt;bitmapData.draw(DisplayObject)&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.如何取得外部圖檔或swf的bitmapData&lt;br /&gt;(也就是將外部檔案寫到bitmapData內)&lt;br /&gt;1.利用Loader載入外部檔案&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var loader:Loade=new Loader()&lt;br /&gt;loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);&lt;br /&gt;loader.load('xxx.jpg');&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.載入完成後，將載入資料寫到bitmapData內&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var bitmapData:BitmapData=new BitmapData(w,h);&lt;br /&gt;bitmapData.draw(loader)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3.如何將bitmapData變成一個DisplayObject&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var bitmapData:BitmapData=new BitmapData(w,h);&lt;br /&gt;var bitmap:Bitmap=new Bitmap(bitmapData);&lt;br /&gt;DisplayObjectContainer.addChild(bitmap);&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.如何將bitmapData變成byteArray&lt;br /&gt;如果要將圖檔以資料方式傳到Server上，要轉成byteArray形式才能上傳&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var byteArray:ByteArray=JPEGEncoder.ecncode(bitmapdata)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ByteArray操作&lt;br /&gt;1.如何將byteArray變成一個實體檔案&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var targetFile:File =File.createTempFile();&lt;br /&gt;var stream:FileStream = new FileStream();&lt;br /&gt;stream.open(targetFile, FileMode.WRITE)&lt;br /&gt;stream.writeBytes(byteArray, 0, 0);&lt;br /&gt;stream.close();&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.如何將byteArray變成bitmapData&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;var bitmapData:BitmapData=new BitmapData(w,h);&lt;br /&gt;bitmapData.setPixels(new Rectangle(),byteArray);&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-4015249915607910774?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/4015249915607910774/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=4015249915607910774' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4015249915607910774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/4015249915607910774'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/04/bitmapdatabytearray.html' title='BitmapData與ByteArray的操作'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-2275582328461737648</id><published>2010-03-26T11:49:00.008+08:00</published><updated>2011-01-04T13:54:50.581+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 12 Decorator</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;把裝飾物件與主要內容物件當成相同的物件,也就是給予相同的API&lt;br /&gt;可以在程式內用相同的方式操作，就可以用來組合出有彈性並複雜的結果&lt;br /&gt;這就是Decorator&lt;br /&gt;&lt;br /&gt;把裝飾與實際內容物當作相同的方式處裡&lt;br /&gt;範例，要讓輸出字串可以彈性的增加外觀修飾的裝飾&lt;br /&gt;把輸出物拆解成主要內容與裝飾內容，裝飾內容可能也多種的變化&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Display (abstract)&lt;br /&gt;提供一個主要內容與裝飾物都要依循的標準操作方法(API) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public abstract class Display {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract int getColumns();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract int getRows();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract String getRowText(int row);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public final void show(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(...){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.out.println(getRowText(i));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2.StringDisplay 主內容顯示類別&lt;br /&gt;真正的主要內容顯示class,在實作抽象method時,具體的執行工作內容&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class StringDisplay extends Display {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private String string;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public StringDisplay(String string){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.string=string;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getColumns() { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.getBytes().length;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getRows() { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public String getRowText(int row) { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(row==0){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}else{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3.Border(abstract)&lt;br /&gt;修飾抽象類別,還是繼承了主要Display類別，但是導入了一個display物件&lt;br /&gt;來作為內部method委讓操作使用&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public abstract class Border extends Display {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected Display display; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public Border(Display display){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.display=display;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4.SlideBorder&lt;br /&gt;在實作抽象method內,利用委讓操作display物件取得主要內容&lt;br /&gt;再添加上裝飾的內容後，將最後結果輸出&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class SlideBorder extends Border {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private char borderChar;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public SlideBorder(Display display,char borderChar){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(display);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.borderChar=borderChar;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getColumns() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1+display.getColumns()+1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getRows() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return display.getRows();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public String getRowText(int row) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return borderChar+display.getRowText(row)+borderChar;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5.Main外部程式&lt;br /&gt;可任意包裝產生所要的結果&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Display b1=new StringDisplay("hello ozzy");&lt;br /&gt;b1.show();&lt;br /&gt;Display b2=new SlideBorder(new StringDisplay("hello sun"),'*');&lt;br /&gt;b2.show();&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-2275582328461737648?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/2275582328461737648/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=2275582328461737648' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2275582328461737648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/2275582328461737648'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/03/design-pattern-12-decorator.html' title='Design Pattern : 12 Decorator'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-9204580100876425595</id><published>2010-03-25T14:52:00.007+08:00</published><updated>2011-01-04T13:54:06.008+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 11 Composit</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;當我們遇到有容器(container)與內容(content)需要作遞迴處理&lt;br /&gt;例如要對一個目錄下所有的檔案與目錄都作處理&lt;br /&gt;因為目錄(container)與檔案(content)都可以被裝到目錄下&lt;br /&gt;這時候，可以把兩者都當作是"目錄進入點"(entry)來看&lt;br /&gt;這時候容器與內容就都是屬於同一類的東西&lt;br /&gt;&lt;br /&gt;這時候針對entry上定義一個"進入點"所需要的功能&lt;br /&gt;而容器與內容都只是entry的子類別，在遞迴程序的操作上&lt;br /&gt;只要使用屬於entry的method即可，而不用管是容器或是內容&lt;br /&gt;&lt;br /&gt;參與者&lt;br /&gt;1.Entry(abstract)&lt;br /&gt;實際執行顯示的是printList(String prefix)&lt;br /&gt;這部份在子類別內實作&lt;br /&gt;而留給外部呼叫的只有printList()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public abstract class Entry {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract String getName();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public abstract int getSize();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void printList(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;priinList("");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected abstract void printList(String prefix);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.File&lt;br /&gt;把Entry內設定的3個abstract method 實作出來&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class File extends Entry {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private String name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private int size;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public File(String name,int size){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.name=name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.size=size;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public String getName() { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this.name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getSize() { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this.size;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void printList(String prefix) { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.out.println(prefix+"/"+this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3.Directory&lt;br /&gt;在屬於container的class內使用iterator來迴圈執行entry所提供的method&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class Directory extends Entry {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private String name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private Vector directory=new Vector();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public Directory(String name){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.name=name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public String getName() { &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this.name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public int getSize() { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int size=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Iterator it=directory.iterator();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(it.hasNext()){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Entry entry=(Entry)it.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;size+=entry.getSize();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return size;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void printList(String prefix) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//把自己列印出來，並叫其子node執行entry的列印指令&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.out.println(prefix+"/"+this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Iterator it=directory.iterator();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(it.hasNext()){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Entry entry=(Entry)it.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entry.printList(prefix+"/"+name);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public Entry add(Entry entry){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;directory.add(entry);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.Main 外部程式&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Directory root=new Directory("root");&lt;br /&gt;Directory folder1=new Directory("folder1");&lt;br /&gt;File file1=new File("file01",100);&lt;br /&gt;File file2=new File("file02",200);&lt;br /&gt;root.add(folder1);&lt;br /&gt;folder1.add(file1);&lt;br /&gt;folder1.add(file2);&lt;br /&gt;root.printList();&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2849841227607903652-9204580100876425595?l=ozzysun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozzysun.blogspot.com/feeds/9204580100876425595/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2849841227607903652&amp;postID=9204580100876425595' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9204580100876425595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2849841227607903652/posts/default/9204580100876425595'/><link rel='alternate' type='text/html' href='http://ozzysun.blogspot.com/2010/03/design-pattern-11-composition.html' title='Design Pattern : 11 Composit'/><author><name>ozzysun</name><uri>http://www.blogger.com/profile/03399553151399010015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh5.google.com/ozzysun/RvTiyMNwxNI/AAAAAAAABhY/LHImYB0qN3w/oz_jimijpg.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2849841227607903652.post-7266815051651336110</id><published>2010-03-15T11:35:00.004+08:00</published><updated>2011-01-04T13:54:35.227+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='程式設計'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Design Pattern : 09 Bridge</title><content type='html'>通常產生子類別，會有兩種型態&lt;br /&gt;1.extends繼承:&lt;br /&gt;以繼承方式來產生子類別的目的，是在子類別新增功能&lt;br /&gt;屬於功能性的擴增&lt;br /&gt;2.implement實作:&lt;br /&gt;父類別只是一個抽象類別(abstract)或介面(interface)&lt;br /&gt;實作後的子類別，與父類別的功能是相同的，但每個功能可以有不同的展現&lt;br /&gt;屬於實作部分的擴增&lt;br /&gt;&lt;br /&gt;如果在做程式設計，希望可以把實作與功能部分完全分離，&lt;br /&gt;如範例中,Display屬於功能性父類別,DisplayImp屬於實作父類別&lt;br /&gt;如果想要新增功能,就擴充在Display的子類別內&lt;br /&gt;如果想要改變輸出型態，如輸出文字變輸出html,&lt;br /&gt;則新增DisplayImp的子類別&lt;br /&gt;&lt;br /&gt;Bridge Pattern就是在功能類別(Display)內放一個變數(impl)存放實作類別(DisplayImp)的實體&lt;br /&gt;讓功能類別(Display)內的method都是在操作實作類別(DisplayImp)的功能&lt;br /&gt;把分離的實作擴充與功能擴充部分串起來，就是Bridge Pattern&lt;br /&gt;參與者&lt;br /&gt;1.Display(功能父類別)&lt;br /&gt;在Display功能父類別內，利用一個變數impl儲存實作類別的instance&lt;br /&gt;所有在功能類別內的操作，內部真正都執行的都是impl在執行&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;public class Display {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private DisplayImp impl;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public Display(DisplayImp impl){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.impl=impl;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void open(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;impl.rawOpen();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2.abstract DisplayImp(實作的父類別)&lt;br /&gt;實作父類別，定義了所要實作類別所需要的method名稱，再交由子類別去實作出來&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale 
