Sunday, July 14, 2013

Android 學習筆記 2013-07-05 / Android Service and Native Service

1) Android Service 和 Native Service
Android Service 和 Native Service基本上位於同個層級, 往上就是Android Framework裡面的Manager們(ex. Sensor Service->Sensor Manager, Wifi Service->Wifi Manager), 注意Service和Manager是用IPC(Inter Processing Communication)在做溝通, Android Service是用Java來實作的Service, 而Native Service是用C/C++ 實作的Service
當Android Framework需要用到下層的硬體資源時(這裡用LED當例子)
a.會先用hw_get_module從HAL層取得硬體的stub(stub是Android設計的代理人proxy, 讓上層能夠使用下層以Linux Kernel架構的硬體資源, 用stub的原因是為了廠商的權利關係以及普及化)
b.HAL層就會回傳這個stub的物件
c.call back "open" method, 這時stub物件裡面定義的open函數就會被call到, 然後進行初始化(initialization)以及函數實體化的動作

Monday, July 8, 2013

Android 學習筆記 2013-07-05 / Multithread(run()) 與 layout / DDMS / getSharedPreferences

[1] Timer和介面 - Multithread(run()) 與 layout的連結
一般我們不能直接在multithread實作的run()的function裡面進行layout介面的改變
ex.
private TimerTask timerTask = new TimerTask() {
    public void run() {
        txtClock.setText("00:00"); //在這裡更改layout介面是違法的喔!
    }
};
解決方法請使用Handler接收由thread裡面傳出的訊息Message
ex.
private TimerTask timerTask = new TimerTask() {
    public void run() {
        Message message = new Message();
        message.what = 送出訊息;
        handler.sendMessage(message);
    }
};
然後再由Handler接收訊息
private Handler 變數 = new Handler() {
    public void handlerMessage(Message msg) {
        super.handlerMessage(msg);
        switch(msg.what){
        case 接收訊息:
            程式碼
            break;
        }
    }
};

[2] DDMS全名是Dalvik Debug Monitor Server, 要開啟此模式請在Eclipse右上角有個小圖標, 滑鼠滑過去顯示為Open Perspective, 點下去後選擇DDMS!我們可以從這裡用file explorer看看模擬器裡面的資料夾長甚麼樣, 也可進行匯出匯入以及刪除檔案的功能

[3] getSharedPreferences是"產生" SharedPreferences 物件
要放資料到SharedPreferences 物件的方法如下
SharedPreferences preferences = getSharedPreferences("preFile", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("NAME", "Sally");
aditor.commit();
如果以匿名方式寫如下...
SharedPreferences preferences = getSharedPreferences("preFile", MODE_PRIVATE);
preferences.edit().putString("NAME", "Sally").commit();

讀取方法如下...
SharedPreferences preferences = getSharedPreferences("preFile", MODE_PRIVATE);
String readName = preferences.getString("NAME", "unknown"); // unknown在NAME這個key裡面沒有值的時候顯示

移除方法如下...
SharedPreferences preferences = getSharedPreferences("preFile", MODE_PRIVATE);
preferences.edit().remove("NAME").commit();
如果輸入preferences.edit().clear().commit();會清除所有資料!

Thursday, July 4, 2013

Android 學習筆記 2013-07-04 / ArrayAdapter / 不同元件對應到的listener

[1] ArrayAdapter和BaseAdapter
Spinner和ListView都需要用ArrayAdapter<type>餵資料
Gallery和GridView需要先自訂一個adapter(ex. myAdapter)去繼承BaseAdapter然後在餵入資料, 在繼承的時候需要實作的function有getCount(), getItem(), getItemId() 還有 getView()

[2]不同元件對應到的listener
Button -> setOnClickListener
CheckBox -> setOnCheckedChangeListener
RadioGroup(RadioButton) -> setOnCheckedChangeListener
Gallery -> setOnItemSelectedListener
GridView -> setOnItemClickListener
ListView -> setOnItemClickListener


Monday, July 1, 2013

Android 學習筆記 2013-07-02 / Override / 為多個按鈕建立相同的Listener / substring

[1]在Override狀態下執行父class原來的function的功能
當一個Activity繼承Activity這個class時(ex. MyActivity extends Activity), 我們可能會想覆寫繼承的class的function, 但是在此同時又想執行原來class的function內建的功能, 這時我們會在我們自訂的function裡面第一行先執行super.function(), super在這裡指的就是被繼承的class, Activity, 意思就是將被繼承的class的該function執行一次

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
    ........
}

這個在Override是很常見的事情!

[2]為多個按鈕建立相同的Listener
btn1.setOnClickListener(myListener);
btn2.setOnClickListener(myListener);
...
...
private Button.OnClickListener myListener = new Button.OnClickListner() {
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.btn1:
                //do something when btn1 is clicked
            break;
            case R.id.btn2"
                //do something when btn1 is clicked
            break;
        }
    }
};
如此一來, 我們不需要為兩個按鈕分別建立一個Listner; 只要建立一個, 並且在觸發時根據被點選的按鈕的id去做反應

[3]String的substring
String str = "imagination";
System.out.println(str.substring(0,4)) // imagi
System.out.println(str.substring(4)) // tion