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
相关产品推荐
相关产品推荐

