<?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:blogger='http://schemas.google.com/blogger/2008' 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-1332287896270034097</id><updated>2024-09-27T21:32:09.015+08:00</updated><category term="android"/><category term="develop"/><category term="browser"/><category term="dart"/><category term="launcher"/><category term="security"/><category term="setting"/><title type='text'>冷門新世界</title><subtitle type='html'>冷門技術的釐清</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-260704226744558686</id><published>2015-04-01T14:04:00.003+08:00</published><updated>2015-04-01T14:04:38.094+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="setting"/><title type='text'>[android] how to check &quot;unknown source&quot; by default in settings/security ?</title><content type='html'>file: &amp;lt;aosp&amp;gt;/device/nvidia/macallan/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bool name=&quot;def_bluetooth_on&quot;&amp;gt;false&amp;lt;/bool&amp;gt;&lt;br /&gt;
&amp;lt;bool name=&quot;def_wifi_display_on&quot;&amp;gt;false&amp;lt;/bool&amp;gt;&lt;br /&gt;
&amp;lt;bool name=&quot;def_install_non_market_apps&quot;&amp;gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;true&lt;/span&gt;&lt;/b&gt;&amp;lt;/bool&amp;gt;&lt;br /&gt;
&amp;lt;bool name=&quot;def_package_verifier_enable&quot;&amp;gt;true&amp;lt;/bool&amp;gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/260704226744558686/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-check-unknown-source-by.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/260704226744558686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/260704226744558686'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-check-unknown-source-by.html' title='[android] how to check &quot;unknown source&quot; by default in settings/security ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-5931070382445905414</id><published>2015-04-01T14:00:00.001+08:00</published><updated>2015-04-01T14:00:22.239+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="develop"/><category scheme="http://www.blogger.com/atom/ns#" term="launcher"/><title type='text'>[android] how to update placement of home screen in launcher ?</title><content type='html'>file: &amp;lt;aosp&amp;gt;/packages/apps/Launcher2/res/xml-sw720dp/default_workspace.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;favorite&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; launcher:packageName=&quot;com.android.music&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; launcher:className=&quot;com.android.music.MusicBrowserActivity&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; launcher:screen=&quot;2&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; launcher:x=&quot;1&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; launcher:y=&quot;1&quot; /&amp;gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/5931070382445905414/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-update-placement-of-home.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5931070382445905414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5931070382445905414'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-update-placement-of-home.html' title='[android] how to update placement of home screen in launcher ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-2842745126272305313</id><published>2015-04-01T13:56:00.002+08:00</published><updated>2015-04-01T13:56:51.581+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="browser"/><category scheme="http://www.blogger.com/atom/ns#" term="develop"/><title type='text'>[android] how to change default bookmark preloads in browser settings ?</title><content type='html'>file: &amp;lt;aosp&amp;gt;/packages/apps/Browser/src/com/android/browser/provider/BrowserProvider2.java&lt;br /&gt;
&lt;br /&gt;
private void addDefaultBookmarks(SQLiteDatabase db, long parentId) {&lt;br /&gt;
....&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //bookmarks = res.getTextArray(R.array.bookmarks);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //preloads = res.obtainTypedArray(R.array.bookmark_preloads);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; bookmarks = res.getTextArray(R.array.bookmarks_tt_china);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; preloads = res.obtainTypedArray(R.array.bookmark_preloads_tt_china);&lt;br /&gt;
}</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/2842745126272305313/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-change-default-bookmark.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2842745126272305313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2842745126272305313'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-change-default-bookmark.html' title='[android] how to change default bookmark preloads in browser settings ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-5532531604744347389</id><published>2015-04-01T13:47:00.000+08:00</published><updated>2015-04-01T13:47:05.176+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="browser"/><category scheme="http://www.blogger.com/atom/ns#" term="develop"/><title type='text'>[android] how to change default homepage in browser settings ?</title><content type='html'>file : &amp;lt;aosp&amp;gt;/packages/apps/Browser/res/values/strings.xml&lt;br /&gt;
&amp;lt;!-- The default homepage. --&amp;gt;&lt;br /&gt;
&amp;lt;string name=&quot;homepage_base&quot; translatable=&quot;false&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;&lt;i&gt;http://www.google.com&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/5532531604744347389/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-change-default-homepage.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5532531604744347389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5532531604744347389'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2015/04/android-how-to-change-default-homepage.html' title='[android] how to change default homepage in browser settings ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-2903470834646127893</id><published>2013-12-03T15:39:00.001+08:00</published><updated>2013-12-03T15:39:48.748+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dart"/><title type='text'>dart 語言心得</title><content type='html'>Comments:&lt;br /&gt;
單行 &amp;nbsp;//&lt;br /&gt;
多行 &amp;nbsp;/*...*/&lt;br /&gt;
document comments&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ///&lt;br /&gt;
&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 內容中含有 [xxx] , xxx參考到 class/method/field/top-level variable/function/parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Two runtime modes:&lt;br /&gt;
&amp;nbsp; production - faster, deploy (ignore assert statements and static type checking)&lt;br /&gt;
&amp;nbsp; checked - helpful development&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variable default value&lt;br /&gt;
&amp;nbsp; Uninitialized variables have an initial value of &lt;b&gt;null&lt;/b&gt;.&lt;br /&gt;
&amp;nbsp; int linecnt; &amp;nbsp;&amp;lt;&amp;lt;-- linecnt is null by default, not 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Optional type system&lt;br /&gt;
&amp;nbsp; it is optional to declare the type of variables/functions/parameters/fields.&lt;br /&gt;
&amp;nbsp; if you declare it, it is useful to type checking on checked runtime mode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Final and Const&lt;br /&gt;
&amp;nbsp; final variable is initialized&lt;b&gt; the first time&lt;/b&gt; it&#39;s used, it can set only once.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; (Lazy initialization of final variables helps apps start up faster)&lt;br /&gt;
&amp;nbsp; const variables is compile-time constants.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; const pi=3.14159;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; const round=2*pi;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Build-in Types&lt;br /&gt;
&amp;nbsp; numbers: int (任何長度的整數) / double(凡含小數點的數字) / num&lt;br /&gt;
&amp;nbsp; strings: String&lt;br /&gt;
&amp;nbsp; booleans: bool (true/false)&lt;br /&gt;
&amp;nbsp; lists: List&amp;lt;T&amp;gt; / Collection&lt;br /&gt;
&amp;nbsp; maps: Map&lt;br /&gt;
&lt;br /&gt;
String (immutable sequences of UTF-16 code units)&lt;br /&gt;
&amp;nbsp; quote / double-quote / triple-quote for multi-lines string&lt;br /&gt;
&amp;nbsp; raw string ==&amp;gt; r&quot;In a raw string, even \n isn&#39;t special.&quot;&lt;br /&gt;
&amp;nbsp; 字串比較用 == (是比較字串內容)&lt;br /&gt;
&lt;br /&gt;
Boolean&lt;br /&gt;
&amp;nbsp; &amp;nbsp;In Dart,&lt;b&gt; only the value true is treated as true, all other values are treated as false&lt;/b&gt;.&lt;br /&gt;
&amp;nbsp; &amp;nbsp;check string if empty ==&amp;gt; str.isEmpty()&lt;br /&gt;
&amp;nbsp; &amp;nbsp;check int if NaN &amp;nbsp;==&amp;gt; iVar.isNaN()&lt;br /&gt;
&lt;br /&gt;
List (zero-based indexing)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;In Dart, array is List object.&lt;br /&gt;
&amp;nbsp; &amp;nbsp;var list = [1,2,3,4];&lt;br /&gt;
&lt;br /&gt;
Map&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 用宣告方式產生&lt;br /&gt;
&amp;nbsp; &amp;nbsp; var abc = {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;test1&#39; : [123,456,789],&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;test2&#39; : [666,777]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; };&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 用 constructor產生&lt;br /&gt;
&amp;nbsp; &amp;nbsp; var def = new Map();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; var nnn = new Map&amp;lt;int, String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Function&lt;br /&gt;
&amp;nbsp; if no return value is specified, the statement return null.&lt;br /&gt;
&lt;br /&gt;
Optional parameters (can be either&lt;b&gt; positional&lt;/b&gt; or &lt;b&gt;named&lt;/b&gt;, but not both)&lt;br /&gt;
&amp;nbsp; default values must be compile-time constants such as literals. If no default value, the value is null.&lt;br /&gt;
&amp;nbsp; checking caller passing value for an optional parameter: &lt;b&gt;?param&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;if (?device) { return true if the caller specified the parameter&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; //....&lt;br /&gt;
&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Named parameters use {param1, param2,...} to declare&lt;br /&gt;
&amp;nbsp; &amp;nbsp; enableFlags( {bool bold, bool hidden : false} ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; // ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; In caller side, named parameters using&amp;nbsp;&lt;b&gt;paramName : value&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&amp;nbsp; &amp;nbsp;enableFlags(bold: true, hidden: false);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Positional parameters use [] to declare it&lt;br /&gt;
&amp;nbsp; &amp;nbsp; String say( String from, String msg, [String device=&quot;carrier&quot;, String mood] ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Type Test Operators&lt;br /&gt;
&amp;nbsp; as Typecast&lt;br /&gt;
&amp;nbsp; is &amp;nbsp;True if the object has the specified type&lt;br /&gt;
&amp;nbsp; is! False if the object has the specified type&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/2903470834646127893/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2013/12/dart.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2903470834646127893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2903470834646127893'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2013/12/dart.html' title='dart 語言心得'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-3342759822997046040</id><published>2013-10-24T08:18:00.002+08:00</published><updated>2013-10-24T08:18:50.545+08:00</updated><title type='text'>[android build] build/core/base_rules.mk MODULE.TARGET.xxx ... already defined by ...</title><content type='html'>在 build android 的過程中出現 ... build/core/base_rules.mk MODULE.TARGET.xxx ... already defined by ... ，那麼應該是 某個 Android.mk 中的 module name 重複了，因此解決的方法是&lt;br /&gt;
1. 將 module name 改名，避免同名。&lt;br /&gt;
2. 將 Android.mk 的前後加入 ifeq ($(ENV_VAR), XXYY) ... endif ，讓符合某個 環境變數才將 module 加入</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/3342759822997046040/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2013/10/android-build-buildcorebaserulesmk.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/3342759822997046040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/3342759822997046040'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2013/10/android-build-buildcorebaserulesmk.html' title='[android build] build/core/base_rules.mk MODULE.TARGET.xxx ... already defined by ...'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-4129061119834274236</id><published>2013-06-10T10:34:00.002+08:00</published><updated>2013-06-10T10:34:13.370+08:00</updated><title type='text'>步驟:如何root HTC Aria和 WildfireS手機 ?</title><content type='html'>目前按照下列步驟已成功將自己的WildfireS和女兒的Aria手機成功地 root 了。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;行前必要動作: 備份&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
在執行下列動作之前，請務必要事先做好備份工作，以免後悔莫及。&lt;br /&gt;另外，htc sync 能夠正常透過 usb cable 連接到你的手機。(最主要是 adb 可以連結)&lt;br /&gt;
&lt;br /&gt;
1. unlock bootloader (再次提醒，&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;在進行此步驟之前請備份&lt;/span&gt;&lt;/b&gt;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 去網站 &lt;a href=&quot;http://www.htcdev.com/&quot;&gt;www.htcdev.com&lt;/a&gt; 申請 unlock bootloader，請依照網站說明步驟進行(非常清楚容易)。 &amp;nbsp; &amp;nbsp;通常進行到最後 燒錄 unlock bootloader &amp;nbsp;bin file 之後，你的手機會被 clean boot，所以才再次提醒你務必要備份你的重要資料(外部 sdcard中的資料是不會被清除的)。&lt;br /&gt;
&lt;br /&gt;
2. 取得 root 升級包 (不是整個 image 包，而是單純的內含 su 而已的 root 包)。&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 去網站 apk.tw 搜尋取得上述的 &quot;root升級包 for HTC&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://apk.tw/forum.php?mod=viewthread&amp;amp;tid=58559&amp;amp;fromuid=249407&quot;&gt;http://apk.tw/forum.php?mod=viewthread&amp;amp;tid=58559&amp;amp;fromuid=249407&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://apk.tw/thread-240301-1-1.html&quot;&gt;http://apk.tw/thread-240301-1-1.html&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 主要是參考這一篇&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 安裝 &quot;刷機精靈&quot; ，官網是&amp;nbsp;&lt;a href=&quot;http://apk.tw/go.php?u=aHR0cDovL3d3dy5zaHVhbWUuY29t&quot; style=&quot;background-color: #f4f4f4; color: #336699; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px; outline: none medium; word-wrap: break-word;&quot; target=&quot;_blank&quot;&gt;http://www.shuame.com&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; 使用 &quot;一鍵刷機&quot; 功能，將取得的 root 包燒錄進去。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 成功後，你的手機已經成功安裝 root 相關程式，可以透過 EF FileExplorer 去檢查看看。&lt;br /&gt;
&lt;br /&gt;
3. 安裝 Link2SD，來擴充手機裡的 internal space (安裝或升級 APK 所需的空間)&lt;br /&gt;
&amp;nbsp; 重點是 透過 外部 sdcard 來擴充，首先將 sdcard 分割成兩個 partitions，其中一個必須是 ext2/3/4等 type(通常選擇 ext3, size 約 1~2G)。&lt;br /&gt;
&amp;nbsp; 另外，需適當地設定 Link2SD 來讓系統使用延伸的 ext3 partition空間。&lt;br /&gt;
&lt;br /&gt;
4. 做完上述的動作，基本上已經完成 root 和 擴充 APK 空間的破解了。&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 雖然上述的參考都是 Wildfire S，但是同樣的步驟應用於 Aria (A6380)也同樣可行。</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/4129061119834274236/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2013/06/root-htc-aria-wildfires.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/4129061119834274236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/4129061119834274236'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2013/06/root-htc-aria-wildfires.html' title='步驟:如何root HTC Aria和 WildfireS手機 ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-3602172946471373699</id><published>2012-11-26T16:42:00.001+08:00</published><updated>2013-10-24T08:27:00.621+08:00</updated><title type='text'>[android] envsetup.sh</title><content type='html'>envsetup.sh 會去找&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vendor/*/vendorsetup.sh&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vendor/*/*/vendorsetup.sh&lt;br /&gt;
&amp;nbsp; &amp;nbsp; device/*/*/vendorsetup.sh&lt;br /&gt;
&lt;br /&gt;
若有找到，則逐一 source vendorsetup.sh&lt;br /&gt;
&lt;br /&gt;
其中，&lt;br /&gt;
/*/ 檢查第一層目錄下的 vendorsetup.sh&lt;br /&gt;
/*/*/ 檢查第二層目錄下的 vendorsetup.sh&lt;br /&gt;
&lt;br /&gt;
vendorsetup.sh 內含一些 bash functions，可以含入到 build console environment 中可以方便呼叫使用</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/3602172946471373699/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2012/11/android-envsetupsh.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/3602172946471373699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/3602172946471373699'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2012/11/android-envsetupsh.html' title='[android] envsetup.sh'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-7328177428421097944</id><published>2012-11-26T16:34:00.000+08:00</published><updated>2012-11-26T16:34:17.442+08:00</updated><title type='text'>makefile for android build</title><content type='html'>makefile depends&lt;br /&gt;
&lt;br /&gt;
&amp;lt;android source root&amp;gt;/Makefile {&lt;br /&gt;
&amp;nbsp; build/core/main.mk {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; build/core/config.mk {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; build/core/envsetup.mk&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; build/core/product_config.mk =&amp;gt; product.mk ==&amp;gt; AndroidProducts.mk ==&amp;gt; TARGET_DEVICE&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; BoardConfig.mk ==&amp;gt; TARGET_CPU_ABI&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; include $(BYUILD_SYSTEM)/Makefile&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
根據上述的引入順序，AndroidProducts.mk 先載入，BoardConfig,mk 才載入&lt;br /&gt;
&lt;br /&gt;
-include &amp;lt;file&amp;gt; ## 無論include過程中出現甚麼錯誤，都不要報錯繼續執行。&lt;br /&gt;
TOPDIR == &amp;lt;android source root&amp;gt;/&lt;br /&gt;
BUILD_SYSTEM ==&amp;nbsp;&amp;nbsp;&amp;lt;android source root&amp;gt;/build/core/&lt;br /&gt;
&lt;br /&gt;
export OUT_DIR=&amp;lt;your out folder&amp;gt; ##可以設定你所想要產生的位置&lt;br /&gt;
&lt;br /&gt;
must have only one BoardConfig.mk in whole build environment &amp;nbsp;## config.mk &amp;nbsp;line#129&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/7328177428421097944/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2012/10/makefile-for-android-build.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7328177428421097944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7328177428421097944'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2012/10/makefile-for-android-build.html' title='makefile for android build'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-5283185804968252246</id><published>2012-11-26T11:38:00.004+08:00</published><updated>2012-11-26T11:38:58.397+08:00</updated><title type='text'>why has casecheck.txt and CaseCheck.txt in android out_dir ?</title><content type='html'>Q:&amp;nbsp;why has casecheck.txt and CaseCheck.txt in android out_dir ?&lt;br /&gt;
A: Tracing the build/core/main.mk, those files are help to check whether your file system supports case-sensitive or not. If your file system does not support case-sensitive, the android build will exit and notice you &quot;Case-insensitive filesystems not supported&quot;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/5283185804968252246/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2012/11/why-has-casechecktxt-and-casechecktxt.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5283185804968252246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5283185804968252246'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2012/11/why-has-casechecktxt-and-casechecktxt.html' title='why has casecheck.txt and CaseCheck.txt in android out_dir ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-7066038142713036070</id><published>2012-11-26T09:36:00.001+08:00</published><updated>2012-12-13T11:56:16.503+08:00</updated><title type='text'>[Android] trace to make system for tegra platform</title><content type='html'>Q1: tegra BSP includes kernel source code, 所以如何知道 tegra BSP 是使用 kernel 的哪一個 config file 來 build ?&lt;br /&gt;
A1:&lt;br /&gt;
在 device/nvidia/xxx/BoardConfig.mk 檔案中的 TARGET_TEGRA_VERSION 會控制&lt;br /&gt;
在 vendor/nvidia/build/kernel.mk 選擇哪一個 config file&lt;br /&gt;
&lt;br /&gt;
例如:&lt;br /&gt;
在 device/nvidia/dalmore/BoardConfig.mk 檔案中的 TARGET_TEGRA_VERSION := t114&lt;br /&gt;
那麼在 vendor/nvidia/build/kernel.mk 則 TARGET_KERNEL_CONFIG = tegra11_android_defconfig&lt;br /&gt;
&lt;br /&gt;
Q2: tegra BSP中，在 android make system 中，如何包含 kernel的相關環境變數設定?&lt;br /&gt;
A2:&lt;br /&gt;
在 device/nvidia/xxx/BoardConfig.mk 檔案中的最後一行，include vendor/nvidia/build/definitions.mk&lt;br /&gt;
而在 definitions.mk include detectversion.mk&lt;br /&gt;
&lt;br /&gt;
AndroidBoard.mk include vendor/nvidia/build/kernel.mk and nv_targets.mk</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/7066038142713036070/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2012/11/android-tracking-to-make-system-for.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7066038142713036070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7066038142713036070'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2012/11/android-tracking-to-make-system-for.html' title='[Android] trace to make system for tegra platform'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-5186969826901719846</id><published>2012-10-04T13:50:00.002+08:00</published><updated>2012-10-04T13:50:27.975+08:00</updated><title type='text'>[Android] MODULE_TAGS</title><content type='html'>* LOCAL_MODULE_TAGS could be [user/debug/eng/tests/optional/samples/shell_ash/shell_mksh]&lt;br /&gt;
==&amp;gt; if wrong tag, the error msg is &quot;unusual tags xxx on yyy at ....&quot; in base_rules.mk&lt;br /&gt;
&lt;br /&gt;
* TARGET_BUILD_VARIANT could be [user/userdebug/eng/tests]&lt;br /&gt;
==&amp;gt; when user , tags_to_install = user&lt;br /&gt;
==&amp;gt; when userdebug, tags_to_install = user debug&lt;br /&gt;
==&amp;gt; when eng (or sdk build), tags_to_install = user debug eng&lt;br /&gt;
==&amp;gt; when tests, tags_to_install =&amp;nbsp;user debug eng tests&lt;br /&gt;
==&amp;gt; those &quot;optional&quot; modules are decided on declaring PRODUCT_PACKAGES&lt;br /&gt;
refer to main.mk&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/5186969826901719846/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2012/10/android-moduletags.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5186969826901719846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5186969826901719846'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2012/10/android-moduletags.html' title='[Android] MODULE_TAGS'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-6337878277959277178</id><published>2011-07-12T10:23:00.000+08:00</published><updated>2011-07-12T10:25:31.594+08:00</updated><title type='text'>保護源碼智慧財產權, binary code build for Android</title><content type='html'>shared library I --- will copy to system/lib&lt;br /&gt;
====================&lt;br /&gt;
LOCAL_PATH := $(my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
LOCAL_PREBUILT_LIBS := libxxx.so&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
include $(BUILD_MULTI_PREBUILT)&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
shared library II --- will copy to system/lib/extra&lt;br /&gt;
====================&lt;br /&gt;
LOCAL_PATH := $(my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/extra&lt;br /&gt;
LOCAL_PRELINK_MODULE := false&lt;br /&gt;
LOCAL_PREBUILT_LIBS := libxxx.so&lt;br /&gt;
LOCAL_MODULE := libxxx&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
execution file -- will copy to system/bin&lt;br /&gt;
====================&lt;br /&gt;
LOCAL_PATH := $(my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
LOCAL_PREBUILT_EXECUTABLES := sample.exe&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
include $(BUILD_MULTI_PREBUILT)&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
apk file -- will copy to system/app&lt;br /&gt;
====================&lt;br /&gt;
LOCAL_PATH := $(my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
LOCAL_MODULE := sample&lt;br /&gt;
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
LOCAL_MODULE_CLASS := APPS&lt;br /&gt;
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)&lt;br /&gt;
LOCAL_CERTIFICATE := xxxx&lt;br /&gt;
include $(BUILD_PREBUILT)&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
jar file -- will copy to system/framework&lt;br /&gt;
====================&lt;br /&gt;
LOCAL_PATH := $(my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
LOCAL_STATIC_JAVA_LIBRARIES := libxxx&lt;br /&gt;
LOCAL_MODULE := com.aaa.bbb.xxx.jar&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
LOCAL_MODULE_CLASS := JAVA_LIBRARIES&lt;br /&gt;
LOCAL_MODULE_PATH := $(ATRGET_OUT_JAVA_LIBRARIES)&lt;br /&gt;
LOCAL_SRC_FILES := $(LOCAL_MODULE)&lt;br /&gt;
include $(BUILD_PREBUILT)&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
xml file -- will copy to system/etc/permissions&lt;br /&gt;
====================&lt;br /&gt;
LOCAL_PATH := $(my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
LOCAL_MODULE := com.aaa.bbb.xxx.xml&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
LOCAL_MODULE_CLASS := ETC&lt;br /&gt;
LOCAL_MODULE_PATH := $(ATRGET_OUT_ETC)/permissions&lt;br /&gt;
LOCAL_SRC_FILES := $(LOCAL_MODULE)&lt;br /&gt;
include $(BUILD_PREBUILT)&lt;br /&gt;
====================</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/6337878277959277178/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/07/binary-code-build-for-android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/6337878277959277178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/6337878277959277178'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/07/binary-code-build-for-android.html' title='保護源碼智慧財產權, binary code build for Android'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-5865310391786655324</id><published>2011-04-14T13:22:00.001+08:00</published><updated>2012-10-04T13:32:27.120+08:00</updated><title type='text'>Daily Build development - Part 1</title><content type='html'>daily build script algorithm should be organized the following segments&lt;br /&gt;
1. environment variables setting: to change values to fit your build machine environment easily&lt;br /&gt;
2. establish build environment folder: to gather latest correct source code in this folder for ready to build&lt;br /&gt;
3. execute target build: to perform actual build procedure for target and check whether it is successful finally&lt;br /&gt;
4. pack all image to final image with version label rule for upgrading procedure (optional)&lt;br /&gt;
5. copy target image to daily folder if success, copy error logs to daily folder if fail&lt;br /&gt;
6. copy final image to shared server</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/5865310391786655324/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/daily-build-development-part-1.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5865310391786655324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5865310391786655324'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/daily-build-development-part-1.html' title='Daily Build development - Part 1'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-8762757247027518072</id><published>2011-04-14T13:19:00.000+08:00</published><updated>2011-04-15T15:46:00.642+08:00</updated><title type='text'>Integration Redmine with VisualSVN server for Windows - Part3</title><content type='html'>This article is focus on &lt;b&gt;how to refresh repository automatically&lt;/b&gt; after committing source code into SVN which is associated with Redmine.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
Preconditions: required&amp;nbsp;knowledge&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
1. subversion hook and subversion commands&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
2. script language programming: vbs, dos shell&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
To complete above requirements, It is enough that we focus on both hooks : post-commit&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
&lt;br /&gt;
Before implementing post-commit.cmd, you have to configure Redmine administration settings.&lt;br /&gt;
&lt;br /&gt;
Please refer to &quot;Integration Redmine with VisualSVN server for Windows - Part1&quot;&lt;br /&gt;
(&lt;a href=&quot;http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn.html&quot;&gt;http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn.html&lt;/a&gt;)&lt;br /&gt;
Configuration of Redmine Step2 and Step3.&lt;br /&gt;
&lt;br /&gt;
Algorithm of post-commit.cmd: please reference Redmine&#39;s How-to&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/8762757247027518072/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn_9393.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/8762757247027518072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/8762757247027518072'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn_9393.html' title='Integration Redmine with VisualSVN server for Windows - Part3'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-5708940337460959229</id><published>2011-04-14T11:05:00.001+08:00</published><updated>2012-10-04T13:32:09.379+08:00</updated><title type='text'>Installation of build machine for android system</title><content type='html'>To build image for android system, it had better to use Ubuntu as OS system (recommended by android website) and please reference&amp;nbsp;&lt;a href=&quot;http://source.android.com/source/initializing.html&quot;&gt;http://source.android.com/source/initializing.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
1. install Ubuntu 10.10 64 bit for Froyo and later, After testing, it also is applied to Eclair&lt;br /&gt;
&amp;nbsp; &amp;nbsp; please set machine name , username, and its password&lt;br /&gt;
2. setup proxy if required by company&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * System &amp;gt; Preferences &amp;gt; Network Proxy: manual proxy configuration, and then click [Apply System-Wide...]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * cd /etc/apt/ , sudo gedit&amp;nbsp;apt.conf ==&amp;gt; to input correct id and password (http://id:pwd@.....)&lt;br /&gt;
3. System &amp;gt; Administration &amp;gt; Package Manager: Reload, Mark, Apply (all)&lt;br /&gt;
4. Follows android&#39;s instructions to install required packages&lt;br /&gt;
5. setup machine name: etc/hosts ==&amp;gt; 127.0.0.1 &amp;nbsp;&amp;lt;machinename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. install vnc &amp;nbsp;=&amp;gt; vnc4server (option)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; System &amp;gt; Preferences &amp;gt; Remote Desktop: click [Sharing] and [Security].required password only&lt;br /&gt;
&lt;br /&gt;
7. install samba server&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo apt-get install samba&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo gedit /etc/samba/smb.conf&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[sharename]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;path=/home/username&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;browseable=yes&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writable=yes&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo user &amp;lt;loginname&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sudo smbpasswd -a &amp;lt;loginname&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo restart smbd&lt;br /&gt;
&lt;br /&gt;
8. add extra partition&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo gedit /etc/fstab &amp;nbsp;=&amp;gt; /dev/sda4 &amp;nbsp;/home/&amp;lt;username&amp;gt;/projects &amp;nbsp; ext3 &amp;nbsp; defaults 0 0&lt;br /&gt;
&lt;br /&gt;
9 Mount windows share folder in ubuntu&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * install packages: smbfs, winbind&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo mkdir /mnt/mozart-share&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo gedit /etc/nsswitch.conf&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;wins&lt;/span&gt; dns mdns4&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * restart&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo gedit /root/.smbcredentials&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; username=&amp;lt;windows-side loginname&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; password=&amp;lt;windows-side password&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo chmod 700 /root/.smbcredentials&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo gedit /etc/fstab&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //netbiosname/sharename &amp;nbsp;/mnt/mozart-share &amp;nbsp;cifs &amp;nbsp;credentials=/root/.smbcredentials, iocharset=utf8, file_mode=0777, dir_mode=0777 0 0&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * sudo mount -a&lt;br /&gt;
&lt;br /&gt;
10. install other packages&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * gnome-schedule, &amp;nbsp; gparted</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/5708940337460959229/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/installation-of-build-machine-for.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5708940337460959229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/5708940337460959229'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/installation-of-build-machine-for.html' title='Installation of build machine for android system'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-2675941112425332243</id><published>2011-04-14T10:45:00.000+08:00</published><updated>2011-04-15T15:40:29.604+08:00</updated><title type='text'>Integration Redmine with VisualSVN server for Windows - Part2</title><content type='html'>This article&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;shows you how to integrate from SVN side to Redmine side so that developers commit their source code into SVN, and the mean time, SVN will check the log comments whether fulfill Redmine&#39;s log rule to make the log message into Redmine system.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;It will check&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;* comments format fulfill Redmine&#39;s rule ?&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;* comments is too short ?&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;* issue number is exist ?&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;* owner of issue is equal to checkin user ?&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;* issue number is open state ?&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;* issue number is belong to project associated with committed repository ?&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Preconditions: required&amp;nbsp;knowledge&lt;br /&gt;
1. subversion hook and subversion commands&lt;br /&gt;
2. script language programming: ruby, dos shell&lt;br /&gt;
3. regular expression&lt;br /&gt;
4. SQL programming&lt;br /&gt;
&lt;br /&gt;
To complete above requirements, It is enough that we focus on hook : pre-commit&lt;br /&gt;
&lt;br /&gt;
Algorithm&lt;br /&gt;
1. pre-commit.cmd: to launch pre-commit.rb&lt;br /&gt;
2. pre-commit.rb:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - get the svn log comment&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - check log format and size of log&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - retrieve issue#&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - check issue&#39;s&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;owner is equal to checkin user&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&amp;nbsp; &amp;nbsp; - check&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;issue# is open state&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15px; line-height: 21px;&quot;&gt;&amp;nbsp; &amp;nbsp; - check&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;issue number is belong to project associated with committed repository&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 15px; line-height: 21px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15px; line-height: 21px;&quot;&gt;above checks are implemented by sql statement&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #222222; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 15px; line-height: 21px;&quot;&gt;Also it can be applied to that SVN server and Redmine are installed on different machine.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/2675941112425332243/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn_13.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2675941112425332243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2675941112425332243'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn_13.html' title='Integration Redmine with VisualSVN server for Windows - Part2'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-2009481350376721615</id><published>2011-04-14T10:13:00.000+08:00</published><updated>2011-04-14T10:13:27.607+08:00</updated><title type='text'>How to make Nook Color or biblio Leaf to read Chinese epub file</title><content type='html'>Nook Color and biblio Leaf are two different ebook reader devices. one is TFT display and the other is EPD display. However, they are built on Android system and use Adobe Reader Mobile System Library as reader engine, so we can modify the css file in epub to make reader software force to use system font as rendering font, and then it will be successful to open epub and display Chinese.&lt;br /&gt;
&lt;br /&gt;
So, How to modify the css file ? I just made an example for you, you need to know the knowledge about CSS, you will know what I do.&lt;br /&gt;
&lt;br /&gt;
1. Take 蝸居.epub file as example&lt;br /&gt;
2. extract stylesheet.css&lt;br /&gt;
3. add following codes into css file&lt;br /&gt;
@font-face {&lt;br /&gt;
&amp;nbsp; font-family:&quot;ek1epub&quot;;&lt;br /&gt;
&amp;nbsp; src:url(res:///system/fonts/DroidSansFallback.ttf);&lt;br /&gt;
}&lt;br /&gt;
4. search &quot;font-family:&quot; on the rest of css file, replace old name with &quot;ek1epub&quot;&lt;br /&gt;
5. add the modified stylesheet.css into epub file&lt;br /&gt;
6. copy the modified epub into device&lt;br /&gt;
7. for NookColor, open the file, you will find it still can not display correct Chinese, and then you should click the font setting and click the &quot;OK&quot;(I forgot the setting name). You will find the Chinese displaying correctly.&lt;br /&gt;
8. for biblio Leaf, if it can not display correct Chinese, you should reboot the device to try again.</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/2009481350376721615/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/how-to-make-nook-color-or-biblio-leaf.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2009481350376721615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/2009481350376721615'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/how-to-make-nook-color-or-biblio-leaf.html' title='How to make Nook Color or biblio Leaf to read Chinese epub file'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-7188622796208500436</id><published>2011-04-14T09:52:00.000+08:00</published><updated>2011-04-15T15:31:49.206+08:00</updated><title type='text'>Integration Redmine with VisualSVN server for Windows - Part 1</title><content type='html'>&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;
0. Windows: Windows Server 2008&lt;br /&gt;
1. Redmine: bitnami-redmine-1.1.2.1-windows-installer.exe&lt;br /&gt;
2. VisualSVN server: VisualSVN-Server-2.1.7.msi&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Installation:&lt;/b&gt;&lt;br /&gt;
1. install new Windows Server 2008, don&#39;t enable IIS.&lt;br /&gt;
2.&amp;nbsp;install VisualSVN server: repository on d drive, add install-path into environment PATH&lt;br /&gt;
3.&amp;nbsp;install Redmine on d drive (next-by-next)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Configuration of VisualSVN server:&lt;/b&gt;&lt;br /&gt;
1. enable https on 8443 port&lt;br /&gt;
2. use subversion authentication (also windows authentication is OK)&lt;br /&gt;
3. create redmine account for Redmine integration (I suggest to use ReadOnly rights)&lt;br /&gt;
4. create Test_Repo repository and add redmine account on it&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Configuration of Redmine:&lt;/b&gt;&lt;br /&gt;
1. login by admin&lt;br /&gt;
2. Administration &amp;gt; Settings &amp;gt; Authentication : Enable REST web service for future function (refresh_repository)&lt;br /&gt;
3.&amp;nbsp;Administration &amp;gt; Settings &amp;gt; Repositories: Enable WS for repository management and Generate a key for future function (refresh_repository)&lt;br /&gt;
4. create a project (Test_Project)&lt;br /&gt;
5. Test_Project &amp;gt; Settings &amp;gt; Repository:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; choose Subversion and then fill URL (https://&amp;lt;MachineName&amp;gt;:8443/svn/Test_Repo/)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; login: redmine &amp;nbsp; &amp;nbsp;Password: &amp;lt;password&amp;gt; of redmine on SVN server&lt;br /&gt;
6. click&amp;nbsp;Test_Project &amp;gt; Repository, you will find it is not OK, you have to do following modifications&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * find file: subversion_adapter.rb&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * find keyword: --non-interactive, and add --trust-server-cert&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * restart Redmine services, and then redo Step6 again&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * If it still can not work, execute cmd.exe and execute &quot;svn export https://&amp;lt;MachineName&amp;gt;:8443/svn/Test_Repo/trunk&quot;, and then input redmine account and correct password and choose &quot;permarent&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; *&amp;nbsp;then redo Step6 again, I think it is OK now.&lt;br /&gt;
&lt;br /&gt;
This part 1 is how to integrate from Redmine side to SVN side so that you can click project&#39;s repository to display source control information on Redmine.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;This setting can also be applied to that&amp;nbsp;SVN server and Redmine are installed on&amp;nbsp;different machines.&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
The next part 2 will show you how to integrate from SVN side to Redmine side so that developers commit their source code into SVN, and the mean time, SVN will check the log comments whether fulfill Redmine&#39;s log rule to make the log message into Redmine system.&lt;br /&gt;
It will check&lt;br /&gt;
* comments format fulfill Redmine&#39;s rule ?&lt;br /&gt;
* comments is too short ?&lt;br /&gt;
* issue number is exist ?&lt;br /&gt;
* owner of issue is equal to checkin user ?&lt;br /&gt;
* issue number is open state ?&lt;br /&gt;
* issue number is belong to project associated with committed repository ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/7188622796208500436/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7188622796208500436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7188622796208500436'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/integration-redmine-with-visualsvn.html' title='Integration Redmine with VisualSVN server for Windows - Part 1'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-7301086339831208667</id><published>2011-04-14T09:08:00.000+08:00</published><updated>2011-04-14T09:08:40.285+08:00</updated><title type='text'>ScmBug integration between VisualSVN Server and Mantis on Windows platform</title><content type='html'>Preparation&lt;br /&gt;
1. mantis v1.2.5 &amp;nbsp;==&amp;gt; &lt;a href=&quot;http://www.mantisbt.org/&quot;&gt;http://www.mantisbt.org/&lt;/a&gt;&lt;br /&gt;
2. VisualSVN Server v2.1.7 ==&amp;gt; &lt;a href=&quot;http://www.visualsvn.com/server&quot;&gt;http://www.visualsvn.com/server&lt;/a&gt;&lt;br /&gt;
3. scmbug v0.26.22 ==&amp;gt; &lt;a href=&quot;http://www.mkgnu.net/scmbug&quot;&gt;http://www.mkgnu.net/scmbug&lt;/a&gt;&lt;br /&gt;
4. xampp-win32 v1.7.4 ==&amp;gt; &lt;a href=&quot;http://www.apachefriends.org/zh_tw/xampp-windows.html&quot;&gt;http://www.apachefriends.org/zh_tw/xampp-windows.html&lt;/a&gt;&lt;br /&gt;
5. ActivePerl v5.12.3.1204 &amp;nbsp;==&amp;gt; &lt;a href=&quot;http://www.activestate.com/activeperl/downloads&quot;&gt;http://www.activestate.com/activeperl/downloads&lt;/a&gt;&lt;br /&gt;
6. Perl modules required for scmbug: Log-Log4perl, Mail-Sendmail-0.79&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log-Log4perl ==&amp;gt; &lt;a href=&quot;http://search.cpan.org/~mschilli/Log-Log4perl-1.32/lib/Log/Log4perl.pm&quot;&gt;http://search.cpan.org/~mschilli/Log-Log4perl-1.32/lib/Log/Log4perl.pm&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Mail-Sendmail-0.79 ==&amp;gt; &lt;a href=&quot;http://search.cpan.org/~mivkovic/Mail-Sendmail-0.79/Sendmail.pm&quot;&gt;http://search.cpan.org/~mivkovic/Mail-Sendmail-0.79/Sendmail.pm&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBD-mysql ==&amp;gt;&amp;nbsp;&lt;a href=&quot;http://search.cpan.org/~capttofu/DBD-mysql-4.018/lib/DBD/mysql.pm&quot;&gt;http://search.cpan.org/~capttofu/DBD-mysql-4.018/lib/DBD/mysql.pm&lt;/a&gt;&lt;br /&gt;
7. diff.exe ==&amp;gt; &lt;a href=&quot;http://code.google.com/p/sharpdiff&quot;&gt;http://code.google.com/p/sharpdiff&lt;/a&gt;&lt;br /&gt;
8. nssm ==&amp;gt;&amp;nbsp;&lt;a href=&quot;http://iain.cx/src/nssm/&quot;&gt;http://iain.cx/src/nssm/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Installation&lt;br /&gt;
1. VisualSVN Server installation&lt;br /&gt;
&amp;nbsp; * port number must not 443, recommend to 8443&lt;br /&gt;
&amp;nbsp; * binary execution code is installed on &quot;c:\Program Files\VisualSVN Server&quot;, but&lt;br /&gt;
&amp;nbsp; * repository folder is installed on d:\Repositories&lt;br /&gt;
&amp;nbsp; * Use subversion authentication&lt;br /&gt;
&lt;br /&gt;
2. xampp-win32 installation&lt;br /&gt;
&amp;nbsp; * d:\xampp&lt;br /&gt;
&amp;nbsp; * no service installed (by default)&lt;br /&gt;
&amp;nbsp; * from XAMPP Control Panel to enable services: Apache and MySql&lt;br /&gt;
&amp;nbsp; * Configuration:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - first-time: click button Apache Admin... to check status&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * MySQL/PHP/HTTPS/CGI/SSI should be &lt;b&gt;Activated&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - security setting: http://localhost/security/index.php&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * MySql DB administrator: userid=root &amp;nbsp; password=root123&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * XAMPP directory protection(.htaccess): userid=xamppadmin &amp;nbsp; &amp;nbsp;password=xamppadmin123&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - phpAdmin&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * userid and password is the same as&amp;nbsp;MySql DB administrator&lt;br /&gt;
&lt;br /&gt;
3. Mantis installation&lt;br /&gt;
&amp;nbsp; * unzip Mantis into d:\xampp\htdocs\&lt;br /&gt;
&amp;nbsp; * modify c:\xampp\htdocs\index.php, replace &quot;xampp&quot; with &quot;mantisbt-1.2.5&quot;&lt;br /&gt;
&amp;nbsp; * First-time configuration: http://localhost/mantisbt-1.2.5/admin/install.php&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - DB Admin userid=root &amp;nbsp;password=&amp;lt;yourPassword&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - Web Admin &amp;nbsp;userid=root &amp;nbsp;password=&amp;lt;yourPassword&amp;gt;&lt;br /&gt;
&amp;nbsp; * default administrator password = root&lt;br /&gt;
&amp;nbsp; * userid=administrator &amp;nbsp; password=&amp;lt;yourPassword&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. ActivePerl installation&lt;br /&gt;
&amp;nbsp; * c:\perl&lt;br /&gt;
&amp;nbsp; * modules needed by scmbug:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - DBI &amp;nbsp; &amp;nbsp;(default installed)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - XML-Simple &amp;nbsp;(default installed)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;- Log-Log4perl &amp;nbsp;(&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set HTTP_proxy=http://userid:passwd@proxy3.tw.foxconn.com:3128/&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;    ppm install &quot;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;&lt;a class=&quot;podlinkurl&quot; href=&quot;http://log4perl.sourceforge.net/ppm/Log-Log4perl.ppd&quot; style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #006699;&quot;&gt;http://log4perl.sourceforge.net/ppm/Log-Log4perl.ppd&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;&quot;&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - DBD-mysql &amp;nbsp;(extract DBD-mysql-4.018.tar\DBD-mysql-4.018\lib into c:\perl\site\lib)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; - Mail-Sendmail&amp;nbsp;&amp;nbsp;(extract Mail-Sendmail-0.79-ppm.tar\blib\lib into c:\perl\site\lib)&lt;br /&gt;
&lt;br /&gt;
5. Scmbug Installation&lt;br /&gt;
&amp;nbsp; * unzip Scmbug into &quot;c:\program files&quot;&lt;br /&gt;
&amp;nbsp; * modify daemon.conf based on Mantis and Subversion settings&lt;br /&gt;
&amp;nbsp;&amp;nbsp;* cd c:\Program Files\Scmbug\etc\init.d&lt;br /&gt;
&amp;nbsp; * nssm install ScmbugService &quot;c:\Program Files\Scmbug\etc\init.d\scmbug_daemon.bat&quot;&lt;br /&gt;
&amp;nbsp; * Scmbug\bin\scmbug_install_glue.pl --scm=Subversion --product=&amp;lt;Manris Project Name&amp;gt; --repository=file:///d:\Repositories\&amp;lt;SVN ProjectName&amp;gt; --daemon=127.0.0.1 --binary-paths=&quot;c:\Program Files\VisualSVN Server\bin&quot;&lt;br /&gt;
&lt;br /&gt;
6. stop ScmbugService&lt;br /&gt;
&amp;nbsp; * net stop ScmbugService&lt;br /&gt;
&amp;nbsp; * nssm remove ScmbugService confirm</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/7301086339831208667/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/scmbug-integration-between-visualsvn.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7301086339831208667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/7301086339831208667'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/04/scmbug-integration-between-visualsvn.html' title='ScmBug integration between VisualSVN Server and Mantis on Windows platform'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-3031922098616126261</id><published>2011-02-21T14:53:00.001+08:00</published><updated>2011-02-21T14:53:50.501+08:00</updated><title type='text'>Android 開發螢幕解析度種類</title><content type='html'>&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QVGA = 320 * 240;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQVGA = 320 * 480;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQVGA2 = 400 * 240;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQVGA3 = 432 * 240;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HVGA = 480 * 320;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;VGA = 640 * 480;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WVGA = 800 * 480;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WVGA2 = 768 * 480;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;FWVGA = 854 * 480;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;DVGA = 960 * 640;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;PAL = 576 * 520;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;NTSC = 486 * 440;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;SVGA = 800 * 600;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WSVGA = 1024 * 576;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;XGA = 1024 * 768;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;XGAPLUS = 1152 * 864;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HD720 = 1280 * 720;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WXGA = 1280 * 768;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WXGA2 = 1280 * 800;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WXGA3 = 1280 * 854;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;SXGA = 1280 * 1024;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WXGA4 = 1366 * 768;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;SXGAMINUS = 1280 * 960;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;SXGAPLUS = 1400 * 1050;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WXGAPLUS = 1440 * 900;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HD900 = 1600 * 900;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WSXGA = 1600 * 1024;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WSXGAPLUS = 1680 * 1050;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;UXGA = 1600 * 1200;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HD1080 = 1920 * 1080;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QWXGA = 2048 * 1152;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WUXGA = 1920 * 1200;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;TXGA = 1920 * 1400;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QXGA = 2048 * 1536;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQHD = 2560 * 1440;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQXGA = 2560 * 1600;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QSXGA = 2560 * 2048;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QSXGAPLUS = 2800 * 2100;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQSXGA = 3200 * 2048;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QUXGA = 3200 * 2400;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;QFHD = 3840 * 2160;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WQUXGA = 3840 * 2400;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HD4K = 4096 * 2304;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HXGA = 4096 * 3072;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WHXGA = 5120 * 3200;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HSXGA = 5120 * 4096;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WHSXGA = 6400 * 4096;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;HUXGA = 6400 * 4800;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;SHV = 7680 * 4320;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;&lt;br style=&quot;line-height: normal; word-wrap: break-word;&quot; /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: #444444; font-family: &#39;Microsoft YaHei&#39;, &#39;Segoe UI&#39;, Tahoma, Arial; font-size: 14px; line-height: 22px;&quot;&gt;WHUXGA = 7680 * 4800;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/3031922098616126261/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/02/android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/3031922098616126261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/3031922098616126261'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/02/android.html' title='Android 開發螢幕解析度種類'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-843963919365258203</id><published>2011-01-26T15:08:00.000+08:00</published><updated>2011-01-26T15:08:25.694+08:00</updated><title type='text'>java inner class type</title><content type='html'>inner class type&lt;br /&gt;
1. anonymous class:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* no class name, can be instantiated only once&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (cancelTask != null) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new&lt;b&gt; Thread&lt;/b&gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void run() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelTask.start();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Log.e(TAG, e.toString());&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &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; &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;}.start();&lt;br /&gt;
&lt;br /&gt;
2. local class:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* don&#39;t allow to be declared public, protected, private, static&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* valid area : within the code block&lt;br /&gt;
&amp;nbsp;&amp;nbsp;//some code block&lt;br /&gt;
....... {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;class localclass {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;localclass obj1 = new localclass();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;localclass obj2 = new localclass();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
3. member class&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; * define within the body of class&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; * can be declared static ==&amp;gt; became as nested top-level class&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; * valid area: within the body of outer class ==&amp;gt; static modifier break the rule&lt;br /&gt;
&lt;br /&gt;
4. nested top-level class&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* used as a convenient way to group related classes without creating a new package&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/843963919365258203/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2011/01/java-inner-class-type.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/843963919365258203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/843963919365258203'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2011/01/java-inner-class-type.html' title='java inner class type'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-1676758884131214258</id><published>2010-12-22T14:27:00.000+08:00</published><updated>2010-12-22T14:27:59.565+08:00</updated><title type='text'>如何將簡體中文epub 轉換 成正體中文epub</title><content type='html'>1. 去下載 convertz802 免費工具&lt;br /&gt;
2. 用解壓工具 解開簡體中文epub，比如 abc.epub 解開 放在 c:\temp\abc&lt;br /&gt;
3. 再建立另外一目錄，例如 c:\temp\正體abc&lt;br /&gt;
4. 執行 ConvertZ.exe，按照下列圖片步驟做&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp; 圖一: &lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0QSZWOPYswYuS3Fxm-K3p1DV-ImFa074m4iXIMod3GPmTfxFrWRBLuNC9KGbdDGEhMjCpRhydj9EAamdFbaPr_4bRIRoAQowzYeUey7NrSTpBBTtrob2njplWmb7r8cAkB4aCi3uGYg/s1600/ConvertZ-pic01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0QSZWOPYswYuS3Fxm-K3p1DV-ImFa074m4iXIMod3GPmTfxFrWRBLuNC9KGbdDGEhMjCpRhydj9EAamdFbaPr_4bRIRoAQowzYeUey7NrSTpBBTtrob2njplWmb7r8cAkB4aCi3uGYg/s1600/ConvertZ-pic01.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;選擇按鍵 &quot;檔案&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 圖二:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokfBavG18yPayyA3c_MKrkJxLKMyWrj00X5QrRUCkqem7UVaVIpjIo5Nh15_Lu3uLu5POTfcWh1ez77B3JhMKJpQGjatok_n9YiEMOBaQj8oOp_7YyhyphenhyphenU9Jog0byqhX2ZBKUlMj9NnfA/s1600/ConvertZ-pic02.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokfBavG18yPayyA3c_MKrkJxLKMyWrj00X5QrRUCkqem7UVaVIpjIo5Nh15_Lu3uLu5POTfcWh1ez77B3JhMKJpQGjatok_n9YiEMOBaQj8oOp_7YyhyphenhyphenU9Jog0byqhX2ZBKUlMj9NnfA/s1600/ConvertZ-pic02.jpg&quot; /&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;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=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrSSvYu4pyHMYAGUHcVKuFvx9qoBIW_lSfb9qyaVqe_JoAs-1-Q58weDou5um7A3TLylrO8E9gsgp_3OfYkKqPans1ID9_4VelSpMEIUVOyBSrU6vya0ol3gA02sh4UqsZvAyDU8KcLac/s1600/ConvertZ-pic03.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrSSvYu4pyHMYAGUHcVKuFvx9qoBIW_lSfb9qyaVqe_JoAs-1-Q58weDou5um7A3TLylrO8E9gsgp_3OfYkKqPans1ID9_4VelSpMEIUVOyBSrU6vya0ol3gA02sh4UqsZvAyDU8KcLac/s1600/ConvertZ-pic03.jpg&quot; /&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;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=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK6kYrZ43bCqK26KiW55sXPeXhyphenhyphenPti5-Bi_9haxIQBptrdaBhM87PlwwjKgEsxqjy3WUF5OELYqoBaBm4uCEIK5Mk7-dIfOLe3SJDhjlFxsH9cOkaXIvCwlz7ySrLSvBSjG4kFeFln0Nc/s1600/ConvertZ-pic04.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK6kYrZ43bCqK26KiW55sXPeXhyphenhyphenPti5-Bi_9haxIQBptrdaBhM87PlwwjKgEsxqjy3WUF5OELYqoBaBm4uCEIK5Mk7-dIfOLe3SJDhjlFxsH9cOkaXIvCwlz7ySrLSvBSjG4kFeFln0Nc/s1600/ConvertZ-pic04.jpg&quot; /&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. 選取 c:\temp\正體abc 內的所有檔案，用壓縮工具壓成 zip 檔案&lt;br /&gt;
6. 將 zip 檔案 改名成 epub ，大功告成。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/1676758884131214258/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2010/12/epub-epub.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/1676758884131214258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/1676758884131214258'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2010/12/epub-epub.html' title='如何將簡體中文epub 轉換 成正體中文epub'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0QSZWOPYswYuS3Fxm-K3p1DV-ImFa074m4iXIMod3GPmTfxFrWRBLuNC9KGbdDGEhMjCpRhydj9EAamdFbaPr_4bRIRoAQowzYeUey7NrSTpBBTtrob2njplWmb7r8cAkB4aCi3uGYg/s72-c/ConvertZ-pic01.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-97660753242955328</id><published>2010-09-07T14:39:00.000+08:00</published><updated>2010-09-07T14:39:54.747+08:00</updated><title type='text'>android sqlite3</title><content type='html'>1. adb shell&lt;br /&gt;
2. # sqlite3 &amp;lt;path&amp;gt;/xxx.db&lt;br /&gt;
3. sqlite&amp;gt;&lt;br /&gt;
.help - usage&lt;br /&gt;
.schema - query all schemas in db&lt;br /&gt;
select * from tablename;&lt;br /&gt;
select * from sqlite_master where type=&quot;table&quot;;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/97660753242955328/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2010/09/android-sqlite3.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/97660753242955328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/97660753242955328'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2010/09/android-sqlite3.html' title='android sqlite3'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1332287896270034097.post-8049132151144801459</id><published>2010-09-07T09:26:00.000+08:00</published><updated>2010-09-07T09:26:50.234+08:00</updated><title type='text'>Android Service</title><content type='html'>參考: &lt;a href=&quot;http://marshal.easymorse.com/archives/1564&quot;&gt;http://marshal.easymorse.com/archives/1564&lt;/a&gt;&lt;br /&gt;
Android Service有兩種類型：&lt;br /&gt;
1.本機服務（Local Service）：用於應用程式&lt;b&gt;內部&lt;/b&gt;&lt;br /&gt;
2.遠端服務（Remote Sercie）：用於應用程式&lt;b&gt;之間&lt;/b&gt;&lt;br /&gt;
前者用於實現應用程式自己的一些耗時任務，比如查詢升級資訊，並不佔用應用程式比如Activity所屬執行緒，而是單開執行緒後臺執行，這樣用戶體驗比較好。&lt;br /&gt;
後者可被其他應用程式複用，比如天氣預報服務，其他應用程式不需要再寫這樣的服務，調用已有的即可。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;編寫不需和Activity交互的本機服務範例&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;本機服務編寫比較簡單。首先，要創建一個Service類，該類繼承android的Service類。這裡寫了一個計數服務的類，每秒鐘為計數器加一。在服務類的內部，還創建了一個執行緒，用於實現後臺執行上述業務邏輯。&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import android.app.Service;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.os.IBinder;&lt;br /&gt;import android.util.Log;&lt;br /&gt;&lt;br /&gt;public class CountService extends Service {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean threadDisable;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int count;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;@Override&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IBinder onBind(Intent intent) {&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onCreate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onCreate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(new Runnable() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!threadDisable) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InterruptedException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;Count is &quot; + count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;&amp;nbsp;&amp;nbsp; }).start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onDestroy() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onDestroy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.threadDisable = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;on destroy&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getCount() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;需要將該服務註冊到設定檔AndroidManifest.xml中，否則無法找到：&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; package=&quot;com.easymorse&quot; android:versionCode=&quot;1&quot; android:versionName=&quot;1.0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;application android:icon=&quot;@drawable/icon&quot; android:label=&quot;@string/app_name&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;activity android:name=&quot;.LocalServiceDemoActivity&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; android:label=&quot;@string/app_name&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action android:name=&quot;android.intent.action.MAIN&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/activity&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;&amp;lt;service android:name=&quot;CountService&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/application&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;uses-sdk android:minSdkVersion=&quot;3&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt; &lt;br /&gt;&lt;br /&gt;在Activity中啟動和關閉本機服務。&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;&lt;br /&gt;public class LocalServiceDemoActivity extends Activity {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /** Called when the activity is first created. */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt; this.startService&lt;/span&gt;(new Intent(this, CountService.class));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void onDestroy() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onDestroy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt; this.stopService&lt;/span&gt;(new Intent(this, CountService.class));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;可通過logcat日誌查看到後臺執行緒列印的計數內容。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;編寫本機服務和Activity交互的範例&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;上面的示例是通過startService和stopService啟動關閉服務的。適用於服務和activity之間沒有調用交互的情況。如果之間需要傳遞參數或者方法調用。需要使用bind和unbind方法。&lt;br /&gt;具體做法是，服務類需要增加介面，比如ICountService，另外，服務類需要有一個內部類，這樣可以方便訪問外部類的封裝資料，這個內部類 需要繼承Binder類並實現ICountService介面。還有，就是要實現Service的onBind方法，不能只傳回一個null了。&lt;br /&gt;這是新建立的介面代碼：&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;public interface ICountService {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract int getCount();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;修改後的CountService代碼：&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import android.app.Service;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.os.Binder;&lt;br /&gt;import android.os.IBinder;&lt;br /&gt;import android.util.Log;&lt;br /&gt;&lt;br /&gt;public class CountService extends Service&lt;span style=&quot;color: red;&quot;&gt; implements ICountService&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean threadDisable;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int count;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ServiceBinder &lt;span style=&quot;color: red;&quot;&gt;serviceBinder=new ServiceBinder()&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span style=&quot;color: red;&quot;&gt;ServiceBinder extends Binder implements ICountService&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getCount() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return count;&lt;br /&gt;&amp;nbsp;&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;@Override&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IBinder onBind(Intent intent) {&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return serviceBinder;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onCreate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onCreate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(new Runnable() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!threadDisable) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InterruptedException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;Count is &quot; + count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;&amp;nbsp;&amp;nbsp; }).start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onDestroy() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onDestroy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.threadDisable = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;on destroy&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* (non-Javadoc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @see com.easymorse.ICountService#getCount()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getCount() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;服務的註冊也要做改動，AndroidManifest.xml文件：&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; package=&quot;com.easymorse&quot; android:versionCode=&quot;1&quot; android:versionName=&quot;1.0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;application android:icon=&quot;@drawable/icon&quot; android:label=&quot;@string/app_name&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;activity android:name=&quot;.LocalServiceDemoActivity&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; android:label=&quot;@string/app_name&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action android:name=&quot;android.intent.action.MAIN&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/activity&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;&amp;lt;service android:name=&quot;CountService&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;intent-filter&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action android:name=&quot;com.easymorse.CountService&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/intent-filter&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/application&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;uses-sdk android:minSdkVersion=&quot;3&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;Acitity代碼不再通過startSerivce和stopService啟動關閉服務，另外，需要通過ServiceConnection的內部類實現來連接Service和Activity。&lt;/span&gt;&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.ComponentName;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.content.ServiceConnection;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.os.IBinder;&lt;br /&gt;import android.util.Log;&lt;br /&gt;&lt;br /&gt;public class LocalServiceDemoActivity extends Activity {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ServiceConnection serviceConnection = new ServiceConnection() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onServiceConnected(ComponentName name, IBinder service) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; countService = (ICountService) service;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;on serivce connected, count is &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + countService.getCount());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onServiceDisconnected(ComponentName name) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; countService = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ICountService countService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /** Called when the activity is first created. */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setContentView(R.layout.main);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt; this.bindService(new Intent(&quot;com.easymorse.CountService&quot;),&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.serviceConnection, BIND_AUTO_CREATE);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void onDestroy() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onDestroy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;this.unbindService(serviceConnection);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;編寫傳遞基本型資料的遠端服務&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;上面的示例，可以擴展為，讓其他應用程式複用該服務。這樣的服務叫遠端（remote）服務，實際上是進程間通信（RPC）。&lt;br /&gt;這時需要&lt;span style=&quot;color: red;&quot;&gt;使用android介面描述語言（AIDL）來定義遠端服務的介面&lt;/span&gt;，而不是上述那樣簡單的java介面。副檔名為aidl而不是java。 &lt;span style=&quot;color: red;&quot;&gt;可用上面的ICountService改動而成ICountSerivde.aidl&lt;/span&gt;，eclipse會自動生成相關的java檔。&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;interface ICountService {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int getCount();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;編寫服務（Service）類，稍有差別，主要在binder是通過遠端獲得的，需要通過樁（Stub）來獲取。樁物件是遠端物件的本地代理。&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import android.app.Service;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.os.IBinder;&lt;br /&gt;import android.os.RemoteException;&lt;br /&gt;import android.util.Log;&lt;br /&gt;&lt;br /&gt;public class CountService extends Service {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean threadDisable;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int count;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private&lt;span style=&quot;color: red;&quot;&gt; ICountService.Stub serviceBinder = new ICountService.Stub()&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getCount() throws RemoteException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return count;&lt;br /&gt;&amp;nbsp;&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;public IBinder onBind(Intent intent) {&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return serviceBinder;&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onCreate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onCreate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(new Runnable() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!threadDisable) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InterruptedException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;Count is &quot; + count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;&amp;nbsp;&amp;nbsp; }).start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onDestroy() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onDestroy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.threadDisable = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;on destroy&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;設定檔AndroidManifest.xml和上面的類似，沒有區別。&lt;br /&gt;在Activity中使用服務的差別不大，只需要對ServiceConnection中的調用遠端服務的方法時，要捕獲異常。&lt;br /&gt;private ServiceConnection serviceConnection = new ServiceConnection() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onServiceConnected(ComponentName name, IBinder service) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; countService = (ICountService) service;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(&quot;CountService&quot;, &quot;on serivce connected, count is &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + countService.getCount());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (RemoteException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new RuntimeException(e);&lt;br /&gt;&amp;nbsp;&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onServiceDisconnected(ComponentName name) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; countService = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;這樣就可以在同一個應用程式中使用遠端服務的方式和自己定義的服務交互了。&lt;br /&gt;如果是另外的應用程式使用遠端服務，需要做的是複製上面的aidl檔和相應的包構到應用程式中，其他調用等都一樣。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;編寫傳遞複雜資料類型的遠端服務&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;遠端服務往往不只是傳遞java基底資料型別。這時需要注意android的一些限制和規定：&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp; android支持String和CharSequence&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果需要在aidl中使用其他aidl介面類別型，需要import，即使是在相同包結構下；&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp; android允許傳遞實現Parcelable介面的類，需要import；&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp; android支援集合介面類別型List和Map，但是有一些限制，元素必須是基本型或者上述三種情況，不需要import集合介面類別，但是需要對元素涉及到的類型import；&lt;br /&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp; 非基底資料型別，也不是String和CharSequence類型的，需要有方向指示，包括in、out和inout，in表示由用戶端設置，out表示由服務端設置，inout是兩者均可設置。&lt;br /&gt;這裡將前面的例子中返回的int資料改為複雜資料類型：&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import android.os.Parcel;&lt;br /&gt;import android.os.Parcelable;&lt;br /&gt;&lt;br /&gt;public class CountBean implements Parcelable {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static final Parcelable.Creator&amp;lt;CountBean&amp;gt; CREATOR = new Creator&amp;lt;CountBean&amp;gt;() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CountBean createFromParcel(Parcel source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CountBean bean = new CountBean();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bean.count = source.readInt();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CountBean[] newArray(int size) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new CountBean[size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int count;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void writeToParcel(Parcel dest, int flags) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dest.writeInt(this.count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int describeContents() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;然後，需要在相同包下建一個同名的aidl檔，用於android生成相應的輔助文件：&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;parcelable CountBean;&lt;br /&gt;&lt;br /&gt;這一步是android 1.5後的變化，無法通過adt生成aidl，也不能用一個比如全域的project.aidl文件，具體見：&lt;br /&gt;http://www.anddev.org/viewtopic.php?p=20991&lt;br /&gt;然後，需要在服務的aidl檔中修改如下：&lt;br /&gt;package com.easymorse;&lt;br /&gt;&lt;br /&gt;import com.easymorse.CountBean;&lt;br /&gt;&lt;br /&gt;interface ICountService {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CountBean getCount();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;其他的改動很小，只需將CountService和調用CountService的部分修改為使用CountBean即可。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://joshzhchen.blogspot.com/feeds/8049132151144801459/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://joshzhchen.blogspot.com/2010/09/android-service.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/8049132151144801459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1332287896270034097/posts/default/8049132151144801459'/><link rel='alternate' type='text/html' href='http://joshzhchen.blogspot.com/2010/09/android-service.html' title='Android Service'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/16030787947826781518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>