Android實(shí)現(xiàn)長(zhǎng)按back鍵退出應(yīng)用程序的方法
本文實(shí)例講述了Android實(shí)現(xiàn)長(zhǎng)按back鍵退出應(yīng)用程序的方法。分享給大家供大家參考。具體分析如下:
最近在做一個(gè)Android上的應(yīng)用,碰到一個(gè)問(wèn)題就是如何實(shí)現(xiàn)長(zhǎng)按back鍵退出應(yīng)用程序。在網(wǎng)上查找了很多資料,發(fā)現(xiàn)幾乎沒(méi)有這樣的實(shí)現(xiàn),大部分在處理時(shí)是雙擊back鍵來(lái)退出應(yīng)用程序。參考了一下雙擊back鍵退出應(yīng)用程序的代碼,網(wǎng)上主流的一種方法是下面這種方法,實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單:
@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); }
從上面的代碼可以看出,采用的思路就是連續(xù)兩次點(diǎn)擊back鍵的時(shí)間間隔在2s以內(nèi),則認(rèn)為是雙擊,從而退出程序。
因此,借鑒上面的思路,我的最初想法是:可以重寫onKeyDown方法和onKeyUp方法,計(jì)算這執(zhí)行這兩個(gè)方法之間的時(shí)間間隔,如果大于2s,則認(rèn)為是長(zhǎng)按,從而退出程序;否則,則執(zhí)行back鍵原有的響應(yīng)。按照這個(gè)思路:
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("確認(rèn)退出嗎?"); builder.setTitle("提示"); builder.setPositiveButton("確認(rèn)",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); }
然而,這樣能夠?qū)崿F(xiàn)長(zhǎng)按back鍵退出程序,但是非長(zhǎng)按back鍵的時(shí)候,點(diǎn)擊back則失效了,查找了很多Android 按鍵事件分發(fā)和處理機(jī)制方面的資料,還是沒(méi)弄清楚原因(后面有時(shí)間再研究)。于是考慮換一種思路去處理,考慮去重寫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()) //這句很重要,判斷事件是否是長(zhǎng)按事件 { AlertDialog.Builder builder = new Builder(MainActivity.this); builder.setMessage("確認(rèn)退出嗎?"); builder.setTitle("提示"); builder.setPositiveButton("確認(rèn)",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); //如果不是長(zhǎng)按,則調(diào)用原有方法,執(zhí)行按下back鍵應(yīng)有的處理 default: break; } return super.dispatchKeyEvent(event); }
最后通過(guò)重寫dispatchKeyEvent方法實(shí)現(xiàn)了長(zhǎng)按back鍵退出程序,而且沒(méi)有屏蔽掉原有的非長(zhǎng)按back鍵功能。
希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android的webview支持HTML5的離線應(yīng)用功能詳細(xì)配置
HTML5的離線應(yīng)用功能可以使得WebApp即使在網(wǎng)絡(luò)斷開(kāi)的情況下仍能正常使用這是個(gè)非常有用的功能,但如何使Webivew支持HTML5離線應(yīng)用功能呢,需要的朋友可以參考下2012-12-12android實(shí)現(xiàn)微信朋友圈發(fā)布動(dòng)態(tài)功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)微信朋友圈發(fā)布動(dòng)態(tài)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03Android實(shí)現(xiàn)類似iOS分欄控制器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)類似iOS分欄控制器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03強(qiáng)制Android應(yīng)用使用某個(gè)Locale的方法
這篇文章主要介紹了強(qiáng)制Android應(yīng)用使用某個(gè)Locale的方法,涉及Android基于Locale進(jìn)行語(yǔ)言設(shè)置的相關(guān)技巧,需要的朋友可以參考下2015-10-10Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng)的小兔子
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng)的小兔子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Android對(duì)話框AlertDialog與DatePickerDialog及TimePickerDialog使用詳解
這篇文章主要介紹了Android對(duì)話框中的提醒對(duì)話框AlertDialog、日期對(duì)話框DatePickerDialog、時(shí)間對(duì)話框TimePickerDialog使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09Android學(xué)習(xí)教程之懸浮窗菜單制作(9)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之懸浮窗菜單制作方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android強(qiáng)制下線功能實(shí)現(xiàn)的代碼示例
本篇文章主要介紹了Android強(qiáng)制下線功能實(shí)現(xiàn)的代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02