星期三, 6月 29, 2016

有效率地顯示Bitmap(一)

為什麼Android app開發人員需要注意Bitmap的使用?


開發過Android app的工程師多半懂如何有效率地加載Bitmap,以維持使用者介面的響應和避免過度使用應用程式的記憶體。如果不關心Bitmap的加載,Bitmap將快速地消耗應用程式可用的記憶體,並導致應用程式因為
java.lang.OutOfMemoryError: bitmap size exceeds VM budget.
的例外而崩潰。

以下幾個原因造成應用程式加載Bitmap的工作更為複雜。

  • 行動手機通常有限制系統資源。對於單一應用程式Android裝置最少只需16MB的可用記憶體,應用程式應該優化使在最小記憶體的限制下能運行。不過,許多裝置都配置較高的限制。

  • Bitmap占用許多記憶體,特別是富含圖片的功能如相簿。舉例來說,Galaxy Nexus上的相機拍的相片高達5290x1936象素。如果Bitmap配置是使用ARGB_8888,加載一張相片到記憶體大約需要19M的記憶體(5290x1936x4 bytes),瞬間就超過一些裝置的應用程式記憶體限制。

  • 應用程式的使用者介面往往需要一次加載許多的Bitmap,元件如ListView、GridView和ViewPager通常在螢幕上一次都包含許多Bitmap,並有更多超出螢幕以外的Bitmap準備顯示。


既然我們常常使用Bitmap,而Bitmap又容易消耗應用程式可用的記憶體,接下來的相關文章將介紹如何有效率地加載Bitmap物件,使應用程式能順利加載Bitmap並運行。





星期三, 3月 02, 2016

簡介透過GCM達成推播功能 (二)

如何取得Sender ID?


進入Google developers console並登入帳號。
如果此帳戶有已建立的專案,登入後會看到已建立的專案的資訊。
如果此帳戶無建立任何專案,登入後會看到建立專案的資訊。

建立專案
專案名稱欄位那填入專案名稱,此名稱由開發人員自訂。


取得Sender ID
專案建立完成後,便可以在首頁->資訊主頁上找到兩個專案ID,一個ID是由英文字母和數字組成;另一個由數字組成。純數字組成的專案ID就是Sender ID





如何取得API Key?


進入Google developers console並登入帳號。

建立憑證
由左側選單中API管理員進入憑證頁面。
點選建立憑證選擇API金鑰。接著選擇伺服器API金鑰。



填入名稱和伺服器IP位址,建立金鑰。


建立完成後,此金鑰為API Key




啟用Google API
在首頁->資訊主頁上找到使用Google API進入。


選擇欲使用之Google API


啟用Google Cloud Messaging。





其他方法

另外從configure your API project也可以取得Sender ID和API Key。



星期二, 3月 01, 2016

簡介透過GCM達成推播功能 (一)

簡介透過GCM達成推播功能 (一)


透過GCM程式開發人員能從伺服器發送資料到應用程式上。以下簡介GCM


架構

整體架構由三個部件組成。
1.      Google GCM connection server
2.      App server
3.      Client App



證書

GCM中使用的IDsToken是用來確保各方已經認證,如此訊息便能傳送到正確的地方。

1.      Sender ID – 不會重複的數值。在Google Developer Console中配置API專案時取得。註冊時使用,GCM用來辨識App server已被允許傳送訊息到Client app
2.      API Key – API Key儲存在App server,讓已認證的App server存取Google服務。在HTTP中,API Key被包含在POST請求的標頭中。
3.      Application ID – Client app用來註冊已便能接收到訊息。它是平台獨立的,在Android平台上利用package name作為Application ID
4.      Registration Token – GCM針對Client app產生的ID,允許Client app接收訊息。另外特別需要注意的是Registration Token必須被保密。



GCM的作用?

Google Cloud Messaging(GCM)是處理應用程式伺服器(App Server)與手機應用程式(Client App)間的訊息之傳送、路由與排隊的服務。





如何透過GCM實現推播?



1.      Android裝置向GCM傳送Sender IDAppilcation ID進行註冊。
2.      註冊成功。GCMAndroid裝置回傳Registration Token
3.      Android裝置接收到Registration Token,向伺服器傳送Token
4.      伺服器將Registration Token存入資料庫,待往後使用。

a.      當需要進行推播時,伺服器向GCM傳送訊息與Registration Token
b.      GCM利用Registration TokenAndroid裝置傳遞訊息。

