1469

我有一个场景,通过登录页面登录后button,每个activity.

单击sign-out时,我将传递已session id登录用户的注销。谁能指导我如何保持session id对所有人可用activities

这种情况的任何替代方案

4

53 回答 53

1462

在您当前的活动中,创建一个新的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
}

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

于 2011-09-06T19:41:23.923 回答
1429

最简单的方法是将会话 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的文档有更多信息(查看标题为“Extras”的部分)。

于 2010-01-19T06:12:08.557 回答
148

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

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

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

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

于 2010-01-20T03:55:37.607 回答
103

源类:

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");
}
于 2014-02-06T12:23:40.720 回答
89

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

像这样:

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);
于 2013-05-24T11:26:39.473 回答
63

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

转发数据

在此处输入图像描述

主要活动

  • 将要发送的数据放入带有键值对的 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,为其提供任意结果代码。
  • 覆盖onActivityResult。当第二个活动完成时调用它。您可以通过检查结果代码来确定它实际上是第二个活动。(当您从同一个主要活动开始多个不同活动时,这很有用。)
  • 提取从 return 中获得的数据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();
    }
}
于 2017-08-31T10:35:53.143 回答
50

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

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

于 2011-02-17T03:06:45.110 回答
41

尝试执行以下操作:

创建一个简单的“助手”类(您的 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中)。

于 2010-01-19T07:16:53.710 回答
31

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

于 2016-02-15T09:58:16.563 回答
24

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

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...
于 2012-10-25T22:34:50.067 回答
23

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

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");
于 2012-08-27T06:46:20.380 回答
22

你可以使用SharedPreferences...

  1. 记录。时间存储会话 IDSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
    
  2. 登出。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();

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

于 2014-10-21T10:30:33.563 回答
20

从活动

 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");
  }
于 2016-06-23T01:44:07.877 回答
19

标准方法。

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

提取数据……</p>

String stuff = bundle.getString(“stuff”); 
于 2015-01-28T12:47:23.873 回答
14

科特林

从第一个活动通过

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

参加第二个活动

val value = intent.getStringExtra("key")

建议

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

companion object {
    val KEY = "key"
}
于 2018-10-10T09:07:41.707 回答
12

您可以使用意图对象在活动之间发送数据。考虑您有两个活动,即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")

于 2015-12-18T12:03:25.103 回答
12

如果要在 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);
于 2016-01-22T07:01:56.407 回答
10
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");
于 2014-06-18T12:20:28.730 回答
9

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

假设我有 2 个活动,LoginActivity并且HomeActivity. 我想将 2 个参数(用户名和密码)LoginActivityHomeActivity.

首先,我创建我的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());
    }
}

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

于 2016-08-08T02:49:08.807 回答
9

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

传递数据的实际过程已经得到解答,但是大多数答案都使用硬编码字符串作为 Intent 中的键名。当仅在您的应用程序中使用时,这通常很好。但是,文档建议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:使用字符串资源键

尽管文档中未提及,但此答案建议使用 String 资源来避免活动之间的依赖关系。

字符串.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));
于 2016-11-13T00:18:27.837 回答
6

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

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

您可以通过博客文章将数据传递给 Activity中的示例找到有关它的更多信息。

于 2012-10-27T13:09:19.007 回答
6

您可以使用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();
于 2016-11-28T06:38:26.023 回答
6

您可以尝试 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);
于 2017-05-04T11:49:26.600 回答
6

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

  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 类通过序列化在类之间传递数据。

于 2019-03-29T12:37:47.570 回答
5

通过 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);
于 2017-06-23T11:56:11.470 回答
4

我最近发布了Vapor API,这是一个 jQuery 风格的 Android 框架,它可以让各种任务变得更简单。如前所述,SharedPreferences这是您可以做到这一点的一种方法。

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

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

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

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

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

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

this.extras()

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

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

