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

1533

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

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

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


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

3
您可以使用Intent类在Activity之间传递数据。它基本上是一条消息,向操作系统描述数据流的源和目标。例如从A Activity到B Activity的数据。
Activity 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);

3

尝试这样做:

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

重复:Bundle方法已经在2012年被PRABEESH R K提出,以及Ajay VenugopalKrishnaGavine Joyce。而且可以通过其他7个答案中提出的i.putExtras()/getIntent().getString()来简化。 - Murmel

3

Charlie Collins给了我一个完美的答案,使用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();
        }
    }
}

3

我在一个类中使用静态字段,并进行get/set操作:

比如:

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

在Activity中获取值,使用以下代码:

Info.ID
Info.NAME

设置一个值:

Info.ID = 5;
Info.NAME = "USER!";

2
这是一个不好的想法,因为活动可能会被Android关闭,从而有效地丢失数据。 - Gerard
@Gerard 但是,这个类不是活动! - javad
1
如果您只拥有常量,那么最好制作一个接口。 - Aniket Thakur
再次采用静态方法 - 这与ComputerSaysNoPrzemek Marcinkiewicz的答案相比并没有什么新意。 - Murmel
始终避免将static用于非常数字段。 - Islam Assem

3

使用Intent将数据从一个Activity传递到另一个AnothetActivity是最佳方法。

检查代码片段:

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

2

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

LoginActivity:

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

OtherActivity:

在 onCreate() 或者任何需要调用的地方使用 getIntent().getStringExtra("SESSION_ID")。
另外,确保检查 intent 是否为空并且传递给 intent 的键在两个活动中应该相同。以下是完整的代码片段:

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

我建议您使用AppSharedPreferences来存储sessionId,并在需要的地方从中获取。


2

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

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

2

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

请参见我正在使用的管理会话的类,您也可以使用相同的类。

以下是原始答案:

Original Answer

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

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

1
在您当前的活动中创建新的Intent
String myData="Your string/data here";
Intent intent = new Intent(this, SecondActivity.class);    
intent.putExtra("your_key",myData);
startActivity(intent);

在你的SecondActivity.javaonCreate()方法中,使用键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");
    }  
}

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