Press Double Back To Exit

Android Webview current code in my app works like this: When user press back single time it will shows button asking "Do you want to quit?" shows yes or no options. when we select Yes it exit app and show interstitial ad. if you press No it will remains in the activity.

What I want is: When user press back it will go to previous activity. If user double tap back button then it will ask for exit and if user select Yes. user will exit app and interstitial ad appears.

Please help me to solve this issue.

Main Activity:

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();
}

}

Upvotes: 5

Views: 8901

Answers (9)

Learning Always
Learning Always

Reputation: 1561

Try this.. It may help you.

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();
        }

        }

Upvotes: 0

Sagar H
Sagar H

Reputation: 5541

Exit android App on double back press use following updated code. It may solve your problem

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);
}

Upvotes: 0

anddevmanu
anddevmanu

Reputation: 1459

A temp flag will do the thing. add this code in your onBackPressed() method.

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);
}

Upvotes: 1

NIPHIN
NIPHIN

Reputation: 1081

You can do something like this

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;
}

Upvotes: 0

Elbert John Felipe
Elbert John Felipe

Reputation: 181

This is the easiest code possible:

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();
    }
}

Upvotes: 5

Sohail Zahid
Sohail Zahid

Reputation: 8149

Demo for your task:

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();
        }
    };
}

Upvotes: 0

Murat Karagöz
Murat Karagöz

Reputation: 37604

There is no built-in function for double onBackPressed() so you have to construct your own version of it. The android system provides a Handler on which you can call postDelayed to measure the time between two and one click.

e.g. like this

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();
    }
}

Upvotes: 0

R.R.M
R.R.M

Reputation: 790

Try following code :

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);
} 

Upvotes: 0

sapan ravani
sapan ravani

Reputation: 88

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);
    }

Upvotes: 1

Related Questions