于 2013-02-26T11:49:37.147 回答
4
/*
 * 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));
    }
}
于 2014-09-13T11:29:46.917 回答
4

第一个活动:

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");
于 2018-07-23T07:11:26.803 回答
3

我在一个类中使用静态字段,并获取/设置它们:

像:

public class Info
{
    public static int ID      = 0;
    public static String NAME = "TEST";
}

要获取值,请在 Activity 中使用它:

Info.ID
Info.NAME

对于设置值:

Info.ID = 5;
Info.NAME = "USER!";
于 2013-11-14T16:03:07.383 回答
3

查理柯林斯使用Application.class. 我不知道我们可以那么容易地对其进行子类化。这是一个使用自定义应用程序类的简化示例。

AndroidManifest.xml

赋予android:name属性以使用您自己的应用程序类。

...
<application android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
....

MyApplication.java

将其用作全球参考持有人。它在同一个过程中运行良好。

public class MyApplication extends Application {
    private MainActivity mainActivity;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public void setMainActivity(MainActivity activity) { this.mainActivity=activity; }
    public MainActivity getMainActivity() { return mainActivity; }
}

MainActivity.java

设置对应用程序实例的全局“单例”引用。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((MyApplication)getApplication()).setMainActivity(this);
    }
    ...

}

MyPreferences.java

一个简单的例子,我使用来自另一个活动实例的主要活动。

public class MyPreferences extends PreferenceActivity
            implements SharedPreferences.OnSharedPreferenceChangeListener {
    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (!key.equals("autostart")) {
            ((MyApplication)getApplication()).getMainActivity().refreshUI();
        }
    }
}
于 2013-12-14T15:22:44.027 回答
3

使用全局类:

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()
于 2015-01-15T17:10:36.310 回答
3

试试这个:

当前活动.java

Intent intent = new Intent(currentActivity.this, TargetActivity.class);
intent.putExtra("booktype", "favourate");
startActivity(intent);

TargetActivity.java

Bundle b = getIntent().getExtras();
String typesofbook = b.getString("booktype");
于 2016-09-01T06:13:24.903 回答
3

您可以通过意图在两个活动之间进行通信。每当您通过登录活动导航到任何其他活动时,您都可以将 sessionId 放入意图中,并通过 getIntent() 在其他活动中获取它。以下是该代码片段:

登录活动

Intent intent = new 
Intent(YourLoginActivity.this,OtherActivity.class);
intent.putExtra("SESSION_ID",sessionId);
startActivity(intent);
finishAfterTransition();

其他活动

在 onCreate() 或任何你需要的地方调用 getIntent().getStringExtra("SESSION_ID"); 还要确保检查意图是否为空,并且您在意图中传递的键在两个活动中应该相同。这是完整的代码片段:

        if(getIntent!=null && getIntent.getStringExtra("SESSION_ID")!=null){
          sessionId = getIntent.getStringExtra("SESSION_ID");
}

但是,我建议您使用 AppSharedPreferences 来存储您的 sessionId 并在任何需要的地方获取它。

于 2018-09-21T12:34:38.153 回答
3

通过使用将数据传递给一个的最佳Activity方法,AnothetActivityIntent

检查截断的代码

ActivityOne.java

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("key_name_one", "Your Data value here");
myIntent.putExtra("key_name_two", "Your data value here");
startActivity(myIntent)

在您的第二次活动中

SecondActivity.java

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

    Intent intent = getIntent();

    String valueOne = intent.getStringExtra("key_name_one");
    String valueTwo = intent.getStringExtra("key_name_two");
}
于 2019-05-22T10:49:50.570 回答
2

在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();
    }
}
于 2017-05-10T06:37:04.427 回答
2

要在所有活动中访问会话 ID,您必须将会话 ID 存储在 SharedPreference 中。

请参阅下面我用于管理会话的课程,您也可以使用相同的课程。

import android.content.Context;
import android.content.SharedPreferences;

public class SessionManager {

    public static String KEY_SESSIONID = "session_id";

    public static String PREF_NAME = "AppPref";

    SharedPreferences sharedPreference;
    SharedPreferences.Editor editor;
    Context mContext;

    public SessionManager(Context context) {
        this.mContext = context;

        sharedPreference = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        editor = sharedPreference.edit();
    }


    public String getSessionId() {
        return sharedPreference.getString(KEY_SESSIONID, "");
    }

    public void setSessionID(String id) {
        editor.putString(KEY_SESSIONID, id);
        editor.commit();
        editor.apply();
    }   
}

//Now you can access your session using below methods in every activities.

    SessionManager sm = new SessionManager(MainActivity.this);
sm.getSessionId();



//below line us used to set session id on after success response on login page.

    sm.setSessionID("test");
于 2019-05-29T11:06:01.013 回答
1

对于在所有活动中使用会话 ID,您可以按照以下步骤操作。

1-在应用程序的 APPLICATION 文件中定义一个 STATIC VARIABLE 会话(它将保存会话 id 的值)。

2-现在使用要获取会话 id 值的类引用调用会话变量并将其分配给静态变量。

3-现在您可以在任何地方使用此会话 ID 值,只需调用静态变量

于 2017-05-19T05:05:09.940 回答
1

如果你使用 kotlin:

在 MainActivity1 中:

var intent=Intent(this,MainActivity2::class.java)
intent.putExtra("EXTRA_SESSION_ID",sessionId)
startActivity(intent)

在 MainActivity2 中:

if (intent.hasExtra("EXTRA_SESSION_ID")){
    var name:String=intent.extras.getString("sessionId")
}
于 2017-07-04T16:26:53.187 回答
1

您的数据对象应扩展 Parcelable 或 Serializable 类

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
于 2018-04-29T11:37:45.847 回答
1

要在 Java 中执行此操作:

startActivity(new Intent(this, MainActivity.class).putExtra("userId", "2"));
于 2018-06-01T07:24:28.133 回答
1

您可以使用意图类在活动之间发送数据。它基本上是给操作系统的一条消息,您可以在其中描述数据流的来源和目的地。就像从 A 到 B 活动的数据。

活动 A(来源)中:

Intent intent = new Intent(A.this, B.class);

intent.putExtra("KEY","VALUE");

startActivity(intent);

在活动 B(目的地)->

Intent intent =getIntent();

String data =intent.getString("KEY");

在这里,您将获得键“KEY”的数据

为了更好地使用,应始终将密钥存储在一个简单的类中,这将有助于将键入错误的风险降至最低

像这样:

public class Constants{
public static String KEY="KEY"
}

现在在活动 A 中

intent.putExtra(Constants.KEY,"VALUE");

活动 B中:

String data =intent.getString(Constants.KEY);
于 2018-08-30T11:25:28.247 回答
1

使用回调的活动之间的新的和实时的交互:

- 步骤 01:实现共享接口

public interface SharedCallback {
    public String getSharedText(/*you can define arguments here*/);
}

