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

Wednesday, October 10, 2012

What is an Algorithm

Algorithm is...

1. action(s)

2. order(s)

, so give an order for action(s) to decide which action happens after another is Algorithm!

for simplicity, algorithm can be presented by pseudo code, 不是可執行, 可compile的程式, 但是可以清楚的表達該algorithm

Tuesday, October 9, 2012

Constructor 建構子

Constructor 要取得跟該 class一樣的名字, 主要是在用 class 產生 object 時, initialize一些變數用

ex.

public class MyCat {
    private catName;

    public MyCat (String name) // constructor
    {
        catName = name;
    }

}

of course multiple inputs are acceptable


public class MyCat {
    private catName;
    int catAge;

    public MyCat (String name, int age) // constructor
    {
        catName = name;
        catAge = age;
    }

}

Primitive Types vs. Reference Types

boolean, byte, char, short, int, long, float and double - Primitive Types


A primitive-type variable can store exactly one value of its declared type at a time. For
example, an int variable can store one whole number (such as 7) at a time. When another
value is assigned to that variable, its initial value is replaced.


其他的都是 Reference Types (String, 所有其他的class)