星期五, 10月 30, 2015

Bitmap的壓縮

Bitmap在Activity間傳送時,進行壓縮。

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();

星期四, 10月 01, 2015

利用指令將本地端專案加入GitHub

利用指令將本地端專案加入GitHub

1.在本地專案目錄下,開啟Git Bash,輸入git init指令,建立此專案的本地端數據庫。

2.建立完本地數據庫後,輸入git add .指令,將所有修改過的或新增的檔案add到stage狀態。

3.輸入git commit -m 'first commit'指令,commit所有已經stage的檔案。

4.輸入git remote add origin remote repository url指令,提示本地端數據庫將會被push的位置。

5.輸入git push origin master指令,將專案push到GitHub。

星期五, 9月 25, 2015

在OneDrive雲端空間建立Git遠端數據庫

在OneDrive雲端空間建立Git遠端數據庫


1.在OneDrive目錄下新增新資料夾,命名為TestGit

2.進到TestGit點擊右鍵,開啟Git Bash

3.在Git Bash中輸入命令,git init --bare

4.執行指令後,TestGit內會建立一些資料如hook、info、object等(建立遠端數據庫)

5.在除了OneDrive目錄以外的目錄下點擊右鍵,開啟Git Bash

6.在Git Bash中輸入指令,git clone file///c/Users/user/OneDrive/TestGit

7.執行指令後,建立TestGit目錄(建立本地端數據庫)

8.完成以上步驟就可以進行push、pull等等將專案資料進行版本管理



除了OneDrive也可以選擇其他雲端空間如GoogleDrive、Dropbox,將遠端數據庫建立在雲端空間。


建立TestGit目錄(本地端數據庫)後,就可以將專案建立在TestGit目錄下,利用git完成版本控制。

星期日, 5月 24, 2015

Android Interface Definition Language (AIDL) (一)

Android Interface Definition Language (AIDL)


行程間通訊(IPC,Inter-Process Communication),指至少兩個行程或執行緒間傳送資料或訊號的一些技術和方法。在Android系統中提供一些方法進行IPC,AIDL為其中一種方法。

AIDL (android interface definition language) 與其他你可能已經使用過的IDLs相似,它允許你在client和service兩者上編寫介面(interface)用來在彼此之間進行行程間通訊。在Android上,一個行程按理是無法存取其他行程的記憶體,所以說,它們需要將它們的物件分解為作業系統可以理解的原始狀態,封送(marshell)物件跨過邊界。編寫進行封送的程式是乏味的,所以Android利用AIDL處理好了。

注意,只有在如果你允許來自其他應用程式的用戶端存取你的服務(service)及想在你的服務(service)中處理多執行緒,使用AIDL是必須的。如果你不需要在跨不同應用程式間實現並行IPC,你應該藉由實現一個Binder建立你的介面(interface),或者你想進行IPC,但不需要處理多執行緒,利用一個Messager實現你的介面(interface)。無論如何,在你實現AIDL前確保你理解bound service了。

在你開始設計你的AIDL介面(interface)前,注意調用AIDL介面(interface)是函式直接調用,你不應該做出假設在執行緒中調用函式的可能。發生情況不同依據是否來自在本地行程或遠端行程中的一個執行緒的調用。特別是
  • 執行在相同執行緒中的本地行程產生的調用正在調用,如果此執行緒是你的主要使用者介面執行緒(UI thread),此執行緒繼續在AIDL介面中執行。如果此執行緒是其他執行緒,是在你的服務(service)中執行你的程式的其中之一執行緒。因此,如果只有本地的執行緒正在存取服務(service),你可以完全地控制在服務中執行的執行緒(但是,如果是這樣的話,你不應該使用AIDL,但應該實現一個Binder來建立介面來取代之)。
  • 來自遠端行程的調用被一個執行緒池(thread pool)調度,該平台在你自己的行程中維護,你必須為來自未知執行緒的調用作準備,可能在同一時間許多調用發生,換句話說,AIDL的實現必須是完全地執行緒安全(thread-safe)。
  • oneway關鍵字改變遠端調用的行為。當使用時,遠端調用不會阻塞,它會簡易地送交易資料並立即回傳,介面的實現終究會接收它如來自Binder執行緒池正規的遠端調用。如果oneway備用在本地調用,不會有任何影響且調用仍是同步的。