- STEP 02:实现一个共享类

final class SharedMethode {
    private static WeakReference<Context> mContext;

    private static SharedMethode sharedMethode = new SharedMethode();

    private SharedMethode() {
        super();
    }

    public static SharedMethode getInstance() {
        return sharedMethode;
    }

    public void setContext(Context context) {
        if (mContext != null)
            return;

        mContext = new WeakReference<Context>(context);
    }

    public boolean contextAssigned() {
        return mContext != null && mContext.get() != null;
    }

    public Context getContext() {
        return mContext.get();
    }

    public void freeContext() {
        if (mContext != null) mContext.clear();
        mContext = null;
    }
}

- STEP 03 :: 在第一个活动中玩代码

public class FirstActivity extends Activity implements SharedCallback {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        // call playMe from here or there
        playMe();
    }

    private void playMe() {
        SharedMethode.getInstance().setContext(this);
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }

    @Override
    public String getSharedText(/*passed arguments*/) {
        return "your result";
    }

}

- STEP 04 :: 在 SecondActivity 中完成游戏

public class SecondActivity extends Activity {

    private SharedCallback sharedCallback;

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

        if (SharedMethode.getInstance().contextAssigned()) {
            if (SharedMethode.getInstance().getContext() instanceof SharedCallback)
                sharedCallback = (SharedCallback) SharedMethode.getInstance().getContext();

            // to prevent memory leak
            SharedMethode.freeContext();
        }

