不将数据发送到下一个活动,而是发送到之后的活动(使用 parcelable)

Posted

技术标签:

【中文标题】不将数据发送到下一个活动,而是发送到之后的活动(使用 parcelable)【英文标题】:Send data not to next activity, but the one after (using parcelable) 【发布时间】:2018-04-22 17:10:17 【问题描述】:

假设在活动 A(得分)中,我创建了自定义类 Player 的实例。如何将这些对象发送到 Activity C,而无需在 Activity B (SelectGamemode) 中处理它们?这就是我通过 Parcelable 将对象从 Activity A 发送到 B 的方式。

btnNewRound = (Button) findViewById(R.id.btnNewRound);
btnNewRound.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        Intent intent = new Intent(Score.this, SelectGamemode.class);
        Bundle bundle = new Bundle();
        bundle.putParcelable("EXTRA_PLAYER_1", player1);
        bundle.putParcelable("EXTRA_PLAYER_2", player2);
        bundle.putParcelable("EXTRA_PLAYER_3", player3);
        bundle.putParcelable("EXTRA_PLAYER_4", player4);
        intent.putExtras(bundle);
        startActivity(intent);
    
);

现在我可以像这样在 Activity B 中访问我的 Player 对象:

player1= (Player)getIntent().getParcelableExtra("EXTRA_PLAYER_1");

然后在 Activity B 中,我基本上会使用与 Activity A 中相同的代码将 Player 对象发送到 Activity C,尽管我什至不使用 Activity B 中的对象。如何避免这种情况?谢谢!

【问题讨论】:

您可以使用共享首选项或数据库吗?随时随地获取它们。 使用共享首选项或数据库,或者通过第二个活动,可能不使用它,然后再到第三个,即使它显然效率较低 我去试试数据库,谢谢! 【参考方案1】:

听起来你目前有这个活动流程:

A -> B -> C

也许更好的流程是:

A -> B
B returns result to A
A -> C

我是从您的一些小问题中推断出来的,但听起来活动 A 负责创建玩家,活动 B 负责选择游戏模式。然后活动 C 获取玩家和选定的游戏模式,并对他们做一些事情。以下是一些伪代码,说明如何将我的建议应用于这种情况:

// in Activity A
public void startChooseGameMode() 
    Intent intent = new Intent(this, ActivityB.class);
    startActivityForResult(intent, 123); // 123 is an example requestCode


public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    if (reqeustCode == 123) 
        if (resultCode == Activity.RESULT_OK) 
            GameMode mode = data.getParcelableExtra("EXTRA_GAME_MODE");

            Intent intent = new Intent(this, ActivityC.class);
            intent.putExtra("EXTRA_GAME_MODE", mode);
            intent.putExtra("EXTRA_PLAYER_1", player1);
            intent.putExtra("EXTRA_PLAYER_2", player2);
            intent.putExtra("EXTRA_PLAYER_3", player3);
            intent.putExtra("EXTRA_PLAYER_4", player4);

            startActivity(intent);
        
        else 
            // handle the error/cancellation
        
    


// in Activity B
public void chooseGameMode(GameMode mode) 
    Intent data = new Intent();
    data.putExtra("EXTRA_GAME_MODE", mode);

    setResult(Activity.RESULT_OK, data);
    finish();

在某些方面,这与您原来的问题是同一个问题,只是方向不同;现在活动 A 必须知道活动 B 的 GameMode 结果,即使它不直接使用它。我认为这没关系。您可以将 Activity A 视为负责收集启动 Activity C 所需的所有数据...也许在未来,您会以不同的方式创建玩家,并将该工作卸载到第四个 Activity。

【讨论】:

以上是关于不将数据发送到下一个活动,而是发送到之后的活动(使用 parcelable)的主要内容,如果未能解决你的问题,请参考以下文章

Android 相机拍照并保存或发送到下一个活动

在android中单击列表活动时将列表项的静态图像和文本发送到下一个活动

将活动之间的数据从列表视图传递到另一个活动

将数据传递到上一个活动并使用相同的按钮移动到下一个

将活动发送到后台而不完成

使用 AJAX 和 jQuery 验证 From 而不将数据发送到另一个文件