【问题标题】:startActivityForResult to one class and have that class return the data to a different class?startActivityForResult 到一个类并让该类将数据返回到另一个类?
【发布时间】:2019-10-10 17:37:21
【问题描述】:

我有 3 个类:MainActivity、HighScoreActivity 和 GameScreenActivity。我想通过MainActivity进入GameScreenActivity,然后在游戏结束后,将分数传给HighScoreActivity。一切都成功地传递给了 GameScreenActivity,但它没有传递到 HighScoreActivity 中的 onActivityResult。

我相信这是因为 MainActivity 具有 startActivityForResult,所以 GameScreenActivity 的 finishQuiz() 期望将其数据返回给 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);
                    }
                }
            }
        }
    }

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

尝试使用广播方法:

带有广播方法的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();
        }
    }

【问题讨论】:

    标签: java onactivityresult startactivityforresult


    【解决方案1】:

    考虑到HighScoreActivity 正在运行, 您可以使用LocalBroadcastManagerHighScoreActivityIntentFilter 中注册本地广播接收器。另外,别忘了注销onDestroy()

    现在,从 GameScreenActivity 改为 sendBroadcast(),而不是 setResult

    希望这会有所帮助。编码愉快!

    【讨论】:

    • 我试图更改代码,我编辑了帖子以包含它。那正确吗?它不起作用,我想我可能遗漏了一些东西(我尝试过它的教程)
    • 正如我在回答中提到的,您需要运行 HighScoreActivity,您在活动激活之前触发 LocalBroadcastManager.getInstance(this).sendBroadcast()。看到你的代码后..你可以直接把Extras放在启动HighScoreActivity的intent中
    • 哦,对了,对不起。这听起来可能很愚蠢,但如果我不积极参与其中,我将如何让 HighScoreActivity 运行?
    • 你能试试这个吗,Intent goToHighScores=new Intent(getBaseContext(),HighScoreActivity.class); intent.putExtra(EXTRA_DIFFICULTY,难度); intent.putExtra(EXTRA_SCORE, score); startActivity(goToHighScores);然后在 HighScoreActivity 中执行 getIntent() 并从该意图中获取数据。我猜你不需要 broadcastReceiver .. 只是现在把它注释掉。
    猜你喜欢
    • 2021-06-25
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2021-09-16
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多