顯示具有 AlarmManager 標籤的文章。 顯示所有文章
顯示具有 AlarmManager 標籤的文章。 顯示所有文章

2011年3月4日 星期五

讓癮科技 Android 應用登上榜首的秘密

How do I make my Engadget(Chinese Version) app to become the most popular app?

經過將近一個月的測試,2011/2/6 首次發行 癮科技 Android app 到 Android Market 上。六天後的今天 (2011/3/3),這個應用很快地爬到「新聞與雜誌」類別排行榜中的第一名位置,同時也是所有應用程式排行榜的第四名。在目前 Android Market 已有 16 萬個 Android 應用 一起激烈競爭的情況下,新的應用能這麼快登上排行榜,真的是一件很不容易的事。這中間,癮科技寫的「不要再叫我們蘋科技!癮科技新聞訂閱程式也有Android版了」這篇介紹文,當然有很大的幫助。

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

要讓應用程式登上排行榜,可以分成非技術面與技術面兩個面向來談。非技術的部份,我早在 2009/10 一場研討會的「發現 Android 熱門應用程式的秘密」的講座中,分享給大家。只不過這場演講主要的對象是對岸的開發者,對於台灣的開發者,只好等下次有人邀請我演講時,我再分享給大家。

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

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

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

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

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

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

雖然我們做了這麼多的努力,這個應用還有一些沒做好的部分。我們還會繼續在這個應用中奮戰好一段時間,在接下來的新版本中,我們會陸續解決這些問題,敬請期待!


繼續閱讀全文...

2009年9月21日 星期一

Android 原始碼徹底研究系列 - 鬧鐘程式, Alarm Reminder (4)

Android Source Code Internals - Alarm Clock, Alarm Reminder (4)

在了解鬧鐘程式各個功能是如何實現後,這次我們要來追蹤『提醒鬧鈴時間到達』這個功能是如何實現的。

要追蹤應用程式的原始碼,先觀察 AndroidManifest.xml 通常是最好的方式。

首先,我們先打開 AlarmClock 的 AndroidManifest.xml 檔案。注意看 #52~#64 這兩個 broadcast receivers。

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

讓我們先打開 AlarmInitReceiver.java 看看。#31~#42 這個 onReceive() 內的程式就是關鍵。

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

接著,我們打開 Alarms.java 看看 setNextAlert() 這個函式到底在做些甚麼事。

看起來,enableAlert() 就是負責設定下一個鬧鈴的主要函式。

從程式中,我們了解到他先透過 AlarmManagerset() 函式,設定鬧鈴時間,以及鬧鈴時間到達時,所要喚起的程式。由於是透過 PendingIntent.getBroadcast() 取得 PendingIntent 的 instance,因此我們知道這個被喚起的程式應該是個 broadcast receiver。

那到底是那個 broadcast receiver 會被喚起呢?從程式看來,應該就是喚起會接收 ALARM_ALERT_ACTION action 的 broadcast receiver。在此的 ALARM_ALERT_ACTION 就是 "com.android.alarmclock.ALARM_ALERT" 字串。

讓我們再翻開 AndroidManifest.xml 瞧瞧,會接收 com.android.alarmclock.ALARM_ALERT 的 broadcast receiver,不就是 AlarmReceiver?!

打開 AlarmReceiver.java。仔細研讀一下,不難理解這段程式的主要工作就是:

  1. 先喚醒可能正在沉睡中的 CPU 與螢幕
  2. 暫時解開鍵盤或螢幕鎖
  3. 執行 AlarmAlert 這個 Activity,也就是你最終看到的鬧鈴提醒對話框。

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

打開 setStatusBarIcon(),其內容如下:

竟然是透過送出 ACTION_ALARM_CHANGED Intent,來設定 notification icon 的。看來,這是個未公開的用法。了解這些特別的用法,這不就是你研讀系統原始碼的好處之一嗎?


繼續閱讀全文...