2007年12月19日 星期三

Android官方部落格翻譯:Android開發之路(On the Road with Android)

  上週結束了比利時拜訪之旅,本週我又馬上跑去倫敦的谷歌辦公室。很榮幸的有機會可以向倫敦的行動裝置開發者介紹Android,並且共同集思廣益,來討論Android應用程序上的意見和需要改進的地方。

  討論的當下,我見識到這群開發者積極的想踏出第一步,並且願意花費時間進行開發工作。首先有人著手開發Android益智選擇題遊戲,從選單當中,選擇正確的答案。小遊戲放在伺服器上面,可以供大家下載。這是他們第一次嘗試的專案。

  這個禮拜還沒結束,不過卻又激發出更多的創意想法。

  在倫敦辦事處:這一切是如此美好。還能享用下午茶的蛋糕。

  隨著假期逼近,別忘了最新版本的SDK即將問世,在享受假期的同時,千萬別忘記樂在Android開發,抓住Android起飛的時候。

  祝大家假期愉快。

發文者 
原文出處 On the Road with Android

2007年12月14日 星期五

Android官方部落格翻譯:殘酷人生;SDK急速上手篇(Life can be tough; here are a few SDK improvements to make it a little easier)

  距離我們釋放出Android SDK第一版,已經過了一個月了,我們盡力讓開發工具變的更盡善盡美,讓大家都能夠喜歡,希望這個過程不會太久,當然我們還有一些問題需要解決。同時,我們很高興的為你介紹m3-rc37a(最新版本!)。

  我們的伺服器會將最新的資訊,傳送給你知道。如果你想要馬上體驗新版本,在下載之前,這裡有一些建議事項:


  • 新的預設模擬器是HVGA,你可以使用新模擬器來參加Android開發挑戰賽。
  • 我們在模擬器當中,加入了SMS簡訊的調試功能,你可以更方便用來做簡訊測試。
  • 修正在Window作業系統下,音效模擬錯誤的問題。
  • 新的模擬器可以用來控制連線事件,例如網路狀態和來電狀態。
  • Eclipse插件修復,現在打開XML檔案,可以按造語法顯示顏色了,例如AndroidManifest.xml檔。
  • Eclipse插件錯誤修正,例如系統重起的時候,R.java檔不會再是唯讀狀態。
你可以在版本更新報告(Release Notes page)上,或是下載SDK之後的讀我檔案(upgrading your SDK installation),看到更多更心資訊。

  我們希望這些不起眼的改變,能讓你的生活變的更美好,至少可以縮短你寫程式的時間。

發文者 
原文出處 Life can be tough; here are a few SDK improvements to make it a little easier


2007年12月5日 星期三

Android官方部落格翻譯:谷歌開發者的撥客頻道:安卓(Google Developer Podcast: Android)

Dianne Hackborn和Jason Parks這兩位是在Android開發團隊中的工程師,今天將在本撥客頻道(in this podcast),用技術角度來和我們談談Android平台。

  Dianne和Jason分享在Be和PalmSource的背景狀況,並且暢談他們在Android上,已經被使用的經驗談:
  • 開發中的一些小故事
  • Android的頂層。Linux程序如何處理和管理虛擬器。
  • Dalvik虛擬器,如何在小型設備上優化。
  • 系統結構:從意圖到視圖再到權限和更多。
  • 如何將緩慢的XML變的更人性化。
  • 一步一步的建構Android應用程式。
  • 有很多的物件都擁有超連結,要如何將開發環境建置成類似小型網路的架構。
  • 從桌面應用程式,轉移到小型移動設備上,去思考發展。
  • 去控制應用程式的生命週期。
  • "如何做出更省電"。
  • 線程故事:不要使用線程去改變使用者介面。
  • 使用XMPP的經驗。

發文者 
原文出處 Google Developer Podcast: Android

2007年11月29日 星期四

