如何用后退按钮杀死活动?

时间:2013-03-10 18:39:47

标签: java android

我意外地发现了这一点。我有一个问答游戏,我有一个正确答案的弹出窗口,错误的答案和游戏结束后,我有一个结果的弹出窗口。但是,今天我回到游戏中间的后退按钮,到我的主屏幕(不是游戏主屏幕,我的操作系统主屏幕),游戏仍然在后台,就像其他所有Android应用程序一样。几秒钟后,我的错误答案出现了。 :)时间到了,自动回答错了。之后我的最终结果弹出继续。那么,当我按下按钮时,如何杀死该活动?我不知道你们是否需要我的任何代码,但以防万一这是我的游戏活动:

public class NeogranicenoPetGresaka extends Activity implements OnClickListener{

    MyCount brojacVremena = new MyCount(6000, 1000);

LinkedList<Long> mAnsweredQuestions = new LinkedList<Long>();

    private String generateWhereClause(){
        StringBuilder result = new StringBuilder();
        for (Long l : mAnsweredQuestions){
            result.append(" AND _ID <> " + l);
        }
        return result.toString();
    }

    Button bIzlazIzKviza, bOdgovor1, bOdgovor2, bOdgovor3, bOdgovor4;
    TextView question, netacniOdg, score, countdown;
    int brojacPogresnihOdgovora = 0;
    int brojacTacnihOdgovora = 0;
    public static String tacanOdg;

    Runnable mLaunchTask = new Runnable() {
        public void run() {
            nextQuestion();
            brojacVremena.start();
        }
     };
    Runnable mLaunchTaskFinish = new Runnable() {
         public void run() {
            brojacVremena.cancel();
            finish();
         }
      };


    private class Answer {
        public Answer(String opt, boolean correct) {
            option = opt;
            isCorrect = correct;
        }

        String option;
        boolean isCorrect;
    }
    Handler mHandler = new Handler();

    final OnClickListener clickListener = new OnClickListener() {
        public void onClick(View v) {

            Answer ans = (Answer) v.getTag();
            if (ans.isCorrect) {
                brojacVremena.cancel();
                brojacTacnihOdgovora = brojacTacnihOdgovora + 5;
                Intent i = new Intent("rs.androidaplikacijekvizopstekulture.TACANODGOVOR");
                startActivity(i);
                mHandler.postDelayed(mLaunchTask,1200);
            }
        /*else{
            brojacVremena.cancel();
            brojacPogresnihOdgovora++;
            Intent i = new Intent(getApplicationContext(), PogresanOdgovor.class);
            i.putExtra("tacanOdgovor", tacanOdg);
            startActivity(i);
            mHandler.postDelayed(mLaunchTask,2200);
            }*/
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.neograniceno);

        Typeface dugmad = Typeface.createFromAsset(getAssets(), "Bebas.ttf");
        Typeface pitanje = Typeface.createFromAsset(getAssets(), "myriad.ttf");
        bIzlazIzKviza = (Button) findViewById(R.id.bIzlazIzKvizaN);
        netacniOdg = (TextView) findViewById(R.id.tvBrojPitanjaN);
        question = (TextView) findViewById(R.id.tvPitanjeN);
        bOdgovor1 = (Button) findViewById(R.id.bOdgovorN1);
        bOdgovor2 = (Button) findViewById(R.id.bOdgovorN2);
        bOdgovor3 = (Button) findViewById(R.id.bOdgovorN3);
        bOdgovor4 = (Button) findViewById(R.id.bOdgovorN4);
        score = (TextView) findViewById(R.id.tvSkor2N);
        countdown = (TextView) findViewById(R.id.tvCountdownN);
        bOdgovor1.setTypeface(dugmad);
        bOdgovor2.setTypeface(dugmad);
        bOdgovor3.setTypeface(dugmad);
        bOdgovor4.setTypeface(dugmad);
        bIzlazIzKviza.setTypeface(dugmad);
        netacniOdg.setTypeface(dugmad);
        question.setTypeface(pitanje);
        score.setTypeface(dugmad);
        countdown.setTypeface(dugmad);

        nextQuestion(); //startuje prvo pitanje!
        brojacVremena.start();  //startuje brojac vremena
    }


