ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一个场景,在通过登录页面登录后,每个 activity 上都会有一个退出 button

单击 sign-out 时,我将传递已登录用户的 session id 以退出。谁能指导我如何让所有 activities 都可以使用 session id

这种情况的任何替代方案

我使用了 sharedpreference,它也有助于将登录数据保存在记住密码功能上
这对我有用。 stackoverflow.com/a/7325248/2125322 感谢达山计算
stackoverflow.com/a/37774966/6456129 可能会有所帮助
对于这种情况,请尝试使用 sharedprefereces 方法制作 commomUtils 类...这将使代码保持干净和相关数据在一个地方。并且您只需使用一种清除特定 prefrencesFile 的方法即可轻松清除特定数据集,而无需清除任何默认应用程序数据...

A
ADM

在您当前的 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
}

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


只是为像我这样盲目的人提供的信息:如果您在当前活动中放入一个整数,则必须通过 extras.getInt("new_variable_name") 将其放入新活动中。如果您尝试通过 getString() android 获取它,则会看到给出了一个 int 并返回 null!
如果活动已经在运行,是否需要执行 startActivity(i); ?我的意思是,我可以让 activity A 调用 activity B,并将数据返回给 activity A 吗?我很困惑吗?
我更喜欢字符串变量。您始终可以稍后将字符串转换为整数或浮点数。
@FranciscoCorralesMorales 你有什么发现吗?
J
Jens Piegsa

执行此操作的最简单方法是将会话 ID 传递给您用于启动活动的 Intent 中的注销活动:

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

访问下一个活动的意图:

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

Intents 的 docs 包含更多信息(查看标题为“Extras”的部分)。


好的,如果我在成功登录时将会话 ID 传递给注销活动,它会在任何活动页面上工作以注销还是手动我将不得不为每个活动分配它的值???使用上述程序??
是的,您必须让会话 ID 可用于您希望允许用户注销的每个活动。或者,您可以将其存储在 Application 对象中,但是您必须管理会话的状态(在使用之前检查它是否有效等)。
请注意,文档指出以下几点:向意图添加扩展数据。该名称必须包含包前缀,例如应用程序 com.android.contacts 将使用类似“com.android.contacts.ShowAll”的名称。
要从其他 Activity 读取数据,请使用 Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
我们如何使用 setData 传递数据,这两种方法有什么区别?哪一个更好?
J
Jeremy Logan

正如 Erich 所指出的,传递 Intent extras 是一种很好的方法。

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

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

另请记住,您可能会看到的其他方法(例如静态方法)可能会出现问题,因为它们can lead to memory leaks。应用程序也有助于解决这个问题。


+1 用于静力学问题。可能清理可以通过将单例与 onCreate/onTerminate 方法应用程序类相结合来解决。
嘿,我知道这个帖子很久以前了,但现在提供的链接是死胡同。有什么地方可以找到这个例子吗?
@JuiCe Android 开发者关于内存泄漏的博文不再无效。
P
Peter Mortensen

源类:

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");
}

意图可以为空吗?我们应该检查它不为空吗?
V
Vasily Kabunov

您只需要在调用您的意图时发送附加信息。

像这样:

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

现在,在 SecondActivityOnCreate 方法上,您可以像这样获取额外内容。

如果您发送的值在 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);

请注意,文档指出以下几点:向意图添加扩展数据。该名称必须包含包前缀,例如应用程序 com.android.contacts 将使用类似“com.android.contacts.ShowAll”的名称。
这是投票最多的答案的副本,该答案在此答案之前已存在 2 年,而 Sahil Mahajan Mj's answer 则比该答案早 1 年。唯一的区别:booleanlong getter 的示例值得 IMO 评论,而不是答案。
S
Suragch

它帮助我在上下文中看待事物。这里有两个例子。

转发数据

https://i.stack.imgur.com/1bUb2.png

主要活动

将要发送的数据放入带有键值对的 Intent 中。有关密钥的命名约定,请参见此答案。

使用 startActivity 启动第二个 Activity。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

第二次活动

您使用 getIntent() 来获取启动第二个活动的 Intent。然后,您可以使用 getExtras() 和您在第一个活动中定义的键提取数据。由于我们的数据是一个字符串,我们将在这里使用 getStringExtra。

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

传回数据

https://i.stack.imgur.com/sMric.png

主要活动

使用 startActivityForResult 启动第二个活动,为其提供任意结果代码。

覆盖 onActivityResult。当第二个活动完成时调用它。您可以通过检查结果代码来确定它实际上是第二个活动。 (当您从同一个主要活动开始多个不同活动时,这很有用。)

提取从返回 Intent 中获得的数据。使用键值对提取数据。我可以使用任何字符串作为键,但我将使用预定义的 Intent.EXTRA_TEXT,因为我正在发送文本。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