        // You can now call your implemented methodes from anywhere at any time
        if (sharedCallback != null)
            Log.d("TAG", "Callback result = " + sharedCallback.getSharedText());

    }

    @Override
    protected void onDestroy() {
        sharedCallback = null;
        super.onDestroy();
    }

}
  • STEP 05 :: 你也可以实现一个 backword 回调(从 First 到 Second)来从 SecondAvtivity 中获取一些结果或者调用一些方法
于 2019-01-12T04:16:40.653 回答
1

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

String myData="Your string/data here";
Intent intent = new Intent(this, SecondActivity.class);    
intent.putExtra("your_key",myData);
startActivity(intent);

在您SecondActivity.java onCreate()使用密钥检索这些值的内部your_key

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

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        String myData = extras.getString("your_key");
    }  
}
于 2019-06-10T05:14:08.587 回答
1

在活动和 android 应用程序的其他组件之间传递数据的方法不止一种。一种是使用很多答案中已经提到的意图和可包裹性。

另一种优雅的方式是使用Eventbus库。

从发射活动:

EventBus.getDefault().postSticky("--your Object--");

在 recv 活动中:

EventBus.getDefault().removeStickyEvent("--Object class--")

其他需要考虑的点:

  1. 提供更多自由,您可以传递复杂的对象,而无需以任何形式修改它们。
  2. 不仅限于在活动之间传递数据,一旦您设置了库,您就可以使用它在应用程序管道中将数据从一个地方传递到另一个地方。例如,将其用于 BottomSheetMenu 以进行活动通信。
  3. 稳定的图书馆。
  4. 简化组件之间的通信
  5. 解耦事件发送者和接收者
  6. 在 UI 工件(例如活动、片段)和后台线程中表现良好
  7. 避免复杂且容易出错的依赖关系和生命周期问题
  8. 快;专为高性能而优化
  9. 很小(~60k jar)
  10. 已被安装超过 1,000,000,000 次的应用在实践中证明
  11. 具有交付线程、订阅者优先级等高级功能。
于 2020-12-04T11:08:16.220 回答
0

考虑使用单例来保存所有活动都可以访问的会话信息。

与额外变量和静态变量相比,这种方法有几个优点:

  1. 允许您扩展 Info 类,添加您需要的新用户信息设置。您可以创建一个继承它的新类,或者只编辑 Info 类,而无需更改所有地方的额外处理。
  2. 易于使用 - 无需在每项活动中获得额外费用。

    public class Info {
    
        private static Info instance;
        private int id;
        private String name;
    
        //Private constructor is to disallow instances creation outside create() or getInstance() methods
        private Info() {
    
        }
    
        //Method you use to get the same information from any Activity.
        //It returns the existing Info instance, or null if not created yet.
        public static Info getInstance() {
            return instance;
        }
    
        //Creates a new Info instance or returns the existing one if it exists.
        public static synchronized Info create(int id, String name) {
    
            if (null == instance) {
                instance = new Info();
                instance.id = id;
                instance.name = name;
            }
            return instance;
        }
    }
    
于 2013-12-09T14:51:38.980 回答
0

