使用 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 传递变量的主要内容,如果未能解决你的问题,请参考以下文章

安卓初学,多个窗体Activity之间如何互相访问变量?

Android基础利用Intent在Activity之间传递数据

在activity之间通过静态变量传递数据

自定义 ListView 以处理从另一个 Intent 传递的 EditText 和 TextView

在 Android 中使用 Intent 在活动中传递 android 位图数据

【Android 开发】 : Activity之间传递数据的几种方式