java - 单击后退按钮两次以退出活动

我最近在很多Android应用和游戏中都注意到了这种模式:当点击后退按钮“退出”应用程序时,Toast会出现类似于“请再次单击BACK退出”的消息。

我想知道,因为我越来越频繁地看到它是一个内置的功能,你可以以某种方式访问活动? 我查看了许多类的源代码,但我似乎无法找到任何相关内容。

当然,我可以考虑几种方法来轻松实现相同的功能(最容易的是在活动中保留一个布尔值,表明用户是否已经点击过一次......)但是我想知道这里是否有东西。

编辑:正如@LAS_VEGAS所说,我并不是指传统意义上的“退出”。 (即终止)我的意思是“回到应用程序启动活动启动之前打开的任何东西”,如果这是有意义的:)

30个解决方案

774 votes

在Java活动中:

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

}

在Kotlin活动中:

private var doubleBackToExitPressedOnce = false

override fun onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed()

return

}

this.doubleBackToExitPressedOnce = true

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show()

Handler().postDelayed(Runnable { doubleBackToExitPressedOnce = false }, 2000)

}

我认为这个处理程序有助于在2秒后重置变量。

Sudheesh B Nair answered 2019-02-10T14:41:02Z

192 votes

Sudheesh B Nair在这个问题上有一个很好的(并且被接受的)答案,我认为应该有一个更好的选择,例如;

测量时间过去并检查自上次反压后是否经过了Toast毫秒(比如说2000),这有什么问题。 以下示例代码使用mExitToast来存储时间mExitToast.cancel();被调用;

private static final int TIME_INTERVAL = 2000; // # milliseconds, desired time passed between two back presses.

private long mBackPressed;

@Override

public void onBackPressed()

{

if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())

{

super.onBackPressed();

return;

}

else { Toast.makeText(getBaseContext(), "Tap back button in order to exit", Toast.LENGTH_SHORT).show(); }

mBackPressed = System.currentTimeMillis();

}

回到接受的答案批评; 使用Toast来指示它是否在最后Toast(比如2000)毫秒并且设置 - 重置是通过mExitToast的mExitToast.cancel();方法是我的第一件事。 但是当活动结束时,应该取消super.onBackPressed();操作,删除Runnable。

为了删除Toast,它不能被声明为匿名,并且与mExitToast一起被声明为成员。 然后可以适当地调用mExitToast.cancel();的方法super.onBackPressed();。

以下示例是演示;

private boolean doubleBackToExitPressedOnce;

private Handler mHandler = new Handler();

private final Runnable mRunnable = new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce = false;

}

};

@Override

protected void onDestroy()

{

super.onDestroy();

if (mHandler != null) { mHandler.removeCallbacks(mRunnable); }

}

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

mHandler.postDelayed(mRunnable, 2000);

}

感谢@NSouth的贡献; 为了防止即使在申请被关闭后出现吐司消息,Toast可以被宣布为会员 - 比如mExitToast - 并且可以在super.onBackPressed();之前通过mExitToast.cancel();取消。

Saro Taşciyan answered 2019-02-10T14:42:05Z

28 votes

我想我最后会分享我是如何做到的,我刚刚在我的活动中加入:

private boolean doubleBackToExitPressedOnce = false;

@Override

protected void onResume() {

super.onResume();

// .... other stuff in my onResume ....

this.doubleBackToExitPressedOnce = false;

}

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, R.string.exit_press_back_twice_message, Toast.LENGTH_SHORT).show();

}

它完全符合我的要求。 包括恢复活动时的状态重置。

Guillaume answered 2019-02-10T14:42:42Z

24 votes

流程图:

Java代码:

private long lastPressedTime;

private static final int PERIOD = 2000;

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

switch (event.getAction()) {

case KeyEvent.ACTION_DOWN:

if (event.getDownTime() - lastPressedTime < PERIOD) {

finish();

} else {

Toast.makeText(getApplicationContext(), "Press again to exit.",

Toast.LENGTH_SHORT).show();

lastPressedTime = event.getEventTime();

}

return true;

}

}

return false;

}

vHow answered 2019-02-10T14:43:18Z