Android官方部落格翻譯:Twisty的小迷宮(A Maze of Twisty Little Passages)

上個週末是美國的感恩節,按造傳統是和家人一起享用大餐和看美式足球的日子。

  最近有許多人在Android上,掌握了機會,開發出吸引我們目光的APP。

  下一個即將到來的是,Z-machine上,由Zork所開發的遊戲移植計畫。首先要感謝sussmanmariusm為了能夠在Android上順利執行,所付出的努力。移植到Google Play上的專案,被稱為"Twisty"。

  這個測試在Google社群上有很熱烈的反應。雖然JUnit對於Android SDK不是那麼友善,不過還是有許多方法可以測試。Positron建立了Android instrumentation,期待未來Android能夠有自我測試的可能性。筆者phil.h.smith認為這是一個可行的計畫(pretty good introduction)。

  IDE上的開發插件,通常是Android Google groups的另一個愛物。雖然目前只有NetBeans釋放出消息。然而idea-android專案早已準備好迎接IntelljJ IDEA的插件,這要感謝aefimov.boxintelliyole

  Dion Almaer所著作的picked up on a crossover GWT/Android project,同時也令人驚艷。Chronoscope是一個開源碼的GWT函式庫,該團體僅僅使用了八小時(8 hours of playing with Android),就完成了和Android端的接口。

  當然,還有更多的Android專案如雨後春筍般的出現,尤其當Android成為搜尋引擎的關鍵字,對於才剛發佈Android SDK沒幾個星期的我們,感到非常高興。

發文者 
原文出處 A Maze of Twisty Little Passages



2007年11月20日 星期二

Android官方部落格翻譯:防微杜漸(A Stitch in Time)

背景:當我在開發第一個Android App的時候(雖然很小),那是一個串接Podcast播放的應用程式,我需要一個輕而易舉的方法,能夠讓我在使用者介面上,實作即時更新的時鐘。

  問題:在一開始,我使用了java.util這個函式庫來更新時鐘,但是這個類別在Android上不是個好選擇。在這邊使用時鐘的例子來介紹,在應用程式開一個新線程。考慮到移動裝置應用程式有別於視窗應用程式,我們必須要找到更有效率的方法,來更新時鐘。

  應用程式:關於應用程式移植這部份的故事,留待日後的部落格會再開文詳述。如果你對開發應用程式有相當的疑問和興趣,你可以在開發者網站閱讀之前的文章,裡面有關於Matisse(Java上用於開發GUI-圖形使用者介面的類別)的介紹。原本的應用程式是使用Java Swing的SE應用程式。在錄製Podcast的時候,扮演了迴圈計時碼表的角色。當你開始錄音時,碼表同時被啟動,當你按下FLUB按鈕,會紀錄下那時候的音軌。最後你可以儲存它,並且使用Audacity來編輯它。

參考文件:http://www.developer.com/java/ent/print.php/3589961

一開始的版本中,計時器的程式碼如下:
class UpdateTimeTask extends TimerTask {
   public void run() {
       long millis = System.currentTimeMillis() - startTime;
       int seconds = (int) (millis / 1000);
       int minutes = seconds / 60;
       seconds     = seconds % 60;

       timeLabel.setText(String.format("%d:%02d", minutes, seconds));
   }
}
並在場景上的監聽器來啟動Timer()的更新,詳見以下實例:
if(startTime == 0L) {
   startTime = evt.getWhen();
   timer = new Timer();
   timer.schedule(new UpdateTimeTask(), 100, 200);
}
要特別注意的是,第一個參數100,表示第一次時鐘執行的時候,是在100毫秒之後,第二個參數200,表示之後每隔200毫秒更新一次,直到程式終止。200毫秒感覺並不明顯,但是如果不這樣做的話,就會發生延遲了2秒,畫面卻還沒即時更新的奇怪現象。

  當我在使用Android SDK要移植應用程式的時候,發生了程式碼無法在Eclipse上編譯的窘況,原來Timer()這個類別無法被執行(幸好在錯誤訊息中找到原因),除此之外,String.format這個方法也無法使用,所以我必須盡快找到解決的辦法。

  最後,計時器的功能,可以透過android.os.Handler這個類別,來設置監聽器。