第二次活动

将要发送回上一个活动的数据放入 Intent 中。数据使用键值对存储在 Intent 中。我选择使用 Intent.EXTRA_TEXT 作为我的密钥。

将结果设置为 RESULT_OK 并添加保存数据的意图。

调用 finish() 关闭第二个 Activity。

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

哇谢谢你!这正是我想要的。很明显,当使用相机或其他外部设备时,我期望得到结果,但我没想到在内部使用它。你是第一个如此公开地表达它的人。
a
angryITguy

更新请注意,我已经提到了 SharedPreference 的使用。它有一个简单的 API,并且可以跨应用程序的活动进行访问。但这是一个笨拙的解决方案,如果您传递敏感数据,则会带来安全风险。最好使用意图。它有一个广泛的重载方法列表,可用于更好地在活动之间传输许多不同的数据类型。看看intent.putExtra。这个 link 很好地展示了 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, ...));
...

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


我最喜欢你的回答......通过意图传递它意味着几乎在我开始一项活动的任何地方你都必须记住包含 sessionId。通过将它放在 SharedPreferences 中,您可以随时从任何活动中获取它。 :0)
@bytebender我知道这有点晚了,我很感激你喜欢我原来的答案,因为它很简单,但我会小心地将会话 ID 存储在共享首选项中。如果您必须将其存储在硬盘上,请使用加密。如果您可以使用采用 JWT 的身份验证框架,它将包含对长期存储更安全的 refreshTokens,然后将当前会话令牌保留为自定义应用程序对象的公共属性,以便轻松访问身份验证令牌,并减少活动开销意图签名。
p
ponkin

尝试执行以下操作:

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

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);

并发送此 Intent。在目标活动中,您的字段将可用作:

getIntent().getStringExtra("YOUR_FIELD_NAME");

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


V
Vaibhav Sharma

您还可以通过创建 parcelable 类来传递自定义类对象。使其可打包的最佳方法是编写您的课程,然后简单地将其粘贴到像 http://www.parcelabler.com/ 这样的网站。单击构建,您将获得新代码。复制所有这些并替换原始课程内容。然后-

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

并在 NextActivity 中获得结果,例如-

Foo foo = getIntent().getExtras().getParcelable("foo");

现在您可以像之前使用的那样简单地使用 foo 对象。


佚名

另一种方法是使用存储数据的公共静态字段,即:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

我真的很想知道为什么你的建议没有得到投票,它更简单,更实用。
嗯……这不违反面向对象的原则吗?
@ChristianVielma 好吧,它更像是一个灰色区域...您可以通过多种方式做到这一点,对我来说这似乎是一个干净的“逃脱”,所以...由您(开发人员)决定是否它对你有用与否,我喜欢这种方式,因为它更容易理解,但它会很快变得很脏......
为什么你说这会变脏? iOS不是通过设置与此类似的“属性”来在视图控制器之间传递数据吗?这比使用意图要容易得多
是的,您在视图控制器之间传递数据,但不能使用静态属性。问题是它不是所需活动实例的属性。 Android 通过 startActivity() 启动活动的方式,它不会立即实例化对象并允许开发人员设置实例变量。这很烦人...
P
Peter Mortensen

在活动之间传递数据最方便的方法是传递意图。在您要发送数据的第一个活动中,您应该添加代码,

String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);

您还应该导入

import android.content.Intent;

然后在下一个 Acitvity(SecondActivity) 中,您应该使用以下代码从意图中检索数据。

String name = this.getIntent().getStringExtra("name");

这是已存在 1 年以上的 top most voted answer 的副本。
P
Peter Mortensen

您可以使用 SharedPreferences...

记录。 SharedPreferences 中的时间存储会话 ID SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);编辑器 editor = preferences.edit(); editor.putString("sessionId", sessionId); editor.commit();登出。 sharedpreferences 中的时间获取会话 id SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE); String sessionId = preferences.getString("sessionId", null);

如果您没有所需的会话 ID,则删除 sharedpreferences:

SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();

这非常有用,因为有一次您保存该值,然后在任何地方检索活动。


d
demo

从活动

 int n= 10;
 Intent in = new Intent(From_Activity.this,To_Activity.class);
 Bundle b1 = new Bundle();
 b1.putInt("integerNumber",n);
 in.putExtras(b1);
 startActivity(in);

到活动

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }

A
Ajay Venugopal

标准方法。

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

现在在您的第二个活动中从包中检索您的数据:

获取捆绑包

Bundle bundle = getIntent().getExtras();

提取数据…

String stuff = bundle.getString(“stuff”); 

