Android 關於長按back鍵退出應用程序的實現

          Android 關於長按back鍵退出應用程序的實現

最近在做一個Android上的應用,碰到一個問題就是如何實現長按back鍵退出應用程序。在網上查找了很多資料,發現幾乎沒有這樣的實現,大部分在處理時是雙擊back鍵來退出應用程序。參考了一下雙擊back鍵退出應用程序的代碼,網上主流的一種方法是下面這種方法,實現起來比較簡單:

複製代碼
//代碼來自:http://www.devdiv.com/home.php?mod=space&uid=67600&do=blog&id=7024
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
      if (keyCode == KeyEvent.KEYCODE_BACK) 
      {
        if ((System.currentTimeMillis() - mExitTime) > 2000) 
        {
          mHelperUtils.showToast(mContext, R.string.exit_content);
          mExitTime = System.currentTimeMillis();
        }
        else 
        {
          finish();
        }
        return true;
      }
      return super.onKeyDown(keyCode, event);
    }
複製代碼

   從上面的代碼可以看出,採用的思路就是連續兩次點擊back鍵的時間間隔在2s以內,則認爲是雙擊,從而退出程序。

   因此,借鑑上面的思路,我的最初想法是:可以重寫onKeyDown方法和onKeyUp方法,計算這執行這兩個方法之間的時間間隔,如果大於2s,則認爲是長按,從而退出程序;否則,則執行back鍵原有的響應。按照這個思路:

複製代碼
public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
        if (keyCode == KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0) 
        { 
            start=System.currentTimeMillis(); 
            Log.e("start",String.valueOf(start));
            return false; 
        } 
        
        return super.onKeyDown(keyCode, event);
    } 
    
    public boolean onKeyUp(int keyCode,KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_BACK &&event.getRepeatCount()==0) 
        { 
            end=System.currentTimeMillis(); 
            Log.e("end",String.valueOf(end));
            
            if(start!=-1&&(end-start)>2000)
            {
                AlertDialog.Builder builder = new Builder(MainActivity.this);
                builder.setMessage("確認退出嗎?");
                builder.setTitle("提示");
                builder.setPositiveButton("確認",new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog,int which)
                    {
                        dialog.dismiss();
                        MainActivity.this.finish();
                        System.exit(0);
                    }
                });

                builder.setNegativeButton("取消",new DialogInterface.OnClickListener() 
                {
                    public void onClick(DialogInterface dialog,int which) 
                    {
                        dialog.dismiss();
                    }
                });
                builder.create().show();
                return true;
            }
            else
            {
                
                return super.onKeyUp(keyCode, event);
            }
        }
        return super.onKeyUp(keyCode, event);
    }
複製代碼

  然而,這樣能夠實現長按back鍵退出程序,但是非長按back鍵的時候,點擊back則失效了,查找了很多Android 按鍵事件分發和處理機制方面的資料,還是沒弄清楚原因(後面有時間再研究)。於是考慮換一種思路去處理,考慮去重寫Activity中的dispatchKeyEvent方法。

複製代碼
public boolean dispatchKeyEvent(KeyEvent event)
   {
        int keyCode=event.getKeyCode();
        //Log.e("start",String.valueOf(start));
        switch(keyCode)
        {
            case KeyEvent.KEYCODE_BACK:
            if(event.isLongPress())   //這句很重要,判斷事件是否是長按事件
              {
                AlertDialog.Builder builder = new Builder(MainActivity.this);
                builder.setMessage("確認退出嗎?");
                builder.setTitle("提示");
                builder.setPositiveButton("確認",new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog,int which)
                    {
                        dialog.dismiss();
                        MainActivity.this.finish();
                        System.exit(0);
                    }
                });

                builder.setNegativeButton("取消",new DialogInterface.OnClickListener() 
                {
                    public void onClick(DialogInterface dialog,int which) 
                    {
                        dialog.dismiss();
                    }
                });
                builder.create().show();
                return true;
            }
            return super.dispatchKeyEvent(event);  //如果不是長按,則調用原有方法,執行按下back鍵應有的處理
            default:
                break;
        }
        return super.dispatchKeyEvent(event);
    }
複製代碼

  最後通過重寫dispatchKeyEvent方法實現了長按back鍵退出程序,而且沒有屏蔽掉原有的非長按back鍵功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章