You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从View类将游戏分数返回至源Activity类?

解决View类向Activity1返回游戏分数的方案

这个问题核心是要打通「DrawView → Activity2(MainActivity) → Activity1」的数据传递链路,因为View本身没法直接跨Activity返回数据,得先把分数传给它所在的Activity2,再由Activity2把数据回传给Activity1。下面是具体的实现步骤,分两种常用的方式:

方式一:接口回调(推荐,低耦合)

这是Android组件间通信的标准做法,能让DrawView和Activity2解耦,扩展性更好。

1. 在DrawView中定义回调接口

先在你的DrawView类里定义一个监听游戏结束的接口,用来把分数传递给宿主Activity:

public class DrawView extends View {
    // 定义游戏结束的回调接口
    public interface OnGameOverListener {
        void onGameOver(int finalScore);
    }

    private OnGameOverListener mGameOverListener;

    // 给外部设置监听器的方法
    public void setOnGameOverListener(OnGameOverListener listener) {
        mGameOverListener = listener;
    }

    // 你的游戏结束逻辑方法
    private void gameIsOver() {
        // 这里替换成你实际计算的游戏分数
        int playerScore = calculateFinalScore();
        
        // 如果监听器已设置,就回调传递分数
        if (mGameOverListener != null) {
            mGameOverListener.onGameOver(playerScore);
        }
    }

    // 模拟计算分数的方法,你换成自己的逻辑就行
    private int calculateFinalScore() {
        return 999;
    }
}

2. 在Activity2(MainActivity)中实现接口并返回数据

在MainActivity里实现刚才定义的接口,拿到DrawView传递的分数后,通过setResult把数据返回给Activity1:

public class MainActivity extends AppCompatActivity implements DrawView.OnGameOverListener {

    private DrawView mDrawView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化DrawView,要么new出来要么从布局中findViewById
        mDrawView = new DrawView(this);
        setContentView(mDrawView);
        
        // 设置游戏结束的监听器
        mDrawView.setOnGameOverListener(this);
    }

    @Override
    public void onGameOver(int finalScore) {
        // 准备返回给Activity1的Intent,把分数存进去
        Intent resultIntent = new Intent();
        resultIntent.putExtra("KEY_FINAL_SCORE", finalScore);
        
        // 设置返回结果,RESULT_OK表示成功返回数据
        setResult(RESULT_OK, resultIntent);
        
        // 关闭当前Activity,回到Activity1
        finish();
    }
}

3. 在Activity1中接收返回的分数

这里分两种情况,取决于你用的是旧API还是新的AndroidX API:

旧API(startActivityForResult)

如果你的项目还在使用startActivityForResult(虽然已废弃但兼容旧版本),在Activity1里这么写:

// Activity1中启动Activity2的代码
Intent intent = new Intent(Activity1.this, MainActivity.class);
// 1001是自定义的请求码,用来区分不同的跳转请求
startActivityForResult(intent, 1001);

// 重写onActivityResult接收返回数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 匹配请求码和结果码,确保是我们要的返回数据
    if (requestCode == 1001 && resultCode == RESULT_OK) {
        if (data != null) {
            // 获取返回的分数,第二个参数是默认值(如果没拿到数据就用0)
            int score = data.getIntExtra("KEY_FINAL_SCORE", 0);
            // 这里就可以处理分数了,比如显示在菜单界面上
            updateScoreDisplay(score);
        }
    }
}

// 模拟更新分数显示的方法
private void updateScoreDisplay(int score) {
    // 你的UI更新逻辑
}

新API(registerForActivityResult,推荐)

如果用的是AndroidX,推荐用registerForActivityResult替代废弃的方法,Activity1的代码如下:

// 定义ActivityResultLauncher,用来接收返回数据
private ActivityResultLauncher<Intent> mGameResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            // 判断返回结果是否成功
            if (result.getResultCode() == RESULT_OK) {
                Intent data = result.getData();
                if (data != null) {
                    int score = data.getIntExtra("KEY_FINAL_SCORE", 0);
                    // 处理分数
                    updateScoreDisplay(score);
                }
            }
        });

// 启动Activity2时调用这个Launcher
private void startGameActivity() {
    Intent intent = new Intent(Activity1.this, MainActivity.class);
    mGameResultLauncher.launch(intent);
}

// 模拟更新分数显示的方法
private void updateScoreDisplay(int score) {
    // 你的UI更新逻辑
}

方式二:直接强转上下文(简单但耦合高)

如果你的项目逻辑简单,不想写接口,也可以直接在DrawView里通过getContext()拿到MainActivity,然后调用它的方法传递分数:

1. 在DrawView中传递分数给MainActivity

public class DrawView extends View {
    private void gameIsOver() {
        int playerScore = calculateFinalScore();
        // 判断上下文是否是MainActivity,避免类型转换错误
        if (getContext() instanceof MainActivity) {
            ((MainActivity) getContext()).onGameFinished(playerScore);
        }
    }

    private int calculateFinalScore() {
        return 999;
    }
}

2. 在MainActivity中处理返回逻辑

public class MainActivity extends AppCompatActivity {
    // 供DrawView调用的方法
    public void onGameFinished(int finalScore) {
        Intent resultIntent = new Intent();
        resultIntent.putExtra("KEY_FINAL_SCORE", finalScore);
        setResult(RESULT_OK, resultIntent);
        finish();
    }
}

这种写法虽然简单,但DrawView和MainActivity耦合在一起了,如果以后DrawView要放到其他Activity里就会出问题,所以还是推荐第一种接口回调的方式。

内容的提问来源于stack exchange,提问作者Acy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:13:59