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)以及函數實體化的動作
Sunday, July 14, 2013
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();會清除所有資料!
一般我們不能直接在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
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
當一個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
Subscribe to:
Posts (Atom)