title: Back button functionality not working while running my Android program
body: <p>My program is working properly, but in the middle of the program running, user clicks on the BACK button, and the functionality of the back button does not work. But after completing the executing, BACK button functionality is working.</p>
  
  <p>please observe my code here.</p>
  
  <pre><code>package com.sampleexample;
  
  import android.app.Activity;
  import android.app.AlertDialog;
  import android.app.Dialog;
  import android.app.ProgressDialog;
  import android.content.DialogInterface;
  import android.os.Bundle;
  import android.os.Handler;
  import android.os.Message;
  import android.util.Log;
  import android.view.KeyEvent;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.TextView;
  import android.widget.Toast;
  
  public class SampleExample extends Activity {
      static final int PROGRESS_DIALOG = 0;
      Button button;
      TextView download;
      ProgressThread progressThread;
      ProgressDialog progressDialog;
  
      /** Called when the activity is first created. */
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
         Log.d("SampleExample", "======= onCreate()====Start====");
          // Setup the button that starts the progress dialog
          download = (TextView) findViewById(R.id.download);
          button = (Button) findViewById(R.id.progressDialog);
          button.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  Log.d("SampleExample", "======= onClick()==Start======");
                  showDialog(PROGRESS_DIALOG);
                  Log.d("SampleExample", "======= onClick()===End=====");
              }
          });
          Log.d("SampleExample", "======= onCreate()====End====");
      }
  
      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event) {
          // Handle the back button
          if (keyCode == KeyEvent.KEYCODE_BACK) {
              // Ask the user if they want to quit
              Log.d("SampleExample", " ------- Back Button onKeyDown()----Start--");
              new AlertDialog.Builder(this).setIcon(
                      android.R.drawable.ic_dialog_alert).setTitle("Exit")
                      .setMessage("Are you sure you want to leave?")
                      .setNegativeButton(android.R.string.cancel, null)
                      .setPositiveButton(android.R.string.ok,
                              new DialogInterface.OnClickListener() {
                                  public void onClick(DialogInterface dialog,
                                          int which) {
                                      // Exit the activity
                                      SampleExample.this.finish();
                                  }
                              }).show();
  
              // Say that we've consumed the event
              Log.d("SampleExample", " ------BackButton-onKeyDown()----End--");
              return true;
          }
  
          return super.onKeyDown(keyCode, event);
      }
  
      // Toast.makeText(SampleExample.this, "U have pressed the Back Button",
      // Toast.LENGTH_SHORT).show();
  
      // Log.d(this.getClass().getName(),
      // "*********back button pressed----------");
  
      protected Dialog onCreateDialog(int id) {
          Log.d("SampleExample", "99999 onCreateDialog () 999 Start");
          switch (id) {
          case PROGRESS_DIALOG:
              progressDialog = new ProgressDialog(SampleExample.this);
              progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
              progressDialog.setMessage("Loading...");
              download.setText("Now downloading.......");
              progressThread = new ProgressThread(handler);
              progressThread.start();
              return progressDialog;
          default:
              return null;
          }
      }
  
      // Define the Handler that receives messages from the thread and update the
      // progress
      final Handler handler = new Handler() {
          public void handleMessage(Message msg) {
              Log.d("SampleExample", "8888 handleMessage () 8888 Start");
              int total = msg.getData().getInt("total");
              progressDialog.setProgress(total);
              if (total &gt;= 100) {
                  // Toast.makeText(SampleExample.this, "Download is completed",
                  // Toast.LENGTH_SHORT).show();
                  download.setText(" download is completed.");
                  dismissDialog(PROGRESS_DIALOG);
                  progressThread.setState(ProgressThread.STATE_DONE);
              }
          }
      };
  
      /** Nested class that performs progress calculations (counting) */
      private class ProgressThread extends Thread {
          Handler mHandler;
          final static int STATE_DONE = 0;
          final static int STATE_RUNNING = 1;
          int mState;
          int total;
  
          ProgressThread(Handler h) {
              mHandler = h;
          }
  
          public void run() {
              mState = STATE_RUNNING;
              total = 0;
              Log.d("SampleExample", "7777 run () 7777 Start");
              while (mState == STATE_RUNNING) {
                  try {
                      Thread.sleep(100);
                  } catch (InterruptedException e) {
                      Log.e("ERROR", "Thread Interrupted");
                  }
                  Message msg = mHandler.obtainMessage();
                  Bundle b = new Bundle();
                  b.putInt("total", total);
                  msg.setData(b);
                  mHandler.sendMessage(msg);
  
                  total++;
              }
              Log.d("SampleExample", "6666 run () 6666 End");
          }
  
          /*
           * sets the current state for the thread, used to stop the thread
           */
          public void setState(int state) {
              mState = state;
          }
      }
  }
  </code></pre>