如何在Android中防止意外应用程序退出?
IE:当他/她按下后退按钮并到达BackStack中的最后一个活动时,显示一个toast,询问用户是否想要使用onBackPressed()方法退出。
此外,它需要使用backStacks来处理片段。
答案 0 :(得分:2)
通过覆盖主要活动的onBackPressed()方法可以轻松实现此功能。在此示例中,当用户按下后退按钮时,应用程序将显示一个4秒的祝酒词,此时新的后退按钮会立即终止该应用程序。
您可以将它放在扩展Activity的BaseActivity中,如下所示:
public class BaseActivity extends Activity{
private Toast toast;
private long lastBackPressTime = 0;
. . .
/**
* Prevent accidental app exit by requiring users to press back twice when
* the app is exiting w/in 4sec
*/
@Override
public void onBackPressed() {
if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
toast = Toast.makeText(this, "Press back again to close this app", 4000);
toast.show();
this.lastBackPressTime = System.currentTimeMillis();
} else {
if (toast != null) {
toast.cancel();
}
super.onBackPressed();
}
}
. . .
}
编辑:增加碎片反向兼容性
为了检测bacstack中的最后一个片段,应用程序只使用片段,我强烈建议将dispatchKeyEvents放在BaseActivity类中并实现上述方法,如下所示:
public class BaseActivity extends Activity {
public boolean dispatchKeyEvent(KeyEvent event) {
int backCount = getFragmentManager().getBackStackEntryCount();
int action = event.getAction();
int keyCode = event.getKeyCode();
FragmentManager fm = getFragmentManager();
. . .
case KeyEvent.KEYCODE_BACK :
if (action == KeyEvent.ACTION_DOWN && backCount == 0) {
onexitNotify();
}else {
fm.popBackStack();
}
return true;
default :
return super.dispatchKeyEvent(event);
}
}
/**
* Prevent accidental app exit by requiring users to press back twice when
* the app is exiting w/in 8sec
*/
private Toast toast;
private long lastBackPressTime = 0;
public void onexitNotify() {
if (this.lastBackPressTime < System.currentTimeMillis() - 8000) {
toast = Toast.makeText(this, "Press back again to close this app", 8000);
toast.show();
this.lastBackPressTime = System.currentTimeMillis();
} else {
if (toast != null) {
toast.cancel();
}
super.onBackPressed();
}
}
}
*如果您使用的是2.0+,onBackPressed()可以简化所需的代码量,因此不需要onKeyDown()。
Per androd模式推荐:
某些应用程序在即将退出时会提示用户。这似乎是 在游戏应用中尤为常见。这种做法不是 在正常应用中推荐。确认提示会 扰乱用户的正常工作流程。即使在使用此选项的游戏中也应该 要经过深思熟虑。
答案 1 :(得分:0)
您可以在应用的主要活动中检查何时按下后退键。然后,您可以向用户显示alertdialog以确认退出。
public boolean onKeyDown(int keyCode, KeyEvent event) {
//Handle the back button
if(keyCode == KeyEvent.KEYCODE_BACK) {
checkExit();
return true;
}
else {
return super.onKeyDown(keyCode, event);
}
}
private void checkExit()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//take actions here accordingly as the user has pressed yes
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}