运行我的Android程序时后退按钮功能无法正常工作

时间:2011-02-04 07:48:05

标签: android

我的程序运行正常,但在程序运行过程中,用户单击BACK按钮,后退按钮的功能不起作用。但在完成执行后,BACK按钮功能正在运行。

请在这里查看我的代码。

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

3 个答案:

答案 0 :(得分:1)

您没有真正清楚地解释问题的症状,但是从您的代码中可以看出,您正在开始后台线程并弹出ProgressDialog。我假设正在运行时您正在尝试按BACK键。这似乎没有做任何事情的原因是Dialog默认情况下不能使用BACK键取消。您必须致电setCancelable(true)才能启用此行为。

    case PROGRESS_DIALOG:
        progressDialog = new ProgressDialog(SampleExample.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(true);
        ...
        return progressDialog;

这将允许使用BACK按钮取消ProgressDialog。但是,即使已取消Thread,您的后台Dialog也会继续投放。

答案 1 :(得分:1)

// handle phone back button

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {       
            return quitWithPID();
        }
        return super.onKeyDown(keyCode, event); 
    }

// reusable method (modifier may be public..)
private boolean quitWithPID() {
    new AlertDialog.Builder(this).setIcon(
            android.R.drawable.ic_dialog_alert).setTitle("Exit Boot Options?")
            .setMessage("Are you sure you want to exit?")
            .setNegativeButton(android.R.string.cancel, null)
            .setPositiveButton(android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // Exit the activity
                            MainActivity.this.finish();
                            // Terminate the process ;)
                            android.os.Process.killProcess(android.os.Process.myPid());
                        }
                    }).show();         
    return true;
} 

答案 2 :(得分:0)

chandu你是否在发布问题之前检查了你的逻辑

重新检查处理程序中的以下代码

if (total >= 100) {

    download.setText(" download is completed.");
    dismissDialog(PROGRESS_DIALOG);
    progressThread.setState(ProgressThread.STATE_DONE);
}

你的代码不会达到dismissDialog,直到总数> = 100&因此,即使在程序中你也无法使用你的BACK的动作

&安培;也请停止发布multiple questions