在活动之间发送数据,同时跳过一个中间活动

Posted

技术标签:

【中文标题】在活动之间发送数据,同时跳过一个中间活动【英文标题】:Send data between activities while skipping one middle activity 【发布时间】:2021-10-31 07:00:13 【问题描述】:

我有一个包含三个活动的简单登录应用程序。

ActivityA 是启动器活动和登录屏幕。 ActivityB 有两个按钮,“配置”和“退出”。而ActivityC是设置新用户名和密码的界面。

我还有一个名为 User 的类。

我需要将数据从ActivityA 发送到ActivityC。该数据是一个用户对象,具有密码和用户名的默认值。

这是我需要做的步骤,按顺序:

1 - 使用ActivityA 启动应用程序,然后单击一个按钮(“登录”)将我发送到ActivityB

2 - 然后,在ActivityB 中,我需要单击另一个按钮(“配置”),该按钮应将我发送至ActivityC

3 - 从ActivityC,我设置了一个新密码和用户名,然后单击一个按钮(“确认”),该按钮应将我发送回ActivityA。 在ActivityA,我需要来自ActivityC 的数据。该数据是一个用户对象,其中包含密码和用户名的新值。

这是活动 A、B 和 C 的屏幕,因此更容易理解。

这里是ActivityA

这里是ActivityB

这里是ActivityC

到目前为止,我已经完成了第 1 步和第 2 步。但我不知道如何在不启动 ActivityC 的情况下将数据从 ActivityA 发送到 ActivityC,因为单击 ActivityA 中的按钮时,我'会打电话给ActivityB。但是数据仍然需要提供给ActivityC

我目前正在将数据从ActivityA 传递到ActivityB,然后再传递到ActivityC。这样可行。但我想知道这是否不必要以及是否有更好的方法。因为虽然我目前只有 3 个活动,但如果我有更多活动,继续像这样链接活动会变得很复杂,对吧? 到目前为止,我只知道如何使用 Intent 传递数据。

如果可能的话,我还想传递完整的对象。而不是仅仅传递所述对象的字段(String、int 等)。

如果有办法,我该如何实现?谢谢。

【问题讨论】:

你可以将数据从活动 A 发送到活动 B 吗? 就像我说的,我可以将数据从 A 发送到 B 到 C。但我想知道是否有办法避免这种情况。因为虽然我现在只有 3 个活动,但如果我有更多活动,将所有活动链接在一起会有点复杂,以便我可以传递数据。 【参考方案1】:

如果我理解您的问题,最好的方法是使用Intentactivity c 发送数据并将其显示在activity a

以及这里如何使用 Intent:

Intent SendData = new Intent(ActivityC.this, ActivityA.class);
SendData.putExtra("user_name", NewUserEditText.getText().toString();
SendData.putExtra("password", PasswordEditText.getText().toString();

startActivity(SendData);

然后返回您的登录活动您要在其中获取/接收这些值并执行此操作。

//here your edit text where you will put value
EditText userEditText = findViewById(R.id.user_edit_text);
EditText passwordEditText = findViewById(R.id.password_edit_text);

//this string to fetch/receive user_name and password Values from activity C...
//You should write getStringExtra value the same as you wrote it in activity C...
String name = getIntent.getStringExtra("user_name");
String password = getIntent.getStringExtra("user_name");

///set values inside edit text...
userEditText.setText(name); 
passwordEditText.setText(password);

要一次性输入值并在每次打开应用程序时接收它,您应该使用SharedPreferences

这里怎么做.. 在活动 C

//create Shared Preferences...
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
Editor editor = pref.edit();

// get values from EditText ..
String name_string= NewUserEditText.getText().toString();
String password_string = PasswordEditText.getText().toString();

//Storing data as KEY/VALUE pair
editor.putString("user_name", name_string);     // Saving  name string

editor.putString("password", password_string );  // Saving password string

// to Save the changes in SharedPreferences
editor.apply(); // commit changes

然后回到活动 a ..您想要接收存储值的地方


String name =pref.getString("user_name", "enter user name");         // getting name String
String password=pref.getString("password", "");        // getting password String

/*
*If value for key not exist then return second param value
* if values here don't exist in (ex. user_name), it will return "enter user name"
*/

//use these values in EditText
UsernameEditText.setText(name);
PasswordEditText.setText(password);

您将只输入一次值,当您再次打开应用程序时,值将出现在活动 a ...并且当您更改它们时,值将更改 ...

希望对你有帮助

【讨论】:

不一定要使用 Intent。我正在研究使用共享首选项。我只是不知道该怎么做。但我会试试你的方法。谢谢! 但是如何将数据从 ActivityA 传递到 ActivityC?这实际上是我的主要问题。 你可以用同样的方式传递数据.. 从活动 a 发送 Intent 并在活动 c 中接收它 但是如果不启动活动 C,我该怎么做呢?我很抱歉,但我有点困惑。你能演示一下吗? 是的,在这种情况下,您应该使用SharedPreferences,它将帮助您存储 stringintlong值..并随时获取它们【参考方案2】:

为此使用共享偏好。 https://developer.android.com/training/data-storage/shared-preferences

【讨论】:

但是我可以使用共享首选项传递自定义对象吗?它似乎有内置的方法,如 putString 或 putInt,但是如果我要传递的数据是自定义对象怎么办? 为什么需要 pass 对象?例如,只需将对象的字段(名称、密码等)作为字符串传递。 没有办法传递完整的对象吗?

以上是关于在活动之间发送数据,同时跳过一个中间活动的主要内容,如果未能解决你的问题,请参考以下文章

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

如果它们之间有一个活动,我想通过意图发送选定的数据

在两个活动之间传输数据[重复]

如何在后台的两个 android 活动之间交换数据以通过蓝牙发送数据?

在活动之间发送监听器

如何在 FAB 按钮单击时将数据从多个片段发送到单个活动