17 votes

所有这些答案中都有最简单的方法。

只需在back_pressed方法中编写以下代码即可。

long back_pressed;

@Override

public void onBackPressed() {

if (back_pressed + 1000 > System.currentTimeMillis()){

super.onBackPressed();

}

else{

Toast.makeText(getBaseContext(),

"Press once again to exit!", Toast.LENGTH_SHORT)

.show();

}

back_pressed = System.currentTimeMillis();

}

您需要在活动中将back_pressed对象定义为long。

Chintan Rathod answered 2019-02-10T14:43:59Z

12 votes

根据正确的答案和评论中的建议,我创建了一个完全正常的演示,并在使用后删除处理程序回调。

MainActivity.java

package com.mehuljoisar.d_pressbacktwicetoexit;

import android.os.Bundle;

import android.os.Handler;

import android.app.Activity;

import android.widget.Toast;

public class MainActivity extends Activity {

private static final long delay = 2000L;

private boolean mRecentlyBackPressed = false;

private Handler mExitHandler = new Handler();

private Runnable mExitRunnable = new Runnable() {

@Override

public void run() {

mRecentlyBackPressed=false;

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

@Override

public void onBackPressed() {

//You may also add condition if (doubleBackToExitPressedOnce || fragmentManager.getBackStackEntryCount() != 0) // in case of Fragment-based add

if (mRecentlyBackPressed) {

mExitHandler.removeCallbacks(mExitRunnable);

mExitHandler = null;

super.onBackPressed();

}

else

{

mRecentlyBackPressed = true;

Toast.makeText(this, "press again to exit", Toast.LENGTH_SHORT).show();

mExitHandler.postDelayed(mExitRunnable, delay);

}

}

}

我希望它会有所帮助!!

Mehul Joisar answered 2019-02-10T14:44:38Z

11 votes

我使用snackbar的解决方案:

LinearLayout mLayout;

Snackbar mSnackbar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mLayout = findViewById(R.id.layout_main);

mSnackbar = Snackbar.make(mLayout, R.string.press_back_again, Snackbar.LENGTH_SHORT);

}

@Override

public void onBackPressed() {

if (mSnackbar.isShown()) {

super.onBackPressed();

} else {

mSnackbar.show();

}

}

简约时尚。

Hugo Castelani answered 2019-02-10T14:45:11Z

10 votes

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

声明Variableprivate boolean doubleBackToExitPressedOnce = false;

将其粘贴到您的主要活动中,这将解决您的问题

Rakshith answered 2019-02-10T14:45:47Z

9 votes

退出应用程序时使用Runnable不是一个好主意,我最近想出了一种更简单的方法来记录和比较两个BACK按钮点击之间的时间。 示例代码如下:

private static long back_pressed_time;

private static long PERIOD = 2000;

@Override

public void onBackPressed()

{

if (back_pressed_time + PERIOD > System.currentTimeMillis()) super.onBackPressed();

else Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();

back_pressed_time = System.currentTimeMillis();

}

这样就可以通过双重BACK按钮在一定的延迟时间内点击退出应用程序,该延迟时间为2000毫秒。

Max Lee answered 2019-02-10T14:46:22Z

6 votes

它不是内置功能。 我认为这甚至不是推荐的行为。 Android应用无意退出:

为什么Android应用程序不提供“退出”选项?

Caner answered 2019-02-10T14:46:58Z

6 votes

已接受的答案是最佳答案,但如果您使用的是SnackBar,那么您可以使用SnackBar获得更好的视图。

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Snackbar.make(findViewById(R.id.photo_album_parent_view), "Please click BACK again to exit", Snackbar.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

}

Pratik Butani answered 2019-02-10T14:47:26Z

6 votes

为MainActivity类声明一个全局Toast变量。 例如:Toast exitToast;

在onCreate视图方法中初始化它。 例:  exitToast = Toast.makeText(getApplicationContext(),“再按一次退出”,Toast.LENGTH_SHORT);

最后创建一个onBackPressedMethod作为Follows:

@Override

public void onBackPressed() {

if (exitToast.getView().isShown()) {

exitToast.cancel();

finish();

} else {

exitToast.show();

}

}

这个工作正常,我已经测试过。 我认为这更简单。

Supto answered 2019-02-10T14:48:21Z

4 votes

Zefnus使用System.currentTimeMillis()的答案是最好的(+1)。 我这样做的方式并不比这更好,但仍然发布它以增加上述想法。

如果按下后退按钮时看不到吐司,则显示吐司,而如果可见(背面已在最后Toast.LENGTH_SHORT时间内按下一次),则退出。

exitToast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT);

