這次做安卓端的app共遇到兩個(gè)按鍵問題。
一、使用TabActivity的主頁面需要監(jiān)聽返回事件,實(shí)現(xiàn)返回鍵與home鍵一樣的效果。
1、首先先查出觸發(fā)home鍵的效果需要調(diào)用的代碼如下:
Intent intent=newIntent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//如果是服務(wù)里調(diào)用,必須加入new task標(biāo)識(shí)
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
2、緊接著查找監(jiān)聽返回事件的方法,有如下兩種:
@Override
public booleanonKeyDown(intkeyCode, KeyEvent event) {
? ? ? ? if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
? ? ? ? ? ? ? ? ?//這里寫下監(jiān)聽到返回事件以后的操作
? ? ? ? ? ? ? ? ?return false;
? ? ? ? ?} else {
? ? ? ? ? ? ? ? return super.onKeyDown(keyCode, event);
? ? ? ? ?}
? }
或者
@Override
public voidonBackPressed() {
? ? ? //這里寫下監(jiān)聽到返回事件以后的操作
? ? ? ? super.onBackPressed();
}
然而實(shí)際運(yùn)行測(cè)試的時(shí)候發(fā)現(xiàn),這兩個(gè)函數(shù)始終沒有被調(diào)用,去搜了下才知道原來是TabActivity與常規(guī)的按鍵監(jiān)聽事件是有沖突,于是找到了新的替代方案,如下:
@Override
public booleandispatchKeyEvent(KeyEvent event) {
? ? ? ? if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){ //這里監(jiān)聽返回按鈕點(diǎn)擊事件
? ? ? ? ? ? ? ? if(event.getAction() == KeyEvent.ACTION_DOWN&& event.getRepeatCount() ==0) {
? ? ? ? ? ? ? ? ? ? ? ? ? //在這里調(diào)用返回鍵需要實(shí)現(xiàn)的功能(上面的判斷使代碼只執(zhí)行一次)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return false;
? ? ? ? } else {
? ? ? ? ? ? ? ? return super.dispatchKeyEvent(event);
? ? ? ? }
}
二、第二個(gè)問題是客戶反饋第一次安裝app時(shí),home鍵無效?!
? ? ? 于是測(cè)試過聯(lián)想,華為,魅族,三星,紅米等品牌手機(jī)發(fā)現(xiàn),除了紅米手機(jī),模擬器,其他品牌的手機(jī)都存在第一次安裝app時(shí),點(diǎn)擊home鍵回到桌面再點(diǎn)擊桌面icon時(shí)候,都會(huì)再次啟動(dòng)一個(gè)app,如果是從菜單再次點(diǎn)擊進(jìn)入,或者app完全退出后就不存在這樣的問題。
嘗試了網(wǎng)上各個(gè)版本的解決方案都無效,最終確定的一個(gè)解決方案和原因如下:
大致查到原因是,利用程序安裝器打開程序來啟動(dòng)的Intent沒有Category,而我們打開程序帶了Category。所以可以通過判斷有無Category來決定當(dāng)前頁面是否是啟動(dòng)頁。把代碼下面這段代碼寫入啟動(dòng)頁的onCreate(Bundle savedInstanceState)方法,super.onCreate(savedInstanceState);的下一行:
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=0){
? ? ? ? finish();
? ? ? ? return;
}
以上。