2011年10月31日 星期一

[技術] C2DM 雲端發出的Message

Android Cloud to Device Messaging Framework

http://code.google.com/intl/zh-TW/android/c2dm/


雲端計算後主動push Meage給手機 , 不需要再透過Device主動Query!
應用可以類似Push Mail的概念 

[技巧] Eclispe好用熱鍵

Ctrl+1
Ctrl+/
Alt+Left (回到上一行)

點擊Implement的一堆Listner , 右邊會將implemet的function用顏色列出來!

[大哉問] Activity/Service/BrocastReceiver/Provider均在UI Thread?

Android Process and thread章節  , 有說明
http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html
All components that run in the same process are instantiated in the UI thread
有兩個原則:

  1. Do not block the UI thread
  2. Do not access the Android UI toolkit from outside the UI thread
第1點透過thread可解決 , 第2點範例如下:
不安全:
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}

安全

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
            mImageView.post(new Runnable() {
                public void run() {
                    mImageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}
跨thread要存取UI Thread上的View , 可透過下列Function達成
若有多個Client端存取的Component , 如Bound Service或是Content Provider , 會需要Thread Safe的做法 , 避免多個操作均使用GUI Thread , 會透過Thread Pool方式 , 避開Main/GUI Thread

[技術] TextView中加上效果和事件響應

http://blog.csdn.net/cmoaciopm/article/details/6828068
有說明下列的範例
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
Spanned.SPAN_EXCLUSIVE_INCLUSIVE
Spanned.SPAN_INCLUSIVE_INCLUSIVE

2011年10月29日 星期六

[技術] SQL語法


1.Create View(可新增對應到實際表格的視表,預先整理過,對存取的AP較容易查詢)

2.Alert Table (可動態修改資料表欄位)
http://www.1keydata.com/tw/sql/sql-alter-table.html

3.CREATE INDEX "INDEX_NAME" ON "TABLE_NAME" (COLUMN_NAME)
http://www.1keydata.com/tw/sql/sql-create-index.html

4.基本語法
Select 
SELECT "欄位" FROM "表格名"
Distinct
SELECT DISTINCT "欄位"
FROM "表格名"
Where
SELECT "欄位"
FROM "表格名"
WHERE "condition"
And/Or
SELECT "欄位"
FROM "表格名"
WHERE "簡單條件"
{[AND|OR] "簡單條件"}+
In
SELECT "欄位"
FROM "表格名"
WHERE "欄位" IN ('值1', '值2', ...)
Between
SELECT "欄位"
FROM "表格名"
WHERE "欄位" BETWEEN '值1' AND '值2'
Like
SELECT "欄位"
FROM "表格名"
WHERE "欄位" LIKE {模式}
Order By
SELECT "欄位"
FROM "表格名"
[WHERE "條件"]
ORDER BY "欄位" [ASC, DESC]
Count
SELECT COUNT("欄位")
FROM "表格名"
Group By
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
Having
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
HAVING (函數條件)
Create Table
CREATE TABLE "表格名"
("欄位 1" "欄位 1 資料種類",
"欄位 2" "欄位 2 資料種類"",
... )
Drop Table
DROP TABLE "表格名"
Truncate Table
TRUNCATE TABLE "表格名"
Insert Into
INSERT INTO "表格名" ("欄位1", "欄位2", ...)
VALUES ("值1", "值2", ...)
Update 
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE {條件}
Delete From
DELETE FROM "表格名"
WHERE {條件}

2011年10月28日 星期五

[概念] Handler/Looper/Message Queue/Headler Thread

- Android的Activity/Service/Broadcast Receiver/Content Provider都是執行再Main Thread(GUI )中
  , 也就是GUI Thread , 若在Activity/Service中占據執行時間超過5秒 , 就會產生ANR , 若是
  Broadcast Receiver中占據執行時間超過10秒就會產生ANR

- 遠端物件透過Bound方式呼叫Service ,  或是呼叫Content Provider , 系統會自動為每一個
  呼叫產生Bind Thread , 避免Thread Safe問題

- 多執行緒和Handler關系
http://j796160836.pixnet.net/blog/post/28766165-%5Bandroid%5D-%E5%A4%9A%E5%9F%B7%E8%A1%8C%E7%B7%92-handler%E5%92%8Cthread%E7%9A%84%E9%97%9C%E4%BF%82


- HandlerThread的用法如下 , 是內有Looper的Thread , 一般的Thread執行後會結束
這種Thread會進入等待狀況
http://developer.android.com/reference/android/os/HandlerThread.html
HandlerThread mBackgroundThread = new HandlerThread("ContactsProviderWorker",
                Process.THREAD_PRIORITY_BACKGROUND);
        mBackgroundThread.start();
        mBackgroundHandler = new Handler(mBackgroundThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                //performBackgroundTask(msg.what, msg.obj);
            }
        };
使用:
mBackgroundHandler.sendEmptyMessage(task);



Android中的MessageQueue,Handler,Looper和Thread


http://www.limodev.cn/blog/archives/1207

[概念] Service/Bound Service/IntentService

IntentService
獨立Thread/不需自行實作Looper/Handler/方便又快速

[技術] Android 字串 vs %s

http://ww3.dnaxcat.net/p_view.jsp?ID=43891
JAVA String.format()

2011年10月17日 星期一

[技術] 方便的IntentService

文章連結 : 點我
平常要使用Android Service , 要了解甚麼是bind , 如何呼叫Service
但Intent Service不需要知道那麼多 , 只要會使用Intent與接收Intent就
可以運作 , 超級方便 , 連Android Framework中都有使用此種Service
加速與簡化程式碼

Intent Service是使用StartService的方式啟動 , 如同Start Service作法
屬於Local Service , 外界不能使用

IntentService是非同步的呼叫 , 那要怎麼回傳資料呢?
可以使用CallBack 
1.Intent Service維護Listener list

2.Intent Service定義interface
 public interface Listener {
        public void onServiceCompleted(Intent callbackIntent);
 }
3.Intent Service取得MainHandler ()
mMainHandler = new Handler(Looper.getMainLooper());
4.Acitivty實作Intent Service的interface並取得static版本的registerCallBack funtion將Activity Ref設定給Intent Service的Listener List
5.Activity使用Intent呼叫Service , 並將回呼的Intent(Activity與Action)放入extra中
Intent serviceIntent = new Intent(
context, ContactSaveService.class);
serviceIntent.setAction(ContactSaveService.ACTION_SAVE_CONTACT);
serviceIntent.putExtra(EXTRA_CONTACT_STATE, (Parcelable) state);

callbackIntent.putExtra(saveModeExtraKey, saveMode);
callbackIntent.setAction(callbackAction);
serviceIntent.putExtra(ContactSaveService.EXTRA_CALLBACK_INTENT, callbackIntent);
6.取出Call back Intent
Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
7.Intent Service呼叫Listener
mMainHandler.post(new Runnable() {
            public void run() {
                listener.onServiceCompleted(callbackIntent);
            }
        });

[技術] Android Proximity Alerts Tutorial

連結: 按我

Location Base的應用常會需要計算是否靠近某個位置
這個是一個很好的範例

2011年10月16日 星期日

[技術] Android中2D圓球繪圖

原文出處: 點我連結
筆者原始目的是要畫出3D的球形 , 找到這個Blog有說明如何搭配Drawable進行設計
這樣有一個好處,就是不需要請美工製作圓形底圖,程式設計者可以快速開發類似的背景