提问



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


单击sign-out时,我将通过已登录用户的session id进行注销。任何人都可以指导我如何保持session id所有activities?


这种情况的任何替代方案

最佳参考


最简单的方法是将会话ID传递给您用来启动Activity的Intent中的注销Activity:


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


访问意图下一个Activity


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


Intent的文档有更多信息(请参阅标题为Extras的部分)。[147]

其它参考1


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


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

其它参考2


Erich指出,传递Intent附加功能是一种很好的方法。 [148]


Application对象是另一种方式,有时在多个Activity中处理相同的状态(相对于必须将其放到任何地方)或者比原语和字符串更复杂的对象时更容易。 [149]


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


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

其它参考3


来源类:


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

其它参考4


你只需要在调用你的意图时发送额外内容。


喜欢这个:


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

其它参考5


更新请注意,我已经提到过使用SharedPreference。它有一个简单的API,可以通过应用程序的Activity访问。但这是一个笨拙的解决方案,如果你传递敏感数据是一个安全风险。最好使用意图。它有一个广泛的重载方法列表,可用于在Activity之间更好地传输许多不同的数据类型。看看intent.putExtra。这个链接很好地展示了putExtra的用法。[152] [153] [154]


在Activity之间传递数据时,我首选的方法是为相关Activity创建一个静态方法,其中包括启动意图所需的参数。然后,它提供了轻松设置和检索参数。所以它看起来像这样


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


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

其它参考6


尝试执行以下操作:


创建一个简单的帮助器类(您的Intents的工厂),如下所示:


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


在你的Activity中。如果要在会话中保存某些数据,请使用以下命令:


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


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


getIntent().getStringExtra("YOUR_FIELD_NAME");


所以现在我们可以使用相同的旧会话(如servlet或JSP)。[155]

其它参考7


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


传递数据



[156]


MainActivity




  • 将要发送的数据放入具有键值对的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);
    }
}


第二项Activity




  • 您使用getIntent()获取启动第二个Activity的Intent。然后,您可以使用getExtras()和第一个Activity中定义的密钥提取数据。由于我们的数据是一个字符串,我们在这里只使用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);
    }
}


传递数据



[158]


MainActivity




  • 使用startActivityForResult开始第二个Activity,为其提供任意结果代码。

  • 覆盖onActivityResult。当第二个Activity完成时调用此方法。您可以通过检查结果代码确保它实际上是第二个Activity。 (当您从同一MainActivity开始多个不同的Activity时,这非常有用。)

  • 从返回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);
            }
        }
    }
}


第二项Activity




  • 将您要发送回上一个Activity的数据放入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();
    }
}

其它参考8


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


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 对象。

其它参考9


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


public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

其它参考10


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


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)中,您应该使用以下代码从intent中检索数据。


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

其它参考11


你可以用SharedPreferences ......



  1. 记录日志。 SharedPreferences中的时间存储会话ID


    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
    

  2. Signout。共享偏好中的时间提取会话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();


这非常有用,因为有一次你保存了值然后检索Activity的任何地方。

其它参考12


标准方法。


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


现在,在您的第二个Activity中,从包中检索您的数据:


获取捆绑包


Bundle bundle = getIntent().getExtras();


提取数据......



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

其它参考13


来自Activity


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


到Activity


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

其它参考14


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

其它参考15


如果您想在Activity/片段 之间传输位图





Activity


在Activites 之间传递位图


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


并在Activity类


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





片段


在片段之间传递位图


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


在SecondFragment内部接收


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





转移大型位图


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


所以在这种情况下,您必须将位图压缩为字节数组,然后在另一个Activity中解压缩,就像这样


在FirstActivity中


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

其它参考16


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


您可以在其他Activity中检索它。两种方式:


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


第二种方式是:


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

其它参考17


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



已经回答了传递数据的实际过程,但是大多数答案都使用硬编码字符串作为Intent中的键名。仅在您的应用中使用时,这通常很好。但是,文档建议对标准化数据类型使用EXTRA_*常量。[160]


示例1:使用Intent.EXTRA_*


第一项Activity


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


第二项Activity:


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


示例2:定义自己的static final


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


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


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


第一项Activity:


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


第二项Activity:


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


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


虽然文档中没有提到,但这个答案建议使用String资源来避免Activity之间的依赖关系。


的strings.xml


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


第一项Activity


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


第二项Activity


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

其它参考18


您可以尝试共享首选项,它可能是在Activity之间共享数据的好选择


保存会话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);

其它参考19


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


假设我有2个Activity,LoginActivityHomeActivity
我想从LoginActivityHomeActivity传递2个参数(用户名和密码)。


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


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

其它参考20


Activity之间的数据传递主要是通过意图对象。


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


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

其它参考21


查理柯林斯用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



一个简单的例子,我使用另一个Activity实例的MainActivity。


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

其它参考22


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

其它参考23


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


喜欢:


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


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


Info.ID
Info.NAME


用于设置值:


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

其它参考24


尝试这个:


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

其它参考25


通过Bundle Object从此Activity传递参数启动另一个Activity


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


检索另一个Activity(YourActivity)


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


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


这里我们有员工模型


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

其它参考26


我最近发布了Vapor API,这是一个jQuery风格的Android框架,可以使各种各样的任务更加简单。如上所述,SharedPreferences是你可以做到这一点的一种方式。[164]


VaporSharedPreferences实现为Singleton,因此这是一个选项,并且在Vapor API中它有一个严重过载的.put(...)方法,因此您不必明确担心您提交的数据类型 - 只要它受支持它也很流利,所以你可以打电话:[165]


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


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


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


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


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


this.extras()


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


希望有些人感兴趣:)

其它参考27


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

其它参考28


如果你使用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")
}

其它参考29


使用全局类:


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


GlobalClass gc = (GlobalClass) getApplication();


然后你可以打电话给例如:


gc.getVitaminA()