按两次返回键退出

4

安卓Webview 我的应用程序中的当前代码工作方式如下: 当用户单击后退一次时,它会显示一个按钮,询问“您是否要退出?”并显示是或否选项。如果我们选择Yes,它将退出应用程序并显示插页式广告。如果按No,则保留在该活动中。

我想要的是: 当用户按返回键时,它会返回到上一个活动。如果用户双击返回按钮,那么它将要求退出,如果用户选择Yes。用户将退出应用程序并出现插页式广告。

请帮助我解决这个问题。

主要活动:

public class MainActivity extends Activity{

private Fragment contentFragment;
String testDevice = "D0A04359EA1ECE9BA0CD4B6F457A9991";
String testDevice2 = "63C3530DA03C191310DB9AB8F0672E5C";
String testDevice3 = "801F2141A1DC3F743363AFDFDC42AF3A";
private InterstitialAd mInterstitialAd;
private AdView mAdView;
boolean displayAd = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
    WebSettings webSettings = mainWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    mainWebView.setWebViewClient(new MyCustomWebViewClient());
    mainWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    mainWebView.loadUrl(this.getString(R.string.channel_url));

    mAdView = (AdView) findViewById(R.id.ad_view);
    // Create an ad request. Check your logcat output for the hashed device ID to
    // get test ads on a physical device. e.g.
    // "Use AdRequest.Builder.addTestDevice("ABCDEF012345") to get test ads on this device."
    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(testDevice)
            .addTestDevice(testDevice2)
            .addTestDevice(testDevice3)
            .build();

    mAdView.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            displayAd = true;
  //                View servername = findViewById(R.id.txt_List);
 //             RelativeLayout.LayoutParams layoutparams = 
(RelativeLayout.LayoutParams) servername.getLayoutParams();
//              layoutparams.addRule(RelativeLayout.BELOW, mAdView.getId());
//              layoutparams.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
//              servername.setLayoutParams(layoutparams);
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
            if (!displayAd) {
            }
        }

        @Override
        public void onAdClosed() {
            // Proceed to the next level.
        }
    });

    // Start loading the ad in the background.
    mAdView.loadAd(adRequest);

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

    // Create the InterstitialAd and set the adUnitId (defined in values/strings.xml).
    mInterstitialAd = newInterstitialAd();
    loadInterstitial();
}

private class MyCustomWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

private InterstitialAd newInterstitialAd() {
    InterstitialAd interstitialAd = new InterstitialAd(this);
    interstitialAd.setAdUnitId(getString(R.string.interstitial_ad_unit_id));
    interstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
        }

        @Override
        public void onAdClosed() {
            // Proceed to the next level.
            finish();
            //goToNextLevel();
        }
    });
    return interstitialAd;
}

private void showInterstitial() {
    // Show the ad if it's ready. Otherwise toast and reload the ad.
    if (mInterstitialAd != null && mInterstitialAd.isLoaded()) {
        mInterstitialAd.show();

    } else {
        finish();
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//      getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

private void loadInterstitial() {
    // Disable the next level button and load the ad.
    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(testDevice)
            .addTestDevice(testDevice2)
            .addTestDevice(testDevice3)
            .setRequestAgent("android_studio:ad_template").build();
    mInterstitialAd.loadAd(adRequest);
}


/*
 * We call super.onBackPressed(); when the stack entry count is > 0. if it
 * is instanceof EmpListFragment or if the stack entry count is == 0, then
 * we prompt the user whether to quit the app or not by displaying dialog.
 * In other words, from EmpListFragment on back press it quits the app.
 */

@Override
public void onBackPressed() {
    onShowQuitDialog();
}

public void onShowQuitDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(false);

    builder.setMessage("Do You Want To Quit?");
    builder.setPositiveButton(android.R.string.yes,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    showInterstitial();
                }
            });
    builder.setNegativeButton(android.R.string.no,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
    builder.create().show();
}

}


很遗憾,对于返回按钮没有GestureDetector,但是一个快速的方法是在用户按下返回按钮时启动一个计时器,如果计时器结束之前有第二次点击,则认为是双击。否则,它就是一个简单的点击,您可以结束您的活动。 - Edson Menegatti
我已经更新了上面的整个代码。请检查并相应地建议更改,以便它也可以与插页式广告正常工作。 - Nazarahmed Khan Blogger
在单击返回键时调用上一个活动并在双击返回键时退出,就像我在答案中提到的那样,请查看https://dev59.com/-KHia4cB1Zd3GeqPVY07#46639761。 - Sagar
9个回答

