星期一, 4月 30, 2012

return values of Android Service onStartCommand

實做 Service 時,最重要的應該就是 onStartCommand 的實作了吧,當其他 context 呼叫 startService 時,這個函數都會被呼叫。
onStartCommand 的回傳值可以有 4 種,分別是 START_NOT_STICKYSTART_REDELIVER_INTENTSTART_STICKY 跟 START_STICKY_COMPATIBILITY

若回傳 START_NOT_STICKY,表示這個服務不需要一直存留,當 Service 因其他程序需要記憶體砍掉以後,除非有另一次的 startService 呼叫,不然系統不會幫你重新執行 Service。

回傳 START_REDELIVER_INTENT 時,若 Service 被砍掉以後,系統會嘗試使用當初呼叫 startService 的 intent 來重新啟動這個 Service。

START_STICKY 跟 START_REDELIVER_INTENT 類似,但並不會保留上次用來開啟服務的 intent,也就是說如果 service 被系統砍掉後重開,被砍掉到重新啟動中間如果沒有 startService 來傳遞新的 intent,送進來的 intent 就有可能為 null,所以如果在 onStartCommand 裡面需要讀取 intent 裡的 bundle 一定要先確認 intent 是否為 null。

最後一個 START_STICKY_COMPATIBILITY,跟 START_STICKY 一樣,但根據官方的文件,使用這個 return code 時當 service 被砍掉後系統不一定會再呼叫一次 onStartCommand。也就是說如果是 sticky 的話系統一定會再 reschedule 一個 onStartCommand 嗎.?

Refs:
http://developer.android.com/reference/android/app/Service.html

星期五, 4月 27, 2012

query content provider with LIMIT

在 query ContentProvider 的時候要用 limit 的話,直接加在 sortOrder 後面就可以了。

Cursor c = cr.query(
 Uri.parse(uri),
 INS_PROJECTION,
 Instances.CALENDAR_ID + "=" + cal_id,
 null,
 "limit 1"
)

星期一, 4月 16, 2012

SimpleCursorAdapter & _id

基本上 Android 裡面的 Adapter 的工作就是一個將 "Item" (包括 data, meta-data) 包裝成 item view 的類別.
ListView 在 render 的時候會向 Adapter 要一個一個 view 用來表示每個資料.
SimpleCursorAdapter 是把 Cursor 包裝起來, 用來產生 listview 需要顯示的一個個項目。值得一提的是,Cursor 代表的資料需要一個 "_id" 的欄位, 用來當作 onListItemClick 的識別碼,也就是第三個參數。
所以在做查詢的時候都要 Projection 記得選 _ID,不然會噴 IllegalArgumentException。

Ref:

星期日, 6月 12, 2011

jumper

今天答應要幫媽媽的朋友在喪禮上放 ppt,有好幾份會需要跳來跳去,電腦又只有一個輸出沒辦法用雙螢幕來切,只好手動切但 Alt + Tab 只有兩個視窗的時候還好,超過三個以後有時候還是需要按幾次,在大螢幕上效果不佳,於是就寫了這個小程式...

基本上就是列出一些看得到的視窗然後讓使用者指定 1-9 的位置 (輸入 q 結束選取),設好以後直接用 Win + 1~9 就可以把視窗拉到前面來,ALT + CTRL + Q 關閉程式, ALT + CTRL + R 可以重新設定。今天自己試用的效果不賴,丟出來讓大家看一看,有興趣的可以拿去改的更好,只是我昨天也稍微 google 了一下居然沒找到類似的軟體,難道大家都這麼喜歡浪費時間一個一個  Alt+tab 找嗎 @@"

程式 & source : http://moon.cse.yzu.edu.tw/~s961449/jumper.zip

星期五, 4月 15, 2011

~/.xsession 突然不被執行了..

最近更新了以後發現 ~/.xsession 在開機不會被執行 (因為很少重開所以現在才發現....), 看了一下 /etc/X11/Xsession.d/50x11-common_determine-startup  裡面的判斷, 才發現現在如果 ~/.xsession, ~/.Xsession 不能被執行就會被跳過, 採用系統預設的 startup command. 所以只要將他設定為 executable 就行囉!

chmod +x ~/.xsession