题 如何在Android应用程序中的活动之间传递数据?


我有一个场景,通过登录页面登录后,将有一个注销 button 在各个 activity

点击 sign-out,我将通过 session id 登录用户登出。任何人都可以指导我如何保持 session id 适用于所有人 activities

这种情况的任何替代方案


1055
2018-01-19 06:06


起源


我使用sharedpreference,它也有用于保持记录密码功能的登录数据 - shareef
这对我有用。 stackoverflow.com/a/7325248/2125322  谢谢Darshan Computing - matasoy
stackoverflow.com/a/37774966/6456129 可能会有所帮助 - Yessy
可能重复 如何在android中维护会话? - Yatin


答案:


最简单的方法是将会话ID传递给中的注销活动 Intent 你用来开始活动:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

访问意图下一个活动

String sessionId= getIntent().getStringExtra("EXTRA_SESSION_ID");

文档 Intent有更多信息(请参阅标题为“Extras”的部分)。


975
2018-01-19 06:12



好吧,如果我在成功登录时将会话ID传递给注销活动,并且它可以在任何活动页面上工作以注销或手动我必须在每个活动上分配它的价值???用上面的程序? - UMAR
是的,您必须为要允许用户注销的每个活动提供会话ID。或者,您可以将其存储在Application对象中,但是您必须管理会话的状态(在使用之前检查它是否有效等)。 - Erich Douglass
那只是答案的一半!现在如何阅读新活动中的额外信息? - Leander
Leander - 请参阅下面的user914425的答案,以获得更完整的回复。 stackoverflow.com/a/7325248/800505 - Warren Sergent
我们如何使用传递数据 setData 这两种方法有什么区别?哪一个更好? - H. Aqjn


在当前的Activity中,创建一个新的 Intent

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

然后在新的Activity中,检索这些值:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

使用此技术将变量从一个Activity传递到另一个Activity。


1310
2017-09-06 19:41



对于像我这样盲目的人来说,只是一个信息:如果你在当前的活动中加入一个整数,你必须通过一个整数来获取它 extras.getInt("new_variable_name")。如果你试图通过它 getString() android看到给出了一个int并返回null! - bish
使用旅行车。它使它更简单: github.com/beplaya/Wagon - beplaya
如果活动已经在运行,那么需要做什么 startActivity(i); ?我的意思是,我可以做 活动A. 呼叫 活动B.,并返回数据 活动A. ?我很困惑吗? - Francisco Corrales Morales
这是一个 设置和检索intent extras的好例子 - drorw
我更喜欢字符串变量。您始终可以将字符串转换为整数或稍后浮动。 - user914425


通过 意图 Erich指出,额外设施是一种很好的方法。

应用 对象是另一种方式,有时在跨多个活动处理相同的状态时更容易(而不是必须将它放到任何地方),或者比原语和字符串更复杂的对象。

您可以扩展Application,然后设置/获取您想要的任何内容,并从任何Activity(在同一个应用程序中)访问它 getApplication()

另外请记住,您可能会看到的其他方法(如静力学)可能会有问题,因为它们 可能导致内存泄漏。应用程序也有助于解决此问


120
2018-01-20 03:55



为静力学问题+1。可能通过将单例与onCreate / onTerminate方法Application类组合来解决清理问题。 - Syd
你能解释一下还是指点我用它。 - Harsha M V
嘿,我知道这个帖子已经有一段时间了,但提供的链接现在已经过时了。有什么地方我可以找到这个例子吗? - JuiCe
如何使用Application实现这一目标? @CharlieCollins - Banee Ishaque K
我想这将是: stackoverflow.com/a/20584974/3333438 , 对? - Banee Ishaque K


来源类:

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

目标类(NewActivity类):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String fName = intent.getStringExtra("firstName");
    String lName = intent.getStringExtra("lastName");
}

78
2018-02-06 12:23



意图可以为空吗?我们应该检查它是否为空? - Micro
这是3年前的复制品 最受欢迎的答案 和 Sahil Mahajan Mj的回答 和 Mayank Saini的回答 - Murmel


你只需要在调用你的意图时发送额外内容。

喜欢这个:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

现在上了 OnCreate 你的方法 SecondActivity 你可以像这样获取额外的东西。

如果您发送的值是 long

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

如果您发送的值是 String

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

如果您发送的值是 Boolean

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);

71
2018-05-24 11:26



请注意,文档指出了以下内容:将扩展数据添加到intent中。名称必须包含包前缀,例如app com.android.contacts将使用“com.android.contacts.ShowAll”之类的名称。 - Serguei Fedorov
这是最高投票答案的副本,在答案之前已经有2年了 Sahil Mahajan Mj的回答 这是1岁。唯一的区别:例子 boolean 和 long 值得评论的吸气剂IMO,而不是答案。 - Murmel


更新 请注意,我曾提到过使用 SharedPreference。它有一个简单的API,可以在应用程序的活动中访问。但这是一个笨拙的解决方案,如果您传递敏感数据,则存在安全风险。最好使用意图。它有一个广泛的重载方法列表,可用于在活动之间更好地传输许多不同的数据类型。看一下 intent.putExtra。这个 链接 很好地介绍了putExtra的用法。

在活动之间传递数据时,我首选的方法是为相关活动创建一个静态方法,其中包括启动意图所需的参数。然后,它提供了轻松设置和检索参数。所以它看起来像这样

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

然后,您可以为预期活动创建意图并确保拥有所有参数。你可以适应片段。上面是一个简单的例子,但你明白了。


37
2018-02-17 03:06



我最喜欢你的答案......通过意图传递它意味着几乎在我开始活动的每个地方你都必须记住包含sessionId。通过将其放入SharedPreferences,您可以随时从任何活动中获取它。 :0) - bytebender


尝试执行以下操作:

创建一个简单的“帮助器”类(您的Intents的工厂),如下所示:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

这将是您所有意图的工厂。每次需要新的Intent时,在IntentHelper中创建一个静态工厂方法。要创建一个新的Intent,你应该这样说:

IntentHelper.createYourSpecialIntent(getIntent());

在你的活动中。如果要在“会话”中“保存”某些数据,请使用以下命令:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

并发送此意图。在目标活动中,您的字段将显示为:

getIntent().getStringExtra("YOUR_FIELD_NAME");

所以现在我们可以像使用相同的旧会话一样使用Intent(就像在servlet中一样) JSP)。


30
2018-01-19 07:16