使用 Intent 从 Activity 传递变量
Posted
技术标签:
【中文标题】使用 Intent 从 Activity 传递变量【英文标题】:Using Intent to pass variable from Activity 【发布时间】:2014-09-14 04:20:07 【问题描述】:我想将一个值(“sessionId”)从一个活动发送到另一个活动。我已经为此使用了意图,但我不知道如何访问该变量以便可以在 Intent 中使用它。
这是我的 java 文件:-
public class Login extends Activity
//URL to get JSON Array
private static String url = "http://*************/webservice.php?operation=getchallenge&username=admin";
//JSON Node Names
private static final String TAG_RESULT = "result";
private static final String TAG_TOKEN = "token";
// contacts JSONArray
JSONArray contacts = null;
String token = null;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
if (android.os.Build.VERSION.SDK_INT > 9)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
new AsyncTask<Void, Void, Void>()
@SuppressWarnings("unused")
JSONObject result;
@Override
protected Void doInBackground(Void... params)
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url);
try
// Getting JSON Array
result = json.getJSONObject(TAG_RESULT);
JSONObject json_result = json.getJSONObject(TAG_RESULT);
// Storing JSON item in a Variable
token = json_result.getString(TAG_TOKEN);
//Importing TextView
catch (JSONException e)
e.printStackTrace();
String username="admin";
String accesskeyvalue = "**************";
String accessKey=md5(token + accesskeyvalue);
String data = null;
try
data = URLEncoder.encode("username", "UTF-8")
+ "=" + URLEncoder.encode(username, "UTF-8");
data += "&" + URLEncoder.encode("accessKey", "UTF-8") + "="
+ URLEncoder.encode(accessKey, "UTF-8");
catch (UnsupportedEncodingException e)
// TODO Auto-generated catch block
e.printStackTrace();
String text = "";
BufferedReader reader=null;
System.out.println(data);
// Send data
try
// Defined URL where to send data
URL url = new URL("http://***************/webservice.php?operation=login");
// Send POST data request
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
// Append server response in string
sb.append(line + "\n");
text = sb.toString();
catch(Exception ex)
finally
try
reader.close();
catch(Exception ex)
// Show response
System.out.println(text);
String sessionid = text.substring(41, 62);
System.out.println(sessionid);
return null;
@Override
protected void onPostExecute(Void aVoid)
super.onPostExecute(aVoid);
.execute();
public String md5(String s)
MessageDigest digest;
try
digest = MessageDigest.getInstance("MD5");
digest.update(s.getBytes(),0,s.length());
String hash = new BigInteger(1, digest.digest()).toString(16);
return hash;
catch (NoSuchAlgorithmException e)
e.printStackTrace();
return "";
public void sendMessage(View view)
Intent intent = new Intent(Login.this, Quote1.class);
intent.putExtra("sessionId", sessionId);
startActivity(intent);
在sendMessage()
中,我无法使用 sessionId,因为它在 doInBackground()
中声明,即 protected
。
我在 OOP 方面有点弱。 请帮忙。
【问题讨论】:
将您的sessionid
设为Global variable
@M D 以上建议解决了我的错误,但它会将sessionid
的值从doInBackground()
获取到sendMessage()
?
【参考方案1】:
要在不同方法之间访问类中的变量,只需将变量设为类变量。
要在活动之间发送数据,请参阅this 文章。
Activity1向Activity2发送消息的基本示例:
活动1:
//Static String to identify the send parameter, without this this you have to set the exact same string twice.
public final static String SESSION_ID = "com.example.your.long.appname.SESSION_ID";
//sendMessage method is called for some reason in your class that you define (e.g user onClick)
public void sendMessage(View view)
//Create an Intent
Intent intent = new Intent(this, Activity2.class);
//put the sessionID as extra intent.
intent.putExtra(SESSION_ID, sessionID);
//Start Activity2 with the intent.
startActivity(intent);
要发送变量,例如在 Activity2 中使用 getStringExtra(String):
//Get the intent
Intent intent = getIntent();
//Get the message
String message = intent.getStringExtra(Activity1.SESSION_ID);
【讨论】:
【参考方案2】:您可以将 sessionId 变量作为类变量放入 Login 类中,就像对 TAG_RESULT、TAG_TOKEN 等所做的那样......
然后,因为您的 asyncTask 是在此 Login 类中声明的,所以您不能从它(AsyncTask)访问它(并更改其值),也可以在 Login 类的 sendMessage 方法中访问它的值。
我还建议(为了更好的可读性)将您的 AsyncTask 作为另一个类(LoginClass 的内部类)。代码将更具可读性。
【讨论】:
以上是关于使用 Intent 从 Activity 传递变量的主要内容,如果未能解决你的问题,请参考以下文章
Android基础利用Intent在Activity之间传递数据
自定义 ListView 以处理从另一个 Intent 传递的 EditText 和 TextView