寫在前面 :
由于公司戰(zhàn)略問題,現(xiàn)在轉(zhuǎn)戰(zhàn) java 后臺 , 但是自己還是想在 Android 開發(fā)方面做的深入點,正值項目間隙,重溫我親愛的 Android ,做 Android 開發(fā)時期很多細(xì)節(jié)問題自己也沒有意識到,現(xiàn)在慢慢深入。
實例代碼
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
//android.os.Process.killProcess(android.os.Process.myPid());
return true;
}
return super.onKeyDown(keyCode, event);
}
實現(xiàn)功能:監(jiān)聽物理按鍵,點擊返回按鍵退出程序
onKeyDown
-
onKeyDown方法 :該方法是接口* KeyEvent.Callback *中的抽象方法,所有的View全部實現(xiàn)了該接口并重寫了該方法,該方法用來捕捉手機鍵盤被按下的事件。 - 方法參數(shù)
(int keyCode, KeyEvent event)-
keyCode :手機鍵盤被按下的鍵盤碼(手機鍵盤的每個按鈕都有單獨的鍵盤碼),程序通過鍵盤碼知道用戶的哪一個鍵。 -
event :按鍵事件的對象(包含觸發(fā)事件的詳細(xì)信息、事件類型等信息),當(dāng)用戶按下按鍵時,系統(tǒng)會自動將事件封裝成KeyEvent對象供應(yīng)用程序使用。
-
-
返回值--boolean :當(dāng)返回true時,表示已經(jīng)完整地處理了這個事件,并不希望其他的回調(diào)方法再次進行處理,而當(dāng)返回false時,表示并沒有完全處理完該事件,更希望其他回調(diào)方法繼續(xù)對其進行處理
onKeyDown()和onBackpress()方法區(qū)別
- Android 2.0之前需要監(jiān)聽按鍵事件,進行判斷是不是按下了back鍵
- Android 2.0之后系統(tǒng)提供了一個onBackPressed()方法,這個方法就是專門用來監(jiān)聽back鍵事件的,所以只需重寫onBackPressed()方法即可。
@Override
public void onBackPressed() {
//實現(xiàn)Home鍵效果
//super.onBackPressed();這句話一定要注掉,不然又去調(diào)用默認(rèn)的back處理方式了
Intent i= new Intent(Intent.ACTION_MAIN);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addCategory(Intent.CATEGORY_HOME);
startActivity(i);
}
Activity啟動模式 :
系統(tǒng)提供了兩種方式來設(shè)置一個Activity的啟動模式:AndroidMainifest 啟動方式和 Intent Flag 啟動方式 , 著中談一下 Intent Flag 啟動方式 。
** 通過設(shè)置Intent的Flag的方式來設(shè)置Acitivity的啟動方式 **
- Intent.FLAG_ACTIVITY_NEW_TASK
使用一個新的 Task 來啟動一個 Activity ,但是啟動的每個 Activity 都將在一個新的 Task 中 ( 不然 NEW_TASK 這個稱號不是白費了嗎 )。這種方式通常使用在 Service 中啟動 Activity 的情況,由于在 Service 中不存在 Activity 棧。所以使用該 Flag 來創(chuàng)建一個新的 Activity 棧。并創(chuàng)建新的 Acitivity 實例 。
- Intent.FLAG_ACTIVITY_SINGLE_TOP
使用 singletop 模式來啟動一個 Activity ,與指定 android : lanchMode= "singleTop"效果相同 。
- Intent.FLAG_ACTIVITY_CLEAR_TOP
使用 SingeTask 模式來啟動一個 Acitivity ,與指定 android : lanchuMode="singleTask"效果相同 。
- Intent.FlAG_ACTIVITY_NO_HISTORY
使用這種模式來啟動 Acitivity , 當(dāng)該 Activity 啟動其他 Activity 后,該 Activity 就消失了,不會保留在 Acitivity 棧中 。栗子 -- Activity 棧中有A-B,B以這種方式啟動 C ,C 也以這種方式啟動 D ,那么此時 Activity 棧中保留的 Acitivity 為 ABD。
Intent 匹配規(guī)則
- action
- action 是一個字符串 ,區(qū)別大小寫, 表明了將要執(zhí)行的動作 ( 包括啟動 Activity 的動作和接收廣播的標(biāo)準(zhǔn)動作)。
- 在 Intent 中必須包含 action ,而 category 不同 。
- 匹配規(guī)則中可以同時有多個action,但是Intent中的action只需與
其中之一相同即可匹配成功 。
- category
- 和 action 一樣是字符串 。
- 匹配規(guī)則中必須添加“android.intent.category.DEFAULT”這個過濾條件 。
Intent中可以不設(shè)置category,這個時候你在使用startActivity或者startActivityForResult的時候,
其實系統(tǒng)自動會為你添加1中的那個默認(rèn)category 。- Intent中可以同時設(shè)置多個category,一旦設(shè)置多個catrgory,
那么每個category都必須能夠和過濾條件中的某個category匹配成功 。
- data
- 表示操作數(shù)據(jù)的 URI 和 MIME 類型 。
- Intent中的data必須和過濾規(guī)則中的某一個data完全匹配 。
- 過濾規(guī)則中可以沒有指定URI,但是系統(tǒng)會賦予其默認(rèn)值:content和file 。