5

这是最简单的代码:

private static final int TIME_DELAY = 2000;
private static long back_pressed;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onBackPressed() {
        if (back_pressed + TIME_DELAY > System.currentTimeMillis()) {
            super.onBackPressed();
        } else {
            Toast.makeText(getBaseContext(), "Press once again to exit!",
                    Toast.LENGTH_SHORT).show();
        }
        back_pressed = System.currentTimeMillis();
    }
}

1
boolean doubleBackToExitPressedOnce = false;

@Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }

        this.doubleBackToExitPressedOnce = true;

       onShowQuitDialog();


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

            @Override
            public void run() {
                doubleBackToExitPressedOnce=false;
            }
        }, 2000);
    }

它显示无法解析符号“handler”。由于文本限制,我无法粘贴整个主活动代码。您没有包含插页式广告,请检查并给我带有广告的代码。 - Nazarahmed Khan Blogger
请在此处检查整个主Activity代码:https://drive.google.com/file/d/0B6a1Wje6UpUXNDR0YVFfMkpyUTg/view?usp=sharing - Nazarahmed Khan Blogger
我已经更新了上面的整个代码。请检查并相应地建议更改,以便它也可以与插页式广告正常工作。 - Nazarahmed Khan Blogger
谢谢您先生。请展示onShowQuitDialog函数。public void onShowQuitDialog() { Toast.makeText(DelegateListActivity.this, "再次点击退出应用程序", Toast.LENGTH_LONG).show(); } - Ganesan J

1
一时标志就可以解决问题。 将此代码添加到您的onBackPressed()方法中。
boolean isSecond;

@Override
public void onBackPressed(){
    if (isSecond) {
        // Open your dialog here 
    }

    isSecond = true;
    new Handler() . postDelayed(new Runnable() {
        @Override
        public void run(){
            isSecond = false;
        }
    }, 2000);
}

它显示无法解析符号“handler”。由于文本限制,我无法粘贴整个主活动代码。您没有包含插页式广告,请检查并给我带有广告的代码。 - Nazarahmed Khan Blogger
请在此处检查整个主活动代码:https://drive.google.com/file/d/0B6a1Wje6UpUXNDR0YVFfMkpyUTg/view?usp=sharing - Nazarahmed Khan Blogger
我已经更新了上面的整个代码。请检查并相应地建议更改,以便它也可以与插页式广告正常工作。 - Nazarahmed Khan Blogger
看一下这里,可能会对你有所帮助 https://dev59.com/-KHia4cB1Zd3GeqPVY07#46639761 - Sagar

0

试试这个.. 它可能会对你有帮助。

Boolean doubleBackToExitPressedOnce = true;
    @Override
    public void onBackPressed() {
        if(doubleBackToExitPressedOnce){
            // Do what ever you want
            doubleBackToExitPressedOnce = false;
        } else{
            // Do exit app or back press here
            super.onBackPressed();
        }

        }

0

使用以下更新的代码在双击返回键时退出Android应用程序。它可能会解决您的问题。

private boolean doubleBackToExitPressedOnce;
 private void onApplicationBackPressed() {
    if (doubleBackToExit) {
        moveTaskToBack(true);
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(1);
       return;
     }

    doubleBackToExit= true;

    Utilities_dialer.showToastMessage(this, "Press Again To Exit");
   //use your dialog box or toast message
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            doubleBackToExit= false;
        }
    }, 2000);
}

0
尝试以下代码:
int backFlag = 0;

@Override
public void onBackPressed() {

backFlag ++;

if(backflag == 1){
super.onBackPressed();
   // go to previous activity
}
else if(backFlag == 2){
   // ask user to exit
}

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

    @Override
    public void run() {
        backFlag=0;                       
    }
}, 2000);
} 

它显示无法解析符号“handler”。由于文本限制,我无法粘贴整个主活动代码。您没有包含插页式广告,请检查并给我带有广告的代码。 - Nazarahmed Khan Blogger
你需要导入Handler类。 - R.R.M
我已经更新了上面的整个代码,请检查并针对性地建议更改,以便它也能正常运行插页式广告。 - Nazarahmed Khan Blogger
需要用你的代码替换以下代码。我说得对吧?请检查。@Override public void onBackPressed() { onShowQuitDialog(); } - Nazarahmed Khan Blogger
错误:(166,12)错误:类MainActivity已经在包com.wAashiqeRasool.HamareNabi中定义。 - Nazarahmed Khan Blogger
显示剩余15条评论

