startActivityForResult для одного класса, и этот класс возвращает данные другому классу? - PullRequest
1 голос
/ 24 мая 2019

У меня есть 3 класса: MainActivity, HighScoreActivity и GameScreenActivity.Я хочу перейти к GameScreenActivity через MainActivity, а затем, когда игра закончится, передать результат в HighScoreActivity.Все успешно передается в GameScreenActivity, но не в onActivityResult в HighScoreActivity.

Я полагаю, что это из-за MainActivity, имеющего startActivityForResult, так что finishQuiz () GameScreenActivity ожидает вернуть свои данные в MainActivity.Как передать данные GameScreenActivity в HighScoreActivity?

MainActivity ()

    MainActivity(){
    ...
        private void startQuiz() {
            String difficulty = spinnerDifficulty.getSelectedItem().toString();

            Intent intent = new Intent(getBaseContext(), GameScreenActivity.class);
            intent.putExtra(EXTRA_DIFFICULTY, difficulty);
            startActivityForResult(intent, REQUEST_CODE_QUIZ);
        }
    }

GameScreenActivity ()

    GameScreenActivity(){
    ...
        private void finishQuiz(){
            Intent resultIntent = new Intent(getBaseContext(), 
    HighScoreActivity.class);
            resultIntent.putExtra(EXTRA_SCORE, score);
            resultIntent.putExtra(EXTRA_DIFFICULTY, difficulty);
            setResult(RESULT_OK, resultIntent);
            startActivity(resultIntent);
        }
    }

HighScoreActivity ()

    HighScoreActivity(){
    ...
        @Override
        protected void onActivityResult(int requestCode, int resultCode, 
    Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == REQUEST_CODE_QUIZ){
                if (resultCode == RESULT_OK) {
                    int score = data.getIntExtra(GameScreenActivity.EXTRA_SCORE, 0);
                    String difficulty = data.getStringExtra(GameScreenActivity.EXTRA_DIFFICULTY);
                    if (score > highScore10) {
                        updateHighscore(score, difficulty);
                    }
                }
            }
        }
    }

-------------------------------------------------------------

Попытка с использованием метода Broadcast:

GameScreenActivity () с методами трансляции

    GameScreenActivity(){
    ...
        private void finishQuiz(){
            Log.d("sender", "Broadcasting message");
            Intent intent = new Intent("scoreEvent");
            intent.putExtra(EXTRA_DIFFICULTY, difficulty);
            intent.putExtra(EXTRA_SCORE, score);
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
            sendBroadcast(intent);
            Intent goToHighScores = new Intent(getBaseContext(), HighScoreActivity.class);
            startActivity(goToHighScores);
        }
    }

HighScoreActivity () с методами вещания

    HighScoreActivity(){
    ...
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_high_score);

            LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
                    new IntentFilter("scoreEvent"));
        }


        @Override
        protected void onActivityResult(int requestCode, int resultCode, 
    Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == REQUEST_CODE_QUIZ){
                if (resultCode == RESULT_OK) {
                    int score = data.getIntExtra(GameScreenActivity.EXTRA_SCORE, 0);
                    String difficulty = data.getStringExtra(GameScreenActivity.EXTRA_DIFFICULTY);
                    if (score > highScore10) {
                        updateHighscore(score, difficulty);
                    }
                }
            }
        }

        private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String message = intent.getStringExtra("message");
                Log.d("receiver", "Got message: " + message);
            }
        };

        @Override
        protected void onDestroy() {
            LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
            super.onDestroy();
        }
    }

1 Ответ

0 голосов
/ 24 мая 2019

Учитывая, что HighScoreActivity работает, Вы можете использовать LocalBroadcastManager для регистрации местного вещательного приемника в HighScoreActivity с IntentFilter. Также, не забудьте отменить регистрацию в onDestroy()

Теперь вместо setResult сделайте sendBroadcast() из GameScreenActivity

Надеюсь, это поможет. Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...