.

.

@Override

public void onBackPressed() {

if (exitToast.getView().getWindowToken() == null) //if toast is currently not visible

exitToast.show(); //then show toast saying 'press againt to exit'

else { //if toast is visible then

finish(); //or super.onBackPressed();

exitToast.cancel();

}

}

Kartik answered 2019-02-10T14:48:59Z

4 votes

最近,我需要在我的应用程序中实现这个后退按钮功能。 原始问题的答案很有用,但我还要考虑两点:

在某些时间点,后退按钮被禁用

主要活动是将碎片与后堆叠结合使用

根据答案和评论,我创建了以下代码:

private static final long BACK_PRESS_DELAY = 1000;

private boolean mBackPressCancelled = false;

private long mBackPressTimestamp;

private Toast mBackPressToast;

@Override

public void onBackPressed() {

// Do nothing if the back button is disabled.

if (!mBackPressCancelled) {

// Pop fragment if the back stack is not empty.

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {

super.onBackPressed();

} else {

if (mBackPressToast != null) {

mBackPressToast.cancel();

}

long currentTimestamp = System.currentTimeMillis();

if (currentTimestamp < mBackPressTimestamp + BACK_PRESS_DELAY) {

super.onBackPressed();

} else {

mBackPressTimestamp = currentTimestamp;

mBackPressToast = Toast.makeText(this, getString(R.string.warning_exit), Toast.LENGTH_SHORT);

mBackPressToast.show();

}

}

}

}

上面的代码假定使用了支持库。 如果您使用片段但不使用支持库,则需要将onBackPressed替换为if。

如果永远不会取消后退按钮,请删除第一个onBackPressed。 如果您不使用片段或片段后栈,请删除第二个if

此外,重要的是要注意自Android 2.0以来支持方法onBackPressed。 请查看此页面以获取详细说明。 要使背压功能也适用于旧版本,请将以下方法添加到您的活动中:

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR

&& keyCode == KeyEvent.KEYCODE_BACK

&& event.getRepeatCount() == 0) {

// Take care of calling this method on earlier versions of

// the platform where it doesn't exist.

onBackPressed();

}

return super.onKeyDown(keyCode, event);

}

Tomasz Nguyen answered 2019-02-10T14:50:12Z

4 votes

我知道这是一个非常古老的问题,但这是做你想做的最简单的方法。

@Override

public void onBackPressed() {

++k; //initialise k when you first start your activity.

if(k==1){

//do whatever you want to do on first click for example:

Toast.makeText(this, "Press back one more time to exit", Toast.LENGTH_LONG).show();

}else{

//do whatever you want to do on the click after the first for example:

finish();

}

}

我知道这不是最好的方法,但它工作正常!

Chris Rohit Brendan answered 2019-02-10T14:50:49Z

3 votes

当您将先前的堆栈活动存储在堆栈中时,这也会有所帮助。

我修改了Sudheesh的答案

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

//super.onBackPressed();

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***

startActivity(intent);

finish();

System.exit(0);

return;

}

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

}

Arpit Patel answered 2019-02-10T14:51:25Z

2 votes

@Override public void onBackPressed() {

Log.d("CDA", "onBackPressed Called");

Intent intent = new Intent();

intent.setAction(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

startActivity(intent);

}

Aditya_Android answered 2019-02-10T14:51:46Z

2 votes

为此,我实现了以下功能:

private long onRecentBackPressedTime;

@Override

public void onBackPressed() {

if (System.currentTimeMillis() - onRecentBackPressedTime > 2000) {

onRecentBackPressedTime = System.currentTimeMillis();

Toast.makeText(this, "Please press BACK again to exit", Toast.LENGTH_SHORT).show();

return;

}

super.onBackPressed();

}

Bu Ti answered 2019-02-10T14:52:14Z

2 votes

这是完整的工作代码。 并且不要忘记删除回调,以免它在应用程序中导致内存泄漏。:)

