Android實(shí)現(xiàn)長按back鍵退出應(yīng)用程序的方法
本文實(shí)例講述了Android實(shí)現(xiàn)長按back鍵退出應(yīng)用程序的方法。分享給大家供大家參考。具體分析如下:
最近在做一個(gè)Android上的應(yīng)用,碰到一個(gè)問題就是如何實(shí)現(xiàn)長按back鍵退出應(yīng)用程序。在網(wǎng)上查找了很多資料,發(fā)現(xiàn)幾乎沒有這樣的實(shí)現(xiàn),大部分在處理時(shí)是雙擊back鍵來退出應(yīng)用程序。參考了一下雙擊back鍵退出應(yīng)用程序的代碼,網(wǎng)上主流的一種方法是下面這種方法,實(shí)現(xià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í)行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)長按back鍵退出程序,但是非長按back鍵的時(shí)候,點(diǎn)擊back則失效了,查找了很多Android 按鍵事件分發(fā)和處理機(jī)制方面的資料,還是沒弄清楚原因(后面有時(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())
//這句很重要,判斷事件是否是長按事件
{
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);
//如果不是長按,則調(diào)用原有方法,執(zhí)行按下back鍵應(yīng)有的處理
default:
break;
}
return super.dispatchKeyEvent(event);
}
最后通過重寫dispatchKeyEvent方法實(shí)現(xiàn)了長按back鍵退出程序,而且沒有屏蔽掉原有的非長按back鍵功能。
希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
android顯示TextView文字的倒影效果實(shí)現(xiàn)代碼
這篇文章主要介紹了android顯示TextView文字的倒影效果實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-02-02
AndroidQ(10)黑暗模式適配的實(shí)現(xiàn)
這篇文章主要介紹了AndroidQ(10)黑暗模式適配的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Android自定義View的三種實(shí)現(xiàn)方式總結(jié)
本篇文章主要介紹了Android自定義View的三種實(shí)現(xiàn)方式總結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-02-02
Android?Studio實(shí)現(xiàn)彈窗設(shè)置
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)彈窗設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android Studio如何獲取SQLite數(shù)據(jù)并顯示到ListView上
這篇文章主要介紹了Android Studio獲取SQLite數(shù)據(jù)并顯示到ListView上,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android編程實(shí)現(xiàn)切換imageView的方法分析
這篇文章主要介紹了Android編程實(shí)現(xiàn)切換imageView的方法,結(jié)合具體實(shí)例形式分析了切換imageView的相關(guān)設(shè)置技巧與注意事項(xiàng),需要的朋友可以參考下2017-09-09

