我有这样一个情况,通过登录页面登录后,每个活动页面上都会有一个“退出”按钮
。
点击“退出”后,我将传递已登录用户的会话ID
以进行注销。 有人能指导我如何使会话ID
在所有活动
中可用吗?
这种情况是否有任何替代方案?
我有这样一个情况,通过登录页面登录后,每个活动页面上都会有一个“退出”按钮
。
点击“退出”后,我将传递已登录用户的会话ID
以进行注销。 有人能指导我如何使会话ID
在所有活动
中可用吗?
这种情况是否有任何替代方案?
在您当前的 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。
extras.getInt("new_variable_name")
在新活动中获取它。 如果您尝试通过 getString()
获取它,Android 会认为它是一个整数并返回 null! - bishstartActivity(i);
呢?我的意思是,我能否让“活动A”调用“活动B”,然后将数据返回给“活动A”?我是否有些困惑? - Francisco Corrales Morales最简单的方法是将会话ID传递给你用来启动活动的Intent
中的signout活动:
Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);
在下一个活动中访问该意图:
String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");
Intent的文档提供了更多信息(查看标题为“Extras”的部分)。
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
。 - FaridsetData
传递数据,并且这两种方法有什么区别?哪一种更好? - Hosein Aqajani如 Erich 所说,传递 Intent extras 是个好方法。
Application 对象也是另一种方式,有时处理多个活动之间相同状态(而不是到处获取/放置它),或更复杂的对象比原始类型和字符串更容易。你可以扩展 Application,然后设置/获取任何你想要的内容,并使用 getApplication() 从任何 Activity (在同一个应用程序中) 访问。
还要记住,你可能看到的其他方法(如静态方法)可能会导致内存泄漏。Application 也有助于解决这个问题。
源类:
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);
现在在您的SecondActivity
的OnCreate
方法中,您可以像这样获取额外信息。
如果您发送的值是long
:
long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));
如果你发送的值是一个字符串
:
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);
boolean
和long
getter的示例,这值得评论,但不是一个答案。 - Murmel它帮助我在上下文中看待事物,这里有两个例子。
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
。这将在第二个活动完成时调用。您可以通过检查结果代码确保它实际上是第二个活动。(当您从同一个主活动启动多个不同的活动时,这很有用。)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();
}
}
更新:请注意,我曾经提到过使用SharedPreference。它有一个简单的API,并且可在应用程序的所有活动中访问。但是这种方法很笨拙,并且如果传递敏感数据时会存在安全风险。最好使用意图(intents)。它具有广泛的重载方法列表,可用于在活动之间更好地传输许多不同的数据类型。请查看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, ...));
...
然后您可以为预期的活动创建一个意图,并确保您拥有所有参数。您也可以针对片段进行适应。上面是一个简单的示例,但您可以理解这个想法。
尝试按照以下步骤操作:
创建一个简单的“帮助程序”类(用于创建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());
在你的活动中,当你想要在“会话”中“保存”一些数据时,请使用以下代码:IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);
然后发送此Intent。在目标Activity中,您的字段将可用作:
getIntent().getStringExtra("YOUR_FIELD_NAME");
现在我们可以像在servlet或JSP中一样使用Intent。
你也可以通过创建一个可传递的类来传递自定义类对象。最好的方法是编写您的类,然后将其粘贴到诸如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;
//...