private Handler mHandler = new Handler();
...
OnClickListener mStartListener = new OnClickListener() {
   public void onClick(View v) {
       if (mStartTime == 0L) {
            mStartTime = System.currentTimeMillis();
            mHandler.removeCallbacks(mUpdateTimeTask);
            mHandler.postDelayed(mUpdateTimeTask, 100);
       }
   }
};
首先,我們無法調用getWhen()這個方法,來對計時器來做設定。於是我們使用了System.currentTimeMills()這個方法,同時設定為Handler.postDelayed()的參數,但是無法重覆取得當下的時間係數。在這種情況下,我們宣告Handler在100毫秒之後,呼叫mUpdateTimeTask()這個方法,雖然解決了宣告計時器的問題,但是卻沒有解決重覆取得時間係數的問題。

  我們希望程式能夠重複取得時間係數,直到我們告訴它停下來。為了做到這一點,必須把另一個宣告延遲的函式,放置到mUpdateTimeTask run()這個方法後面。要注意的是,Runnable是Handler實作的方法,所以我們改了一下mUpdateTimeTask去實作,新的時鐘更新方法如下:
private Runnable mUpdateTimeTask = new Runnable() {
   public void run() {
       final long start = mStartTime;
       long millis = SystemClock.uptimeMillis() - start;
       int seconds = (int) (millis / 1000);
       int minutes = seconds / 60;
       seconds     = seconds % 60;

       if (seconds < 10) {
           mTimeLabel.setText("" + minutes + ":0" + seconds);
       } else {
           mTimeLabel.setText("" + minutes + ":" + seconds);            
       }
     
       mHandler.postAtTime(this,
               start + (((minutes * 60) + seconds + 1) * 1000));
   }
};
並且可以被定義為類別的成員變數。

  if判斷式,是為了讓時間係數的分,在小於10的時候,會以10:06呈現,而不是10:6(希望外來String.format()這個方法能夠使用),在計時器取得時間係數的時候,會調用Handler本身,以每200毫秒來啟動下次的動作: (((minutes * 60) + seconds + 1) * 1000)。

  現在我們需要一個按鈕,來讓計時器能夠停止。並且宣告按鈕的監聽器如下:
OnClickListener mStopListener = new OnClickListener() {
   public void onClick(View v) {
       mHandler.removeCallbacks(mUpdateTimeTask);
   }
};
為了確保按鈕不會發生二次點擊,當按鈕按下的時候,將會移除監聽。

  Handler是一個比Timer更好用的類別。Handler能夠妥善處理程式碼在主線程執行,避免額外再新開一個線程。要記得維持線程的順暢,避免搞壞使用者體驗。

  以上就是一系列Android之旅的第一個開發提示。希望這能夠在你開發的路上,少走些冤枉路,節省一些時間,可以去開發你想要的程式(即使只是一個應用程式的小更新)。這一篇文章涵蓋了我許多移植應用程式的經驗,也許未來會增加更多的小提示,除此之外,還有更多的討論正在Android Developers Discussion Group進行著。

發文者 
原文出處 A Stitch in Time

2007年11月16日 星期五

Android官方部落格翻譯:Android :第一週(Android: the first week)

  哇嗚!一個禮拜過去了。從上週一開始,我們的討論版,已經被Android SDK的討論淹沒啦!我們很高興可以幫助到大家 ,如何設計新的APP 。

  更新資訊:


  1. 我們已經緊急發佈了新SDK,解決了一些問題。現在請你下載(download M3-RC22a)和閱讀相關文件(release notes),別忘了更新Eclipse的插件(update the ADT plugin) 。
  2. 一些你可能感興趣的文章:
3. 最後,我們的論壇細分為許多子板塊,讓使用者可以更有效率的參與討論

  祝你有個美好週末和Android開發之旅。

  發文者 
  原文出處 Android: the first week

2007年11月13日 星期二

Android官方部落格翻譯:勇者!秀出程式碼吧!(Just show me the code)

  OK!你已經下載了Android SDK,並準備好開發出下一個千萬下載APP了嗎?(或許過程中還能賺到不少錢。)

  活動(Activities)?意圖(Intents)?內建容器(SimpleCursorAdapter)?嗯...我該如何開始呢?

  這就因人而異了,有些人想要從頭到尾,仔細的看完每一篇技術文件,而有些人則是希望能看到示範的程式碼。

  Android SDK提供了許多範例APP,這些範例APP都是免費的,讓你能夠更快掌握Android的開發。包括了有:

API示範(API Demos)
  「廚房水槽(kitchen sink)」這隻APP,涵蓋了大部分的實用元件和Android的API。你可以看到活動(Activities)、服務(Services)、通知(Notifications)和佈局(Layouts),在應用程式中不同的實現方法和圖文顯示。這隻APP提供了完整的素材,可以當作「我該如何開始?」的最佳範例。

登陸月球(Lunar Lander)
  這是一個展示如何加載、繪製圖形和動畫技術的遊戲。取得使用者輸入動作,儲存或暫停遊戲進度。然而,Android開發的樂趣,並非只有這樣而已!

筆記本(Note Pad)
  你將學習到,如何使用意圖(Intents)開啟一個新畫面,使用內建資料庫之類的。這個範例介紹了應用程式流程和生命週期管理,這些在開發進階應用程式是很重要的。


這些應用程式的程式碼和相關資源,可以在SDK資料夾(底下的/samples),或是在網路上找到:
http://code.google.com/android/samples/

以下是幾個小建議:

  • 確實閱讀應用程式當中的配置檔(AndroidManifest.xml),這會幫助你更了解Android App的整體架構。
  • 嘗試自己去修改程式碼,來熟悉建立和測試專案。
  • 依造自己開發專案上的需求,使用或留下有用到的片段程式碼。(避免砍掉重練)

在你練習這些教學範例的時候,如果遇到問題,歡迎將你的問題在討論版(Android Developers Discussion Group.)提出。


發文者 
原文出處 Just show me the code

2007年11月12日 星期一

Android官方部落格翻譯:這就是你要找的Android(This is the droid you're looking for)


  延續上週在OHA(Open Handset Alliance 開放手機聯盟 )的發表( announcement ),今天我們很高興能夠釋出Android SDK 提早讓你感受。我們期待能夠在討論版(discussion group)上,獲得廣大開發者的建議。同時我們也提供了開發者文件( developer documentation)和這個官方部落格,來幫助你上手。

  你可能想要馬上了解哪些是有用的。Android SDK的預覽功能,允許你在開發Android APP的時候,使用模擬器或是其他工具,來執行、測試、配置或除錯你的應用程式。需要注意的是:模擬器的使用者介面,包含外觀和體驗,版本是一直持續在開發中的。

  我們釋放出Android SDK的其中一個目的,是期待創造出更多Android平台的開發者,也希望在第一隻Android概念手機問世之前,盡快得到四方的建議,好讓Android能夠更完善。我們計畫會頻繁的更新和發佈Android SDK,這意味著我們會常添加修改API和UX。「追蹤(subscribe)本部落格,來獲取最新消息。」

  我們相當期待能夠看到,數以萬計的開發者,能夠建立一個開放式手機平台。事實上,你甚至可以讓你的App作品,參加Android開發者挑戰賽(Android Developer Challenge),這場比賽是由Google提供一百萬美金,獎勵開發者在Android平台上,開發更多好作品。

發文者 
原文出處 This is the droid you're looking for