PRABEESH R K 在 2012 年提出的重复。并且可以简化为其他 6 个答案提出的 i.putExtras()/getIntent().getString()...
K
Khemraj Sharma

科特林

从第一个活动通过

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

参加第二个活动

val value = intent.getStringExtra("key")

建议

始终将密钥放在常量文件中以获得更多管理方式。

companion object {
    val KEY = "key"
}

val value = intent.getStringExtra("key")
R
Raceimaztion

您可以使用意图对象在活动之间发送数据。假设您有两个活动,即 FirstActivitySecondActivity

在 FirstActivity 内部:

使用意图:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

SecondActivity里面

Bundle bundle= getIntent().getExtras();

现在您可以使用不同的 bundle 类方法通过 Key 获取从 FirstActivity 传递的值。

例如 bundle.getString("key")bundle.getDouble("key")bundle.getInt("key") 等。


重复:基于 Bundle 的方法已由 PRABEESH R K 在 2012 年和 Ajay Venugopal 提出。并且可以简化为其他 7 个答案提出的 i.putExtras()/getIntent().getString()...
c
capt.swag

如果要在 Activity/Fragments 之间传输位图

活动

在 Activity 之间传递位图

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

在 Activity 类中

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

分段

在 Fragment 之间传递位图

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

在 SecondFragment 内接收

Bitmap bitmap = getArguments().getParcelable("bitmap");

传输大位图

如果您遇到失败的活页夹事务,这意味着您通过将大元素从一个活动转移到另一个活动而超出了活页夹事务缓冲区。

因此,在这种情况下,您必须将位图压缩为一个字节的数组,然后在另一个活动中解压缩它,就像这样

在第一个活动中

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

而在 SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

P
Peter Mortensen
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

您可以在另一个活动中检索它。两种方式:

int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);

第二种方式是:

Intent i = getIntent();
String name = i.getStringExtra("name");

C
Community

补充答案:密钥字符串的命名约定

传递数据的实际过程已经得到解答,但是大多数答案都使用硬编码字符串作为 Intent 中的键名。当仅在您的应用程序中使用时,这通常很好。但是,documentation recommends 使用 EXTRA_* 常量用于标准化数据类型。

示例 1:使用 Intent.EXTRA_*

第一项活动

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

第二个活动:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

示例 2:定义您自己的 static final

如果其中一个 Intent.EXTRA_* 字符串不适合您的需要,您可以在第一个活动开始时定义自己的字符串。

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

如果您仅在自己的应用程序中使用密钥,则包含包名称只是一种约定。但是,如果您正在创建其他应用程序可以使用 Intent 调用的某种服务,则必须避免命名冲突。

第一项活动:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

第二个活动:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

示例 3:使用字符串资源键

尽管文档中没有提到,this answer 建议使用字符串资源来避免活动之间的依赖关系。

字符串.xml

 <string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>

第一项活动

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

第二个活动

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

T
THANN Phearum

这是我的最佳实践,当项目庞大而复杂时,它会很有帮助。

假设我有 2 个活动,LoginActivityHomeActivity。我想将 2 个参数(用户名和密码)从 LoginActivity 传递给 HomeActivity

首先,我创建了我的 HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

这是我在 LoginActivity 中传递数据的方式

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

最后一步,这是我在 HomeActivity 中接收数据的方式

public class HomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

完毕!酷:) 我只是想分享我的经验。如果您从事小型项目,这应该不是大问题。但是当你在做一个大项目时,当你想要重构或修复错误时真的很痛苦。


P
Peter Mortensen

活动之间的数据传递主要是通过一个意图对象。

首先,您必须使用 Bundle 类将数据附加到意图对象。然后使用 startActivity()startActivityForResult() 方法调用活动。

您可以通过博文中的示例Passing data to an Activity 找到有关它的更多信息。


这是使用 Intent provided methods directly (Intent#putExtra()) 的 more or less the same。但是添加了另一个 Bundle 并使事情变得更加复杂。
R
Rohit Gurjar

您可以尝试 Shared Preference,它可能是在活动之间共享数据的好选择

保存会话 ID -

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

为了得到他们——

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);

重复:此方法已由 Ravi Parsania 在 2014 年提出
r
robe007

您可以使用 Intent

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

另一种方法也可以使用单例模式:

public class DataHolder {

 private static DataHolder dataHolder;
 private List<Model> dataList;

 public void setDataList(List<Model>dataList) {
    this.dataList = dataList;
 }

 public List<Model> getDataList() {
    return dataList;
 }

 public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
 }
}

从您的 FirstActivity

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

在 SecondActivity

private List<Model> dataList = DataHolder.getInstance().getDataList();

