0

私は偶然これを発見しました。クイズゲームがあり、正解、不正解のポップアップがあり、ゲーム終了後に結果のポップアップが表示されます。しかし、今日、ゲームの途中で戻るボタンを押してホーム画面(ゲームのホーム画面ではなく、OSのホーム画面)に戻りましたが、他のすべての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);
}
4

2 に答える 2

5

アクティビティは停止していますが、作成したバックグラウンド スレッドは実行されたままです。そのため、onStop をオーバーライドしてバックグラウンド スレッドをキャンセルする必要があります。

何かのようなもの:

@Override public void onStop() {
    super.onStop();
    brojacVremena.cancel();
}
于 2013-03-10T18:55:49.740 に答える
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 をご覧ください。上記のリンクを組み合わせることで、問題を解決するために何をしたいのかについての洞察が得られるはずです

于 2013-03-10T18:51:09.953 に答える