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

1533

我有这样一个情况,通过登录页面登录后,每个活动页面上都会有一个“退出”按钮

点击“退出”后,我将传递已登录用户的会话ID以进行注销。 有人能指导我如何使会话ID在所有活动中可用吗?

这种情况是否有任何替代方案?


18
我使用了sharedpreference,它对于在“记住密码”功能中保存登录数据也很有用。 - shareef
这对我有效。 感谢Darshan Computing。 - matasoy
这篇回答可能会对您有所帮助:https://dev59.com/RHE85IYBdhLWcg3whD7k#37774966 - Yessy
对于这种情况,尝试使用commonUtils类和sharedpreferences方法... 这将使代码保持清晰,并将相关数据放在一个地方。您将能够仅通过清除特定的偏好文件的一个方法来清除特定集合的数据,而不会清除任何默认应用程序数据... - Muahmmad Tayyib
53个回答

7
您可以使用 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();

重复内容:意图方法已经由最高票答案Sahil Mahajan Mj的答案Mayank Saini的答案Md. Rahman的答案Dilavar M的答案Android开发者的答案sahulab提出。单例:Rodion Altshuler的答案。 - Murmel

7
活动之间的数据传递主要是通过意图对象实现的。
首先,您需要使用 Bundle 类将数据附加到意图对象中。然后使用 startActivity()startActivityForResult() 方法调用活动。
您可以在博客文章“向活动传递数据”中找到更多关于此的信息和示例。

这与直接使用提供的Intent方法(Intent#putExtra()基本相同,但会添加另一个Bundle并使事情更加复杂。 - Murmel

7
你可以尝试使用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);

重复:这种方法已经在2014年被Ravi Parsania提出过。 - Murmel

7

请在 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”时,这是我找到的第一个结果。看到这样的代码后,我感到放心;它也没有冗余。 - The Amateur Coder

6

从当前活动启动另一个活动并通过Bundle对象传递参数

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库来序列化复杂数据,就像这样。
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);

6

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

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

然后在下一个Activity的onCreate方法中,检索从上一个Activity传递过来的值:

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

第二个方法:您可以创建一个Bundle对象,将值放入Bundle中,然后从当前活动将Bundle对象放入Intent中 -

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

然后在下一个Activity的onCreate方法中,获取从前一个Activity传递过来的值:

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 retrieve value from one activity to another.
  }

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


5

第一个活动:


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

5
/*
 * 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));
    }
}

5
我最近发布了 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。顺便说一句,我不确定当时在想什么,关于那个许可证...道歉。 - Darius

4

使用全局类:

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。为了做到这一点,您需要在每个Activity中创建一个GlobalClass-Object:

GlobalClass gc = (GlobalClass) getApplication();

然后你可以调用例如:

gc.getVitaminA()

覆盖应用程序 - 这是 Whome 的答案 的副本。 - Murmel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接