放假回家後著實無聊了點,剛好小米到手就學了下android開發,做點自己需要的應用,純Android新人,還請高手指點。
學習加上開發這個widget前後算起來也快半個月了,目前已有一個比較完整的功能,不過還有待增加功能與代碼重構等,現在先放出這個版本與朋友們交流。
、源碼與apk檔案放在最下面,有需要的朋友自行下載。
這次做的主要一個功能是用appWidget展示一個英語、日語的每日一句,並可以發
音閱讀, 資料來源為滬江(本文僅為學習所用,任何人不得以本文及所含代碼用作
商業用途,違者責任自負)。
滬江已經有了一個每日一句的,但是是Activity,個人感覺麻煩,便做了個widget的。
其中使用到的包括:app widget的布局以及開發,廣播,sqlite資料庫,服務的使用,
以及滬江提供的每日一句服務等。
下面就遇到的些問題做個記錄以便以後有機會深入研究android再回來查看,有高手願
意解答也萬分感激。
1.appWidget的更新是通過接收廣播完成好還是通過AppWidgetManager在服務中
直接更新好
個人感覺服務僅僅用來做資料處理就行,處理完資料將結果廣播出去,誰要資料誰接收
便是,但不知道在服務中調用AppWidgetManager進行更新widget有無什麼好處?
2.intent的extras出現資料混亂的問題,最後改用data uri
這個問題不止一次出現,是bug問題還是我沒用好..應該是沒用好
大致問題就是,可以看到下面中有一個英語日語切換點擊,和一個上下翻頁的東
西,點擊事件Intent中帶extras都出現資料不對的問題
比如,英語註冊切換到英語的事件,日語註冊切換到日語的事件
都new出來的Intent放入PendingIntent.getService,都帶有不同的extras,但是第一次促發
英語事件以後即使以後促發日語的事件也傳的英語的資料,第一次促發日語事件以後也是
日語的,實在沒找出原因,跟進源碼跟到第一步就找不到源碼了...先記下來,以後再解決。
出現後弄了很久沒解決,只好去搜了下,有個老外也遇到類似的問題,改用data uri解決的
http://stackoverflow.com/questions/4064937/remoteviews-and-setonclickpendingintent
我也試了下,放在data uri後面都可以正確解析到
3.appWidget的textView滾動效果(如果開啟服務更新是否開銷過大)
因為一個頁面放不下太多內容,想弄個scroll,但是不支援額。。有說開個定時任務讓他自動
滾動,也可以開個服務更新,都是一個原理,而且要不停更新,不知道吃電量大不大,畢竟手
機上考慮的最起碼的吃電和流量。最後還是決定給個上下翻頁的按鈕了,見。
4.sqlite有無ORM架構
這個對象屬性一多,寫起DAO真麻煩,無論查詢還是插入,求個好用的架構。。。
5.appWidget的布局寬高問題
http://www.eoeandroid.com/sdk/api/guide/practices/ui_guidelines/widget_design.html
http://www.eoeandroid.com/sdk/api/guide/topics/appwidgets/index.html
看這兩篇guide吧 6種widget布局,做介面真心不會,這裡也不多說了。。看我那,好聽
點說乾淨樸實啊
6.appWidget啟動服務時,如果服務未結束時再啟動同一個服務,這兩個服務為同一個對
象 startId不同 可以利用
服務不結束再請求該服務都不會再建立對象了,好像eoe特刊裡面有一期提到了服務的生命周
期,只是掃了下沒仔細看,剛開始寫服務時不知道會使用同一個對象,都寫的私人成員,吃了
不少虧,這個地方代碼中還是用的私人成員,沒有改過來,先記下有時間再說。
7.分層問題 資料層中分頁資料時考慮了顯示寬度問題 服務層中考慮了appWidget更新
剛開始準備著手做這個東西時還各種層都考慮了怎麼分,雖然最後做出來的還是有階層,
比如service、資料以及顯示,但是功底不夠,一個不知道分的對不對,二個即使按照自己分的
是對的,在資料層還是參進去了介面(比如分頁顯示要根據字型寬度判斷,這個給寫在分頁的
資料層了- -),還有許多其他問題有待改進。
8.關於LocalBroadcastManager的使用
什麼作用查API吧,這裡記下我的問題,用LocalBroadcastManager發廣播時必須得註冊接收者
僅僅使用intent-filter貌似不起作用?
可以從SDK上的extras下找到android support package,maven庫上好像沒有android-support-v4.jar包。。
9.關於網路是否存在的判斷
網上大多都如下判斷網路是否存在,不知道是否有人驗證過是否一定準確
public static boolean checkInternet(Context paramContext){NetworkInfo localNetworkInfo = ((ConnectivityManager) paramContext.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();if (localNetworkInfo != null){boolean hasNet = localNetworkInfo.isAvailable();return hasNet;}return false;}
今天無聊測試了下用USB綁定電腦共用網路,用上面的方法是驗證無
網路,目前的android API貌似擷取不到USB共用網路的資訊...用java
API判斷是否能連上host也許可以吧,沒有嘗試
10.還有許多可以增加的功能和改進的地方
比如添加一個Activity讀取以前已更新過的資料,清除已更新下來的資料,下載時弄個進度條提
示等等,不一一列舉,有興趣在這代碼上修改的請隨意,如果可以,改完發我一份一起學習交
流~以後我有時間對這個代碼有功能改進也會在這裡更新
模擬器上的效果:
這個是APP WIDGET的添加介面
初始狀態
點擊英語擷取到英語的當天資料
點擊日語擷取到日語的當天資料,並做了分頁
現正播放發音
兩張小米上的:
PS:由於本身寫給自己用的,介面上沒做太多,但是極力的在電量和流量的控制上做了許多工作,
比如服務的開關,下載後儲存到資料庫等,測試了下,一天的英語加日語加上對應的MP3耗流量106K,
如果不點擊播放不會下載MP3。下載沒有提示的,如果要使用的話這個地方也需要注意。
當天資料如果沒更新過,沒有網路時點擊沒有任何效果。然後目前的版本放到真機後,螢幕比電腦小多,
在一塊小地區內要放入很多元素,在點擊英語和日語時可能出現沒點擊到對應的textview導致沒有反應- -
有待改進,自己拿去改也行。
源碼,eclipse工程:
http://download.csdn.net/detail/zhouyuqwert/4024341
單獨APK檔案:
http://download.csdn.net/detail/zhouyuqwert/4024342 其實源碼bin/下面有了
修正1.修正一處,由於真機上點擊著實麻煩,範圍過小,
現在增加了點擊範圍,將選擇語言換成Activity透明背景選擇,現在在真機上
點擊所示地區都可,非常容易點擊到
修正1(點擊地區的修改).源碼。APK:
http://download.csdn.net/detail/zhouyuqwert/4024728
另外再記錄下關於maven的android工程,先前看有人在java區問到過,一起
在這裡聊下:maven庫裡面提供了三個工程,如下介紹,用介紹的建立工程後
eclipse:eclipse再匯入到eclipse用吧
https://github.com/akquinet/android-archetypes/wiki
部署也簡單,install 打包apk android:redeploy卸載再部署 android:deploy部署
clean install android:redeploy一起用便是,自動重新部署上去了
http://mvnrepository.com/這裡是maven的所有庫,可以從這裡查詢你要的