//连续按两次才退出应用
@Override
public void onBackPressed() {
if (exit) {
//回到桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
} else {
CommonUtils.showToast(context,"再按一次退出应用", Toast.LENGTH_LONG);
exit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, 2 * 1000);
}
}
其中exit为这个类的全局变量。
说到强制更新,我首先想到的是使用dialog,使其不能消失,除非他点击下载安装了新版本。
setCanceledOnTouchOutside(false):点击区域外dialog不消失,
setCancelable(false):点击物理返回按钮dialog不消失。
但需求是点击物理返回键两次,也要退出应用。
这里就需要注意了,因为dialog在最上层,所以下方的activity是可见而不可操作的,所以是不会经过onBackPressed()和onKeyDown()方法的。但是我们可以监听dialog的事件(dialog也是context),dialog.setOnKeyListener()。
new AlertDialogWrapper.Builder(context)
.setTitle("有新版本发布!")
.setMessage("是否下载最新版安装包?")
.setPositiveButton("立即体验", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
//下载操作
......
}
})
.setNegativeButton("退出应用", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
//回到桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
})
.setCancelable(false)
.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_UP) {
if (exit) {
dialog.dismiss();
//回到桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
return true;
} else {
CommonUtils.showToast(context,"再按一次退出应用",Toast.LENGTH_LONG);
exit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, 2 * 1000);
return false;
}
} else {
return false;
}
}
})
.show();
这里注意是
keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_UP
这里我引用了关于dialog的第三方的框架
compile 'com.github.afollestad.material-dialogs:core:0.8.5.8'
可能还需要注意的在检查更新的页面的onRestart()方法中再次检查是否有新版本。因为,退出应用后再次打开这个应用(直接到了这个页面)时dialog已经消失了(dialog不可见时其生命周期也消失了)。
最后,还有问题,当我点击“立即体验”时dialog会消失,也就是我如果只下载(甚至不下载,断网)不安装也能使用应用,并达不到强制新版本的作用。(因为我开启了新的context(即使是service),所以dialog的生命周期结束了?)