転送:http://blog.sina.com.cn/s/blog_4fd2a65a0101gg2o.html
オリジナル住所:http://my.eoe.cn/leigo/archive/2146.html 原作者:gaolei_xj
Androidのアプリケーションは、我々は多くの場合、リターンキーに対するユーザ操作を判断する必要が行っている、誤用を防ぐために、一般的には、ユーザーが2回連続リターンキーを押したときにアプリケーションを終了するかどうかを尋ねられます。
第1の基本原理はBACKキーが決定され、BACKボタンが押されたとき、にonKeyDownが捕捉され、実装されている、射出方法が実行されます。
射出工程において、第一決意値isExitは、偽の場合には、trueに設定されているであろう、また促され、偽この値に低減されるハンドラで、2000ミリ秒(2秒)の後にメッセージを送信しました。間隔の2秒以内に送信されたメッセージは、BACKボタンが再び押下された場合、終了方法は、この時間値isExitが真となって、再び離脱を行う方法が行われます。
package com.gaolei.exitdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.widget.Toast;
public class MainActivity extends Activity {
// 定义一个变量,来标识是否退出
private static boolean isExit = false;
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
isExit = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
private void exit() {
if (!isExit) {
isExit = true;
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
// 利用handler延迟发送更改状态信息
mHandler.sendEmptyMessageDelayed(0, 2000);
} else {
finish();
System.exit(0);
}
}
}
第二に、実装は、キーを達成するために、時間との時間差を記録することで計算されます。
package com.gaolei.exitdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
public class MainActivity extends Activity {
private long exitTime = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
public void exit() {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
}
上記のプログラムは、長押しは、リターンキーではなく、さらに長押しは、単にクリックするよりも少し長く押したときに、あなたのプログラムは、二回のKeyDown間違え動作します小さなバグになりますが実行されていますその後、プログラムを終了するには、exit()を呼び出します。
解決策は以下のとおりです。代わりには、OnKeyDown()関数のOnBackPressed()関数。OnBackPressed()関数がリターンキーリスナーの別の関数です。コードは以下の通りです
// 第一次按下返回键的时间
private long firstPressedTime;
/**
* 利用时间差方法,实现再按一次退出程序
* System.currentTimeMillis() 是当前系统的时间
*/
@Override
public void onBackPressed() {
if (System.currentTimeMillis() - firstPressedTime < 2000) {
super.onBackPressed();
} else {
Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
firstPressedTime = System.currentTimeMillis();
}
}
OnKeyDown()は、モニタ上の統一物理的なボタンであり、トリガ後も等、キーまたはメニューキーを返すどの物理ボタン、決定する必要があり、この方法は、Android 2.1アンドロイド1.0と互換性があり、従来の方法です。OnBackPressed()関数は、キーを監視し、プログラムを終了するために単独で返し、コードはシンプルかつエレガントですが、一つのことは、この方法が唯一のバージョン2.0以降のSDKに適用されることに注意すること。
参考:https://blog.csdn.net/ww897532167/article/details/53893340