private boolean backPressedOnce = false;

private Handler statusUpdateHandler;

private Runnable statusUpdateRunnable;

public void onBackPressed() {

if (backPressedOnce) {

finish();

}

backPressedOnce = true;

final Toast toast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT);

toast.show();

statusUpdateRunnable = new Runnable() {

@Override

public void run() {

backPressedOnce = false;

toast.cancel(); //Removes the toast after the exit.

}

};

statusUpdateHandler.postDelayed(statusUpdateRunnable, 2000);

}

@Override

protected void onDestroy() {

super.onDestroy();

if (statusUpdateHandler != null) {

statusUpdateHandler.removeCallbacks(statusUpdateRunnable);

}

}

Saket Kumar answered 2019-02-10T14:52:41Z

2 votes

在这里,我已经概括地编写了N个抽头计数的代码。 该代码类似于Android设备手机中的Enable Developer选项编写。 即使您可以在开发人员测试应用程序时使用此功能来启用功能。

private Handler tapHandler;

private Runnable tapRunnable;

private int mTapCount = 0;

private int milSecDealy = 2000;

onCreate(){

...

tapHandler = new Handler(Looper.getMainLooper());

}

在backpress或logout选项上调用askToExit()。

private void askToExit() {

if (mTapCount >= 2) {

releaseTapValues();

/* ========= Exit = TRUE ========= */

}

mTapCount++;

validateTapCount();

}

/* Check with null to avoid create multiple instances of the runnable */

private void validateTapCount() {

if (tapRunnable == null) {

tapRunnable = new Runnable() {

@Override

public void run() {

releaseTapValues();

/* ========= Exit = FALSE ========= */

}

};

tapHandler.postDelayed(tapRunnable, milSecDealy);

}

}

private void releaseTapValues() {

/* Relase the value */

if (tapHandler != null) {

tapHandler.removeCallbacks(tapRunnable);

tapRunnable = null; /* release the object */

mTapCount = 0; /* release the value */

}

}

@Override

protected void onDestroy() {

super.onDestroy();

releaseTapValues();

}

Chintan Khetiya answered 2019-02-10T14:53:16Z

2 votes

当HomeActivity包含导航抽屉和双backPressed()功能退出应用程序时。(不要忘记初始化全局变量boolean doubleBackToExitPressedOnce = false;)2秒后新的处理程序将doubleBackPressedOnce变量设置为false

@Override

public void onBackPressed() {

DrawerLayout drawer = findViewById(R.id.drawer_layout);

if (drawer.isDrawerOpen(GravityCompat.END)) {

drawer.closeDrawer(GravityCompat.END);

} else {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

moveTaskToBack(true);

return;

} else {

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce = false;

}

}, 2000);

}

}

}

Abhishek S answered 2019-02-10T14:53:47Z

2 votes

在java中

private Boolean exit = false;

if (exit) {

onBackPressed();

}

@Override

public void onBackPressed() {

if (exit) {

finish(); // finish activity

} else {

Toast.makeText(this, "Press Back again to Exit.",

Toast.LENGTH_SHORT).show();

exit = true;

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

exit = false;

}

}, 3 * 1000);

}

}

在kotlin

private var exit = false

if (exit) {

onBackPressed()

}

override fun onBackPressed(){

if (exit){

finish() // finish activity

}else{

Toast.makeText(this, "Press Back again to Exit.",

Toast.LENGTH_SHORT).show()

exit = true

Handler().postDelayed({ exit = false }, 3 * 1000)

}

}

Praveen P answered 2019-02-10T14:54:24Z

1 votes

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Snackbar.make(findViewById(R.id.photo_album_parent_view), "Please click BACK again to exit", Snackbar.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

}

maniix answered 2019-02-10T14:54:46Z

1 votes

