搜尋此網誌

2013-10-28

AIDL and Remote Service

作者: Joy Song

基於安全上的考量,Android的每個AP都會跑在自己的process上,不同的process是無法直接溝通的,必須要透過Android所提供的某些機制 (Intent, Binder) 才能達到溝通的訊息。

因此,Android提供了一種IPC的實作方式AIDL來達到讓兩個不同process也能相互溝通的目的。實作的方法很簡單,以下提供一個簡單的範例,另外AIDL有些要注意的地方,這邊也提出來跟大家分享。

實作範例


1. 定義 aidl 檔案


Context 是什麼?

作者:KH Chen

Context在很多地方都會用到,但是他到底有哪些限制?你現在拿到的Context真的是你想要的Context嗎?我們在開發APP常常會用到Context,但是在使用上我們卻常常忽略了一件事情:

One Context is not equal to another!!!

讓我們來看看下列表格:

ApplicationActivityServiceContentProviderBroadcastReceiver
Show a DialogNOYESNONONO
Start an ActivityNO1YESNO1NO1NO1
Layout InflationNO2YESNO2NO2NO2
Start a ServiceYESYESYESYESYES
Bind to a ServiceYESYESYESYESNO
Send a BroadcastYESYESYESYESYES
Register BroadcastReceiverYESYESYESYESNO3
Load Resource ValuesYESYESYESYESYES

2013-10-25

AsyncTask 的黑暗面

作者:囧尼

相信Android App的開發者對於使用AsyncTask肯定不陌生,它提供了一個在背景運算操作又同時能夠更新結果至UI thread的方式。但有幾個小地方可能開發者會容易忽略而導致一些不可預期的結果發生。

Lifecycle


很多人可能認為若在Activity中創建了一個AsyncTask,那當該 Activity被destroyed 時,理論上這個AsyncTask也應該被刪除了才是。答案是錯,這個AsyncTask會繼續在背景執行它的doInBackground(),而這樣的問題會導致Crash的發生,因為它想要refer的一些物件早已經不存在了。

所以我們必須要確認在destroyed Activity的同時,有去取消 (cancel) AsyncTask 掉。呼叫cancel(boolean mayInterruptRunning)來cancel這個task,這個boolean值為true的話,代表當前的task應該立即被中斷,反之則允許處理完當前事務後結束。如果在doInBackground()中有使用道loop的話,建議可以每次呼叫isCancelled()方法來避免掉多餘的處理。

Don’t Sotre Data in Application Object

作者:KH

在開發 Android App 的時候,儲存資料的方法有很多,像是SQlite、SharedPreferences……等等,但是如果只是一些暫時存放的東西,有的時候為了方便我們也許會寫一個class,將資料存進去。像是下面的例子:

2013-10-24

LayoutInflation 注意事項

簡單的說,Layout inflation 指的是把 XML layout resource 經過轉換後變成可以運用在程式的 View Hierachy 之中。

如果你曾經這樣寫過像下面這一行的程式,那可能就會導致一些排版上的問題:
inflater.inflate(R.layout.my_layout, null);

GlobalView

這次要介紹一個 UI 妙技:「如何讓你的 CustomView 總是漂浮在最上面,不管目前有哪些 app 被開啟。」

最近大家如果有使用 Facebook App,你會發現在上面聊天時,對方的大頭照會飄浮在 UI 最上層。或是使用 iPhone 的人常使用的 AssistiveTouch,一個永遠飄浮在最上層的虛擬 HomeKey。

Stey by step 的照下面方法去實作即可完成 Global View。

1、在 AndroidManifest.xml 中新增一個權限:
android:name = "android.permission.SYSTEM_ALERT_WINDOW"

2013-10-23

Speed Broadcasting -- LocalBroadcastManager

我想不少人都透過 Intent 來傳送資料,並用 BroadcastReceiver 來接收該 Intent ,這是 Android 提供相當好用的一個機制。但是請注意下列兩點:

1、 Intent 是透過 Binder 來實作用來進行 inter-process commumnication,已經是和系統層面相關,所以效能上不是很好。

2、任何 app 只要知道你的 intent key (字串),每個人都可以收送我們 app 所需特別 Intent ,這延伸出來的就是安全問題了。