0

对于双击返回的onBackPressed(),Android系统中并没有内置的函数,因此您需要构建自己的版本。 Android系统提供了一个Handler,您可以调用其中的postDelayed来测量两次点击之间的时间。

例如:

boolean backPressed = false;
boolean backPressedTwice = false;
@Override
public void onBackPressed() {
    if(!backPressed){
        backPressed = true;
        new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            if(!backPressedTwice)
            MainActivity.this.finish(); // go back to previous activity                      
        }
    }, 500);
}
if(backPressed) {
    // it's clicked twice
    backPressedTwice = true; // cancel the handler so it does not finish the activity
    onShowQuitDialog();
    }
}

它显示无法解析符号“handler”。由于文本限制,我无法粘贴整个主活动代码。您没有包含插页式广告,请检查并给我带有广告的代码。 - Nazarahmed Khan Blogger
请在此处检查整个主活动代码:https://drive.google.com/file/d/0B6a1Wje6UpUXNDR0YVFfMkpyUTg/view?usp=sharing - Nazarahmed Khan Blogger
我已经更新了上面的整个代码。请检查并相应地建议更改,以便它也可以与插页式广告正常工作。 - Nazarahmed Khan Blogger

0

您的任务演示:

public class MainActivity extends AppCompatActivity {

    Handler handler = new Handler();
    boolean ShowDialog = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler = new Handler(getMainLooper());
    }


    @Override
    public void onBackPressed() {
        if (!ShowDialog) {
            this.ShowDialog = true;
            handler.postDelayed(runnable, 2000);// time setting .. current is 2 sec
        } else {
            handler.removeCallbacks(runnable);
            ShowDialog = false;
            ShowDailog();
        }
    }

    private void ShowDailog() {
        Toast.makeText(this, "show dialog here", Toast.LENGTH_LONG).show();
    }

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            ShowDialog = false;
            MainActivity.super.onBackPressed();
        }
    };
}

它显示无法解析符号“handler”。由于文本限制,我无法粘贴整个主活动代码。您没有包含插页式广告,请检查并给我带有广告的代码。 - Nazarahmed Khan Blogger
请在此处检查整个主活动代码:https://drive.google.com/file/d/0B6a1Wje6UpUXNDR0YVFfMkpyUTg/view?usp=sharing - Nazarahmed Khan Blogger
我已经更新了上面的整个代码。请检查并相应地建议更改,以便它也可以与插页式广告正常工作。 - Nazarahmed Khan Blogger

0
你可以像这样做:
private long backPressedTime = 0;
private long backPressThreshold = 400;
private Handler mHandler = new Handler();
private Runnable bacPressedRunnable = new Runnable() {
    @Override
    public void run() {
        MYActivity.super.onBackPressed();
    }
};

@Override
public void onBackPressed() {
    if(backPressedTime = 0){
       backPressedTime = Systemm.currentTimeInMillis();
       mHandler.postDelayed(bacPressedRunnable,backPressThreshold);
    }else if(System.currentTimeInMillis()-backPressedTime >=   backPressThreshold){
       mHandler.removeMessages(bacPressedRunnable);
       onShowQuitDialog();
    }else{
       super.onBackPressed();
    }
    backPressedTime = 0;
}

它显示无法解析符号“handler”。由于文本限制,我无法粘贴整个主活动代码。您没有包含插页式广告,请检查并给我带有广告的代码。 - Nazarahmed Khan Blogger
请在此处检查整个主活动代码:https://drive.google.com/file/d/0B6a1Wje6UpUXNDR0YVFfMkpyUTg/view?usp=sharing - Nazarahmed Khan Blogger
我已经更新了上面的全部代码。请检查并相应地建议更改,以便它也可以与插页式广告正常工作。 - Nazarahmed Khan Blogger
亲爱的Nazarahmed,这不是一个代码分享网站,请尝试理解您正在编写的代码以及此片段的作用,并根据您的需求进行更改。如果您有任何疑问,请随时提出。希望您能理解。 - NIPHIN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接