在Sudheesh B Nair的答案中有一些改进,我注意到它会等待处理程序,即使在立即按下两次,所以取消处理程序,如下所示。 我也有tocled toast以防止它在app退出后显示。

boolean doubleBackToExitPressedOnce = false;

Handler myHandler;

Runnable myRunnable;

Toast myToast;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

myHandler.removeCallbacks(myRunnable);

myToast.cancel();

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

myToast = Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT);

myToast.show();

myHandler = new Handler();

myRunnable = new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce = false;

}

};

myHandler.postDelayed(myRunnable, 2000);

}

Divyang Panchal answered 2019-02-10T14:55:16Z

1 votes

我认为比Zefnus稍微好一点的方法。 只调用一次System.currentTimeMillis()并省略return;:

long previousTime;

@Override

public void onBackPressed()

{

if (2000 + previousTime > (previousTime = System.currentTimeMillis()))

{

super.onBackPressed();

} else {

Toast.makeText(getBaseContext(), "Tap back button in order to exit", Toast.LENGTH_SHORT).show();

}

}

Khoa Chu Anh answered 2019-02-10T14:55:47Z

1 votes

这与已接受和最多投票的回复相同,但是这个剪辑使用了Snackbar而不是Toast。

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Snackbar.make(content, "Please click BACK again to exit", Snackbar.LENGTH_SHORT)

.setAction("Action", null).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

}

MobileOS answered 2019-02-10T14:56:18Z

1 votes

在我的情况下,我依靠Snackbar#isShown()获得更好的UX。

private Snackbar exitSnackBar;

@Override

public void onBackPressed() {

if (isNavDrawerOpen()) {

closeNavDrawer();

} else if (getSupportFragmentManager().getBackStackEntryCount() == 0) {

if (exitSnackBar != null && exitSnackBar.isShown()) {

super.onBackPressed();

} else {

exitSnackBar = Snackbar.make(

binding.getRoot(),

R.string.navigation_exit,

2000

);

exitSnackBar.show();

}

} else {

super.onBackPressed();

}

}

Kasim Rangwala answered 2019-02-10T14:56:49Z

1 votes

对于具有导航抽屉的活动,请对OnBackPressed()使用以下代码

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

if (drawer.isDrawerOpen(GravityCompat.START)) {

drawer.closeDrawer(GravityCompat.START);

} else {

if (doubleBackToExitPressedOnce) {

if (getFragmentManager().getBackStackEntryCount() ==0) {

finishAffinity();

System.exit(0);

} else {

getFragmentManager().popBackStackImmediate();

}

return;

}

if (getFragmentManager().getBackStackEntryCount() ==0) {

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce = false;

}

}, 2000);

} else {

getFragmentManager().popBackStackImmediate();

}

}

}

Priya Rajan answered 2019-02-10T14:57:20Z

1 votes

我用这个

import android.app.Activity;

import android.support.annotation.StringRes;

import android.widget.Toast;

public class ExitApp {

private static long lastClickTime;

public static void now(Activity ctx, @StringRes int message) {

now(ctx, ctx.getString(message), 2500);

}

public static void now(Activity ctx, @StringRes int message, long time) {

now(ctx, ctx.getString(message), time);

}

public static void now(Activity ctx, String message, long time) {

if (ctx != null && !message.isEmpty() && time != 0) {

if (lastClickTime + time > System.currentTimeMillis()) {

ctx.finish();

} else {

Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show();

lastClickTime = System.currentTimeMillis();

}

}

}

}

用于事件ExitApp.now(this,R.string.double_back_pressed,5000)

@Override

public void onBackPressed() {

ExitApp.now(this,"Press again for close");

}

或ExitApp.now(this,R.string.double_back_pressed,5000)

for change需要close,指定的毫秒数

ExitApp.now(this,R.string.double_back_pressed,5000)

Webserveis answered 2019-02-10T14:58:14Z

1 votes

这是另一种方法......使用CountDownTimer方法

private boolean exit = false;

@Override

public void onBackPressed() {

if (exit) {

finish();

} else {

Toast.makeText(this, "Press back again to exit",

Toast.LENGTH_SHORT).show();

exit = true;

new CountDownTimer(3000,1000) {

@Override

public void onTick(long l) {

}

@Override

public void onFinish() {

exit = false;

}

}.start();

}

}