    public class MyCount extends CountDownTimer {

        public MyCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onFinish() {

            brojacPogresnihOdgovora++;
            Intent i = new Intent(getApplicationContext(), PogresanOdgovor.class);
            i.putExtra("tacanOdgovor", tacanOdg);
            startActivity(i);
            mHandler.postDelayed(mLaunchTask,2200);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            countdown.setText("" + millisUntilFinished / 1000);
        }
    }

        public void onClick(View v) {
        // TODO Auto-generated method stub


    }
    @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
        }

    public void nextQuestion() {


        TestAdapter mDbHelper = new TestAdapter(this);
        mDbHelper.createDatabase();

        try{    //Pokusava da otvori db

            mDbHelper.open();  //baza otvorena

            Cursor c = mDbHelper.getTestData(generateWhereClause());
            mAnsweredQuestions.add(c.getLong(0));

            List<Answer> labels = new ArrayList<Answer>();

            labels.add(new Answer(c.getString(2), true));
            labels.add(new Answer(c.getString(3), false));
            labels.add(new Answer(c.getString(4), false));
            labels.add(new Answer(c.getString(5), false));

            Collections.shuffle(labels);

            tacanOdg = c.getString(2);

            if(brojacPogresnihOdgovora < 20){


        question.setText(c.getString(1));

        bOdgovor1.setText(labels.get(0).option);
        bOdgovor1.setTag(labels.get(0));
        bOdgovor1.setOnClickListener(clickListener);

        bOdgovor2.setText(labels.get(1).option);
        bOdgovor2.setTag(labels.get(1));
        bOdgovor2.setOnClickListener(clickListener);

        bOdgovor3.setText(labels.get(2).option);
        bOdgovor3.setTag(labels.get(2));
        bOdgovor3.setOnClickListener(clickListener);

        bOdgovor4.setText(labels.get(3).option);
        bOdgovor4.setTag(labels.get(3));
        bOdgovor4.setOnClickListener(clickListener);

        netacniOdg.setText("" + brojacPogresnihOdgovora);
        score.setText("Score: " + brojacTacnihOdgovora);
            }
            else{
                brojacVremena.cancel();
                Intent i = new Intent(getApplicationContext(), Rezultat.class);
                i.putExtra("noviRezultat", brojacTacnihOdgovora);
                startActivity(i);
                String brojacTacnihOdgovoraString = String.valueOf(brojacTacnihOdgovora);
                mHandler.postDelayed(mLaunchTaskFinish,4000);
                //SwarmLeaderboard.submitScore(6863, brojacTacnihOdgovora);
                HeyzapLib.submitScore(this, brojacTacnihOdgovoraString, "Osvojili ste " + brojacTacnihOdgovoraString + " poena!", "1T3");
            }
        }
        finally{    // kada zavrsi sa koriscenjem baze podataka, zatvara db
            mDbHelper.close();
        }

    bIzlazIzKviza.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            finish();   
        }
    });
    }
}

我尝试将其放在我的代码中,但它不起作用:

@Override
    public void onBackPressed() {
            super.onBackPressed();
            this.finish();
    }

也尝试了这个,它不起作用:

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

2 个答案:

答案 0 :(得分:5)

问我们活动已停止,但您创建的后台线程仍在运行。因此,您需要覆盖onStop并取消任何后台线程。

类似的东西:

@Override public void onStop() {
    super.onStop();
    brojacVremena.cancel();
}

答案 1 :(得分:1)

    Intent a = new Intent(this,"another activity class to go to");
    a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)|Intent.FLAG_ACTIVITY_NO_HISTORY);//leaves no history of the activity and clears the backstack.
    startActivity(a); 
    finish();

另请查看此链接http://developer.android.com/training/basics/activity-lifecycle/index.html

了解活动堆栈http://developer.android.com/guide/components/tasks-and-back-stack.html。上述链接的组合应该可以让您深入了解解决问题的方法