2014/12/25

Android Studio 筆記

最近Google releases正式版的Android Studio,並宣稱此工具將成為official IDE for Android。那Android未來還會繼續維護與發展ADT嗎?從Android用official IDE這字眼,並在官網上鼓勵大家轉到Android Studio的態度,個人覺得以Eclipse為基礎的ADT可能會走向尾聲了(參考這一篇)。

因為Android Studio的專案結構與觀念與ADT有蠻大的差別,所以一定要來瞭解一下

讀了一些網頁,把一些重要的記錄下來

Android Studio Overview
官方的資料一定是不可或缺的
我覺得這裡的workflow章節很重要,可讓我們可以瞭解一下這工具的使用概念
這裡稍作紀錄一下,Android Studio開啟是以專案(project)為單位(Eclipse則是workspace)
每個project可以包含一至多個modules(至少要有一個application module)。Module是個容器,用來存放與組織所需要的source codes與resources。Module又分為四種:
  • Application Module:可用來產出.apk檔來安裝至Android設備
  • Library Module:如其名稱,用來存放可被其他projects或modules共用的source codes與resources,以達到reuse之目的
  • Test Module:用來包含可對application projects進行測試的codes。其中講到"are built into test applications that run on a device",這等有時間可以來多瞭解一下
  • App Engine Module:可以與Google App Engine(GAE)結合,來整合device與雲端成為一體。這一塊對應該是做IoT的朋友可以多留意的

Android Studio vs. Eclipse: What You Need To Know
如果已經用慣Eclipse的朋友,可以先看看這篇,瞭解這兩者的異同
另外這一篇也可以參考一下

Android Tutorial for Beginners: Part 1
Android Tutorial for Beginners: Part 2
Android Tutorial for Beginners: Part 3
就如標題,這是針對正式版(v.1.0)所修改過的入門文,不是用之前beta版,有正確的畫面截圖,在學習時應該會減少很多混淆與誤解

Gardle
Android Studio並未採用Ant做為其build tool,而是選用了Gardle。因此若想把Android Studio玩好,把Gardle讀通也是必要的。
也可以參考Android官網上的Gradle Plugin User Guide


2014/12/12

GCMRegistrar置換為GoogleCloudMessaging的問題

GCMRegistrar已經宣告為deprecated,官方建議大家應改用GoogleCloudMessaging,並提供範例供大家參考


不過依照這份文件來實作時,當執行到 GooglePlayServicesUtil.isGooglePlayServicesAvailable (context); 時,會遇到  "The Google Play services resources were not found. Check your project configuration to ensure that the resources are included." 的錯誤訊息。

主要的問題在文件中沒有提到要在AndroidManifest.xml的application宣告中,加上
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"></meta-data>
然後在 /res/values/versions.xml 裡,加上
<integer name="google_play_services_version">6111000</integer>
至於這個version number應該填入什麼值?可以從 <sdk>/extras/google/google_play_services/libproject/google-play-services_lib/res/values/version.xml 中獲得。

另外一種說法,不應該把version number寫死,不過這個方法我還沒有試成功 (Eclipse)

參考文件

2014/11/26

真的不應該依賴software stack嗎?

在這篇文章中The full stack developer is dead, long live the un-stack developer,提出了un-stack developer的理念

不過現在的開發環境與應用平台,以及software reuse的概念下
不用software stack,什麼都自己動手做,在講求效率的今天,已經是接近天方夜譚了

也有許多開發者並沒有身處於start from zero的機會
不過開發者應該知道,一位好的開發者
必須要有從零開始的能力,必須要有設計架構的能力
並且努力為自己培養這樣的能力
因為有這樣的能力,才能讓自己有start-up的技能、觀念與胸懷

2014/11/17

Activity與Fragment間的轉場效果(transition animation)

為了要做Activity與Fragment間的轉場效果(transition animation),找了些資料來瞭解,覺得這些資料挺寶貴的,所以在這裡留下來。

贴一个定义android animation的应用实例
這一篇是簡體中文,針對四種特效(Alpha, Scale, Translate, Rotate)及相關參數有蠻詳細的說明

Various effect of interpolator in Android Animation
透過影片解釋不同的interpolator對於數量變化的影響

Android Animations Tutorial 5: More on Interpolators
用詳細的公式與圖表解釋不同的interpolator對於數量變化的影響

切換 ACTIVITY 的簡單轉場動畫
利用overridePendingTransition來進行activities間的轉場

android學習筆記之Fragment
用setCustomAnimations來達到fragments間的轉場

2014/11/12

ListView自我更新多次

剛剛開發一個有ListView的Activity,從SQLite資料庫取出資料,透過adapter將資料顯示在ListView上
資料庫中的測試資料總共有20筆
當畫面進入到這個Activity時,發現得花超過三四秒,才能將這些items顯示出來 (ASUS Nexus 7)

一開始以為是SQLite的效能太差,所以要花這麼長的時間,可是才20筆資料就花這麼多時間,效能也未免太差了
(select * from XXX order by YYY desc)
進入debug模式,發現其實從資料庫撈資料的速度很快,顯然不是SQLite的問題

經過一番追蹤,發現adapter裡的getView被呼叫了80次
才20筆資料,getView被叫了80次,也就是做了4次refresh
為什麼?

經過一番折騰與閱讀,總算知道主要原因是那個ListView的height設定為wrap_content,Android為了要將高度調整能wrap content,可能就必須不斷做載入與調整,也因此才會refresh了多次。
當把height改成match_parent時,果然這個現象就不會發生了。