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

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

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

这种情况的任何替代方法

答案

在您当前的活动中,创建一个新的Intent

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

然后在新的活动中,检索以下值:

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

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

最简单的方法是将会话 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 文档提供了更多信息(请参阅标题为 “其他” 的部分)。

正如 Erich 指出的那样,传递Intent Extras 是一个好方法。

但是, Application对象是另一种方式,跨多个活动处理同一状态(而不是必须将其放置 / 放置到任何地方)或对象比原语和 String 更复杂时,有时会更容易。

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

还请记住,您可能会看到的其他方法(例如静态方法)可能会出现问题,因为它们可能导致内存泄漏 。应用程序也可以帮助解决此问题。

源类:

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

您只需要在发送意向时发送额外内容。

像这样:

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

更新的注释,我已经提到了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, ...));
...

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

它帮助我从上下文中看到事物。这是两个例子。

转发数据

在此处输入图片说明

主要活动

  • 将您要发送的数据与键值对一起放入 Intent 中。请参阅此答案以获取密钥的命名约定。
  • 使用startActivity启动第二个活动。

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

传回数据

在此处输入图片说明

主要活动

  • 使用startActivityForResult启动第二个 Activity,并为其提供任意结果代码。
  • 覆盖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()关闭第二个活动。

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

尝试执行以下操作:

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

import android.content.Intent;

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

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

IntentHelper.createYourSpecialIntent(getIntent());

在您的活动中。当您想 “保存”“会话” 中的某些数据时,只需使用以下命令:

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

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

getIntent().getStringExtra("YOUR_FIELD_NAME");

因此,现在我们可以像以前的旧会话一样使用 Intent(例如在 servlet 或JSP 中 )。

您还可以通过创建可拆分的类来传递自定义类对象。使其可拆分的最好方法是编写您的类,然后将其简单地粘贴到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;

//...