我使用公共静态字段来存储活动之间的共享数据,但为了尽量减少其副作用,您可以:

  • 只制作一个或尽可能少的字段,并重用它们,将它们设为对象类型并将其转换为接收活动中所需的类型。
  • 每当它们中的任何一个不再有用时,在下一次分配之前,将其显式设置为 null 以由垃圾收集器收集。
于 2015-11-14T11:08:46.253 回答
0

//您的问题是您想在登录后存储会话 ID,并为您要注销的每个活动提供该会话 ID。

//您的问题的解决方案是您必须在成功登录后将会话ID存储在公共变量中。并且每当您需要用于注销的会话 ID 时,您都可以访问该变量并将变量值替换为零。

//Serializable class

public class YourClass  implements Serializable {
     public long session_id = 0;
}
于 2016-04-26T07:20:35.443 回答
0

在 Destination 活动中像这样定义

public class DestinationActivity extends AppCompatActivity{

    public static Model model;
    public static void open(final Context ctx, Model model){
          DestinationActivity.model = model;
          ctx.startActivity(new Intent(ctx, DestinationActivity.class))
    }

    public void onCreate(/*Parameters*/){
           //Use model here
           model.getSomething();
    }
}

在第一个活动中,开始第二个活动,如下所示

DestinationActivity.open(this,model);
于 2018-09-17T23:19:04.920 回答
0

我们可以通过两种方式将值传递给另一个活动(已经发布了相同类型的答案,但我在这里发布了通过意图尝试的还原代码)

1.通过意图

  Activity1:
      startActivity(new Intent(getApplicationContext(),Activity2.class).putExtra("title","values"));

InActivity 2:

String recString= getIntent().getStringExtra("title");

2.通过SharedPreference

  Activity1:

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
 // 0 - for private mode
Editor editor = pref.edit();
editor.putString("key_name", "string value"); // Storing string
editor.commit(); // commit changes

Activty2:
   SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 

pref.getString("key_name", null); // getting String
于 2019-04-08T09:09:43.190 回答
0
 Intent intent = new Intent(getBaseContext(), SomeActivity.class);
 intent.putExtra("USER_ID", UserId);
 startActivity(intent);

 On SomeActivity : 

 String userId= getIntent().getStringExtra("("USER_ID");
于 2019-05-31T05:41:48.057 回答
0

你可以有意识地工作

String sessionId = "my session id";

    startActivity(new Intent(getApplicationContext(),SignOutActivity.class).putExtra("sessionId",sessionId));
于 2019-08-18T17:34:48.637 回答
0

使用捆绑包@link https://medium.com/@nikhildhyani365/pass-data-from-one-activity-to-another-using-bundle-18df2a701142
//从媒体复制

           Intent I =  new Intent(MainActivity.this,Show_Details.class);

            Bundle b = new Bundle();


            int x = Integer.parseInt(age.getText().toString());
            int y = Integer.parseInt(className.getText().toString());

            b.putString("Name",name.getText().toString());

            b.putInt("Age",x);
            b.putInt("ClassName",y);

            I.putExtra("student",b);

            startActivity(I);

使用 Intent @link https://android.jlelse.eu/passing-data-between-activities-using-intent-in-android-85cb097f3016

于 2020-03-09T06:08:33.397 回答
-1

以其他方式,您可以使用接口传递数据。

我们有2个活动A,B然后我会做什么,创建一个界面,如:

public interface M{
    void data(String m);
}

然后您可以在 A 类中调用此方法的赋值,如下所示:

public class A extends AppCompatActivity{
    
   M m;   //inteface name
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a);
       
        m= (M) getActivity();

    //now call method in interface and send data im sending direct you can use same on click

    m.data("Rajeev");
    }
}

现在您必须在 B 类中实现该接口:

public class B extends AppCompatActivity implements M{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.b);
    }

    @Override
    public void data(String m) {
        you can use m as your data to toast the value here it will be same value what you sent from class A
    }
}
于 2021-08-02T05:34:19.333 回答