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

GameActivity未接收InventoryActivity返回的Intent数据求助

捉迷藏游戏Activity间数据同步问题

我开发的捉迷藏游戏中,GameActivity为主页面,InventoryActivity供玩家使用道具修改角色生命值等属性。目前可在InventoryActivity中修改生命值,但关闭该页面后,GameActivity无法同步到修改后的数据。先后尝试了废弃的onActivityResult方法和新的ActivityResultContracts.StartActivityForResult方法,问题仍未解决,相关代码如下:


旧方法实现(onActivityResult)

GameActivity的onActivityResult代码

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

        if (requestCode == 1001 && resultCode == RESULT_OK && data != null) {
            ArrayList<Item> itemsFound = data.getParcelableArrayListExtra("ITEMS_FOUND");
            ArrayList<Item> playerInventory = data.getParcelableArrayListExtra("PLAYER_INVENTORY");
            int updatedHearts = data.getIntExtra("CURRENT_PLAYER_HEARTS", 0); 
            currentPlayerIndex = data.getIntExtra("CURRENT_PLAYER_INDEX", 0); 
            Player modifiedPlayer = data.getParcelableExtra("CURRENT_PLAYER"); 
    
    
            if (modifiedPlayer != null) {
                for (int i = 0; i < allPlayers.size(); i++) {
                    Player currentPlayer = allPlayers.get(i);
                    if (currentPlayer.getName().equals(modifiedPlayer.getName())) {
                       
                        allPlayers.set(i, modifiedPlayer);
                       
                        updateHeartsDisplay(modifiedPlayer.getHearts());
                       
                        Log.d("GameActivity", "Joueur mis à jour : " + modifiedPlayer.getName() + ", Points de vie : " + modifiedPlayer.getHearts());
                        break;
                    }
                }
            }
        }
    }

旧方法启动InventoryActivity的代码

private void launchInventoryActivity(Player currentPlayer) {     
    // Prepare data for inventory activity     
    ArrayList<Item> itemsFound = new ArrayList<>();     
    Item lastItemAdded = currentPlayer.getLastItemAdded();     
    if (lastItemAdded != null) {         
        itemsFound.add(lastItemAdded);     
    }     
    ArrayList<Item> playerInventory = new ArrayList<>();     
    playerInventory.addAll(currentPlayer.getItems());      

    Intent inventoryIntent = new Intent(GameActivity.this, InventoryActivity.class);     
    inventoryIntent.putParcelableArrayListExtra("ITEMS_FOUND", itemsFound);     
    inventoryIntent.putParcelableArrayListExtra("PLAYER_INVENTORY", playerInventory);     
    inventoryIntent.putExtra("CURRENT_PLAYER", currentPlayer);       

    inventoryLauncher.launch(inventoryIntent); 
}

InventoryActivity返回数据的代码(新旧方法共用)

private void finishTurn() {
        int currentPlayerIndex = getIntent().getIntExtra("CURRENT_PLAYER_INDEX", 0);
        Intent intent = new Intent();
        intent.putExtra("CURRENT_PLAYER_HEARTS", currentPlayer.getHearts());
        intent.putExtra("CURRENT_PLAYER_INDEX", currentPlayerIndex + 1);
        intent.putExtra("CURRENT_PLAYER", currentPlayer);
        setResult(RESULT_OK, intent);
        finish();
    }

新方法实现(ActivityResultContracts.StartActivityForResult)

GameActivity的回调代码

new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if (result.getResultCode() == RESULT_OK) {
                        // Vérifiez si les données de point de vie sont renvoyées
                        Intent data = result.getData();
                        if (data != null) {
                            int currentPlayerHealth = data.getIntExtra("CURRENT_PLAYER_HEARTS", -1);
                            if (currentPlayerHealth != -1) {
                              
                                Player currentPlayer = data.getParcelableExtra("CURRENT_PLAYER");
                                if (currentPlayer != null) {
                                    currentPlayer.setHearts(currentPlayerHealth);
                                   
                                    updateTurnInfo();
                                }

新方法启动InventoryActivity的代码

private void launchInventoryActivity(Player currentPlayer) {
    ArrayList<Item> itemsFound = new ArrayList<>();
    Item lastItemAdded = currentPlayer.getLastItemAdded();
    if (lastItemAdded != null) {
        itemsFound.add(lastItemAdded);
    }
    ArrayList<Item> playerInventory = new ArrayList<>();
    playerInventory.addAll(currentPlayer.getItems());

    Intent intent = new Intent(GameActivity.this, InventoryActivity.class);
    intent.putParcelableArrayListExtra("ITEMS_FOUND", itemsFound);
    intent.putParcelableArrayListExtra("PLAYER_INVENTORY", playerInventory);
    intent.putExtra("CURRENT_PLAYER", currentPlayer);

    inventoryActivityResultLauncher.launch(intent);
}

排查方向

  • Parcelable实现完整性:Player和Item类必须正确实现Parcelable接口,包括完整的writeToParcel方法和CREATOR实例,否则序列化/反序列化会丢失数据,导致返回的Player对象属性异常或为空。
  • 参数传递遗漏:启动InventoryActivity时未传入CURRENT_PLAYER_INDEX参数,但InventoryActivity的finishTurn方法中尝试获取该值,会使用默认值0,可能导致后续索引处理错误;同时确认InventoryActivity中的currentPlayer对象是否正确初始化并完成修改。
  • 回调逻辑完整性:新方法的回调代码存在语法不完整(缺少闭合大括号),会导致部分逻辑无法执行;旧方法中使用inventoryLauncher.launch启动页面,而onActivityResult依赖requestCode判断,若inventoryLauncher是新的ActivityResultLauncher,旧的onActivityResult不会被触发。
  • UI更新逻辑验证:新方法回调调用updateTurnInfo(),旧方法调用updateHeartsDisplay(),需确认这两个方法是否在主线程执行,且正确绑定并更新了GameActivity的UI控件。
  • 日志调试:在InventoryActivity的finishTurn方法中添加日志,打印currentPlayer.getHearts()和currentPlayer的属性;在GameActivity的回调方法中打印返回的currentPlayerHealth和currentPlayer对象,确认数据是否正确传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:27:09