重复:意图方法已由 top most voted answerSahil Mahajan Mj's answer 以及 Mayank Saini's answerMd. Rahman's answerDilavar M's answerandroid developer's answersahulab 提出。辛格尔顿:Rodion Altshuler 回答
D
Diesel

第一种方式:在您当前的活动中,当您创建意图对象以打开新屏幕时:

  String value="xyz";
  Intent intent = new Intent(CurrentActivity.this, NextActivity.class);    
  intent.putExtra("key", value);
  startActivity(intent);

然后在 onCreate 方法的 nextActivity 中,检索您从上一个活动传递的那些值:

  if (getIntent().getExtras() != null) {
      String value = getIntent().getStringExtra("key");
      //The key argument must always match that used send and retrive value from one activity to another.
  }

第二种方式:您可以创建捆绑对象并将值放入捆绑中,然后将捆绑对象放入当前活动的意图中 -

  String value="xyz";
  Intent intent = new Intent(CurrentActivity.this, NextActivity.class);  
  Bundle bundle = new Bundle();
  bundle.putInt("key", value);  
  intent.putExtra("bundle_key", bundle);
  startActivity(intent);

然后在 onCreate 方法的 nextActivity 中,检索您从上一个活动传递的那些值:

  if (getIntent().getExtras() != null) {
      Bundle bundle = getIntent().getStringExtra("bundle_key");    
      String value = bundle.getString("key");
      //The key argument must always match that used send and retrive value from one activity to another.
  }

您还可以使用 bean 类通过序列化在类之间传递数据。


m
marc_s

通过 Bundle Object 从此活动传递参数开始另一个活动

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

检索另一个活动 (YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

这对于简单类型的数据类型是可以的。但是如果你想在活动之间传递复杂的数据,你需要先序列化它。

这里我们有员工模型

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

您可以使用谷歌提供的Gson lib来序列化这样的复杂数据

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);

O
Oleg Vaskevich
/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}

D
Darius

我最近发布了 Vapor API,这是一个 jQuery 风格的 Android 框架,它使各种类似的任务变得更简单。如前所述,SharedPreferences 是您可以执行此操作的一种方式。

VaporSharedPreferences 实现为 Singleton,因此这是一种选择,并且在 Vapor API 中,它具有重载的 .put(...) 方法,因此您不必明确担心您提交的数据类型 - 只要它受支持。它也很流畅,因此您可以链接调用:

$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);

它还可以选择自动保存更改,并在后台统一读取和写入过程,因此您无需像在标准 Android 中那样显式检索编辑器。

或者,您可以使用 Intent。在 Vapor API 中,您还可以在 VaporIntent 上使用可链接的重载 .put(...) 方法:

$.Intent().put("data", "myData").put("more", 568)...

并将其作为额外的传递,如其他答案中所述。您可以从 Activity 中检索额外内容,此外,如果您使用 VaporActivity,则会自动为您完成此操作,因此您可以使用:

this.extras()

要在您切换到的 Activity 的另一端检索它们。

希望这对某些人感兴趣:)


@BaneeIshaqueK 是的,抱歉,已经有一段时间没有维护了。已更新链接以直接指向项目的 Github,以防万一。附言。不知道我在想什么许可证......道歉
N
Nico Haase

第一个活动:

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

第二个活动:

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

T
The Billionaire Guy

在 CurrentActivity.java 中编写以下代码

Intent i = new Intent(CurrentActivity.this, SignOutActivity.class);
i.putExtra("SESSION_ID",sessionId);
startActivity(i);

SignOutActivity.java 中的访问 SessionId 如下方式

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_out);
    Intent intent = getIntent();
    
    // check intent is null or not
    if(intent != null){
        String sessionId = intent.getStringExtra("SESSION_ID");
        Log.d("Session_id : " + sessionId);
    }
    else{
        Toast.makeText(SignOutActivity.this, "Intent is null", Toast.LENGTH_SHORT).show();
    }
}

@Murmel,我觉得这很简单,并且不像其他人那样包含一些不必要的代码。此外,它不是一个精确的复制粘贴的。也许他无法检查所有可能的 53 个答案?当我使用 Ctrl+F 搜索“putex”页面时,这首先出现在我身上。看到同样的代码,我松了一口气;它也不臃肿。
P
Patricia

使用全局类:

public class GlobalClass extends Application
{
    private float vitamin_a;


    public float getVitaminA() {
        return vitamin_a;
    }

    public void setVitaminA(float vitamin_a) {
        this.vitamin_a = vitamin_a;
    }
}

您可以从所有其他类中调用该类的 setter 和 getter。这样做,您需要在每个活动中创建一个 GlobalClass-Object:

GlobalClass gc = (GlobalClass) getApplication();

然后你可以调用例如:

gc.getVitaminA()

覆盖应用程序 - 这是 Whome's answer 的副本