Anuj Sain answered 2019-02-10T14:58:44Z

java中后退键_java - 单击后退按钮两次以退出活动相关推荐

  1. java中char类型转换成int类型的两种方法

    java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...

  2. 在Java中实现SFTP协议文件传输的两种解决方案

    在Java中实现SFTP协议文件传输的两种解决方案 1.1 背景 1.2 关于 FTP /FTPS 1.3 关于SFTP 解决方案一:使用 JSch 库 解决方案二:使用sshj 库 这篇博文来聊聊在 ...

  3. 文本框禁用后(readonly=readonly),光标置于文本框中按后退键,页面后退的解决方案...

    //处理键盘事件 禁止后退键(Backspace)密码或单行.多行文本框除外 function forbidBackSpace(e){ var ev = e || window.event;//获取e ...

  4. 5 java中的集合类_java基础(5)-集合类1

    集合的由来 数组是很常用的一种数据结构,但假如我们遇到以下这样的的问题: 容器长度不确定 能自动排序 存储以键值对方式的数据 如果遇到这样的情况,数组就比较难满足了,所以也就有了一种与数组类似的数据结 ...

  5. java中循环语句_Java语法基础之循环结构语句详解

    一.循环结构 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循 ...

  6. Java中通过ActionEvent判断是哪个按钮

    Java中经常把一个ActionListener注册给多个按钮 如何判断这个ActioinListener是由哪个按钮触发的呢 可以用e.getSource()返回是哪个源触发了这个事件 转载于:ht ...

  7. java id主键_JAVA主键ID生成工具类:改自twitter的分布式ID算法snowflake

    祝大家新年快乐,有任何问题可与我联系: 关于snowflake算法的介绍和原理这里不过多说明了,网上有很多. 这里简单描述下SnowflakeUtil的优点: 1.做为底层工具使用,可用于数据库主键. ...

  8. java 中的正则表达式_Java中的正则表达式–软介绍

    java 中的正则表达式 正则表达式是一种可以应用于文本(Java中的String)的模式. Java提供了java.util.regex包,用于与正则表达式进行模式匹配. Java正则表达式与Per ...

  9. java中使用配置文件_Java中使用Properties配置文件的简单方法

    Java中使用Properties配置文件的简单方法 properties Properties文件是java中的一种配置文件,文件后缀为".properties",文件的内容格式 ...

最新文章

  1. 查找数组中第二个最小元素
  2. 关于unix下使用tar的一些常用技巧
  3. c语言编程基础课件,第7章_C语言图形编程基础课件
  4. Leetcode 565. Array Nesting
  5. 发现很多人的基础都不好
  6. php 返回的缓存数据,基于PHP输出缓存(output_buffering)的深入理解
  7. camera---(3)双camera 生态链
  8. python学习(1)启程
  9. GStreamer架构设计篇(四)
  10. 中国第一朵云,花了足足9年
  11. display可以控制标签的显示模式
  12. CNware存储管理功能介绍
  13. 微信小程序发送模板消息限制的问题
  14. PDF旋转保存居然还能如此高效的办法
  15. 普加.大学生广告创意大赛公告
  16. 技巧/诀窍:用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译)
  17. Java Web中的一些概念(JSP、Servlet以及过滤器等)
  18. Linux - 常见端口和服务的对照和解释
  19. FPN:feature pyramid networks for object detection
  20. 激光切割机机械结构设计

热门文章

  1. nodemcu与matlab,NodeMCU Tutorial 1:NodeMCU + DS18S20 + Thingspeak + MATLAB
  2. 三菱plc字高八位和低八位_Switch好搭档,八位堂手柄上手体验
  3. 基于python和opencv的人脸识别
  4. 如何高效地使用51单片机串口输入输出
  5. linux下安装nginx tar包,Linux环境下Nginx的安装
  6. Python开发第一篇 基础篇(下)
  7. fetch移动端浏览器兼容问题
  8. 根据word模版导入word中用户填写的数据
  9. oracle中常用的时间格式转换
  10. HTML5新标签 w3c