介绍:
在各家app的退出机制中,一般如三种退出机制:退回桌面(实际并没有退出),弹出退出确认框,连续两次返回键退出。
实现方案:
1.退回桌面
Kotlin代码:
override fun onBackPressed() {
goBackToDesktop()
}
/**
* 用户在主界面,按返回键直接返回桌面,而不退出
*/
private fun goBackToDesktop() {
val pm = packageManager
if (null == pm) {
finish()
return
}
val homeInfo = pm!!.resolveActivity(
Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME), 0
)
if (null == homeInfo) {
finish()
return
}
val ai = homeInfo!!.activityInfo
val startIntent = Intent(Intent.ACTION_MAIN)
startIntent.addCategory(Intent.CATEGORY_LAUNCHER)
startIntent.component = ComponentName(
ai.packageName,
ai.name
)
startActivitySafely(startIntent)
}
private fun startActivitySafely(intent: Intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
startActivity(intent)
} catch (e: Exception) {
finish()
} catch (e: Error) {
finish()
}
}
Java代码:
@Override
public void onBackPressed() {
goBackToDesktop();
}
/**
* 用户在主界面,按返回键直接返回桌面,而不退出
*/
private void goBackToDesktop() {
PackageManager pm = getPackageManager();
if (null == pm) {
finish();
return;
}
ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME), 0);
if (null == homeInfo) {
finish();
return;
}
ActivityInfo ai = homeInfo.activityInfo;
Intent startIntent = new Intent(Intent.ACTION_MAIN);
startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
startIntent.setComponent(new ComponentName(ai.packageName,
ai.name));
startActivitySafely(startIntent);
}
private void startActivitySafely(Intent intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (Exception e) {
finish();
} catch (Error e) {
finish();
}
}
2.弹出退出确认框
public void onBackPressed() {
showExitConfirmDialog();
}
/**
* 用户在主界面按返回键,会弹出退出确认框
*/
private void showExitConfirmDialog() {
new AlertDialog.Builder(this)
.setTitle("确认退出")
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton("取消", null)
.show();
}
3.连续两次返回键退出
private long exitTime = 0;
public void onBackPressed() {
doubleBackQuit();
}
/**
* 连续按两次返回键,退出应用
*/
private void doubleBackQuit()
{
if (System.currentTimeMillis() - exitTime > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
}
}