在不同Activity傳遞資料(四種方式)

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   color   io   os   使用   

四種傳遞方法:

1.通過Intent傳遞資料;

2.通過靜態變數傳遞資料;

3.通過剪下板傳遞資料;

4.通過全域對象傳遞資料;

分類介紹:

1.通過Intent傳遞資料;

代碼如下:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="${relativePackage}.${activityClass}" >   <Button        android:id="@+id/btnintent"       android:layout_width="match_parent"       android:layout_height="wrap_content"       android:text="通過Intent傳遞資料"       android:textSize="18sp"       /></LinearLayout>
可序列化類別的代碼:

package com.example.transdata;import java.io.Serializable;public class Data implements Serializable{public int id;public String name;}
第一個Activity的代碼:


package com.example.transdata;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button btn = (Button) findViewById(R.id.btnintent);        btn.setOnClickListener(this);    }@Overridepublic void onClick(View v) {Intent intent = null;switch (v.getId()) {case R.id.btnintent:intent = new Intent(this, OtherActivity.class);intent.putExtra("intent_string", "通過Intent傳遞的字串");intent.putExtra("intent_integer", 300);Data data = new Data();data.id = 1000;data.name = "Android";intent.putExtra("intent_object", data);startActivity(intent);break;default:break;}}}

第二個Activity的代碼:


package com.example.transdata;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class OtherActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_other);TextView tvWord = (TextView) findViewById(R.id.tv_word);String intentString = getIntent().getStringExtra("intent_string");int intentInteger = getIntent().getExtras().getInt("intent_integer");Data data = (Data) getIntent().getExtras().get("intent_object");StringBuffer sb = new StringBuffer();sb.append(intentString);sb.append("\n");sb.append(intentInteger);sb.append("\n");sb.append(data.id);sb.append(data.name);tvWord.setText(sb.toString());}}

注意:需要注意的是傳輸三種資料類型的不同,傳輸:String類型、Integer類型、可序列化類別型;


intent.putExtra("intent_string", "通過Intent傳遞的字串");intent.putExtra("intent_integer", 300);Data data = new Data();data.id = 1000;data.name = "Android";intent.putExtra("intent_object", data);

在第二個Activity中收到第一個Activity傳遞的資料也不同:


String intentString = getIntent().getStringExtra("intent_string");int intentInteger = getIntent().getExtras().getInt("intent_integer");Data data = (Data) getIntent().getExtras().get("intent_object");

另外顯示資料的時候,用到了StringBuffer(可變,安全執行緒):

StringBuffer sb = new StringBuffer();sb.append(intentString);sb.append("\n");sb.append(intentInteger);sb.append("\n");sb.append(data.id);sb.append(data.name);tvWord.setText(sb.toString());

2.通過靜態變數傳遞資料;

Intent傳遞資料具有局限性,Intent無法傳遞不能序列化的對象。這時候使用靜態變數傳遞資料可以解決。

建立的一個Activity的代碼如下:

package com.example.transdata;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class OtherActivity2 extends Activity {public static String name;public static int id;public static Data data;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_other2);TextView tvWord = (TextView) findViewById(R.id.tv_word);StringBuffer sb = new StringBuffer();sb.append(name);sb.append("\n");sb.append(id);sb.append("\n");sb.append(data.id);sb.append("\n");sb.append(data.name);tvWord.setText(sb.toString());}}

主介面的布局中,添加一個新的按鈕,主要的邏輯代碼如下:

case R.id.btnstatic:intent = new Intent(this, OtherActivity2.class);OtherActivity2.id = 3000;OtherActivity2.name="保時捷";OtherActivity2.data = new Data();OtherActivity2.data.id = 1000;OtherActivity2.data.name = "Android";startActivity(intent);break;

3.通過剪下板傳遞資料;

剪下板只能儲存簡單類型的資料類型或可序列化的對象,對於某些不可序列化的對象如果可以將其轉換為位元組流(位元組數組),也可以將這些對象儲存到剪下板中。本例中不是直接將Data對象儲存在剪下板中,而是將Data對象轉換為Base64編碼後以字串的形式儲存在剪下板中。

MainActivity主要代碼如下:


case R.id.btnClipboard:intent = new Intent(this, OtherActivity3.class);//擷取剪下板的對象ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);Data clipdata = new Data();clipdata.id = 6666;clipdata.name = "testclipdata";//建立位元組數組輸出資料流對象,用於將Data對象轉換為位元組流ByteArrayOutputStream baos = new ByteArrayOutputStream();//儲存的字串String base64Str = "";try {//物件流程ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(clipdata);//將位元組流進行Base64編碼base64Str = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);oos.close();} catch (IOException e) {e.printStackTrace();}//擷取儲存文本資料的剪下板資料的對象ClipData text = ClipData.newPlainText("data", base64Str);//設定主剪下板clipboard.setPrimaryClip(text);startActivity(intent);break;

核心代碼已經加上注釋了。

顯示資料的Activity:

package com.example.transdata;import java.io.ByteArrayInputStream;import java.io.ObjectInputStream;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.app.Activity;import android.content.ClipboardManager;import android.content.Context;import android.os.Build;import android.os.Bundle;import android.util.Base64;import android.widget.TextView;@SuppressLint("NewApi") public class OtherActivity3 extends Activity {@TargetApi(Build.VERSION_CODES.HONEYCOMB) @SuppressLint("NewApi") @Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_other3);TextView tvWord = (TextView) findViewById(R.id.tv_word);ClipboardManager manager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);//從剪下板中擷取Base64編碼的字串String base64Str = manager.getPrimaryClip().getItemAt(0).getText().toString();//將Base64編碼字串解碼成位元組數組byte[] buffer = Base64.decode(base64Str, Base64.DEFAULT);ByteArrayInputStream bais = new ByteArrayInputStream(buffer);try {ObjectInputStream ois = new ObjectInputStream(bais);//將位元組流還原為Data對象Data data = (Data) ois.readObject();tvWord.setText(base64Str+":" + data.id + ":" + data.name);} catch (Exception e) {e.printStackTrace();}}}

4.通過全域對象傳遞資料;

使用靜態變數具有局限性(1.大量使用靜態變數會造成記憶體溢出;2.靜態變數在很多類中出現容易造成代碼難以維護和混亂的情況)。

全域對象所對應的類必須從android.app.Application繼承。

全域類:

package com.example.transdata;import android.app.Application;public class MyApplication extends Application {//必須有一個無參的構造器public String country;public Data data = new Data();}

MainActivity的點擊事件:

case R.id.btnApplication://必須先擷取全域對象MyApplication application = (MyApplication) getApplicationContext();application.country = "china";application.data.id = 123;application.data.name = "testapplication";intent = new Intent(this, OtherActivity4.class);startActivity(intent);break;

顯示的Activity:


package com.example.transdata;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class OtherActivity4 extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_other4);TextView tvWord = (TextView) findViewById(R.id.tv_word);MyApplication application = (MyApplication) getApplicationContext();tvWord.setText(application.country + ":" + application.data.id + ":" + application.data.name);}}






總結:

傳遞基本類型或可序列化的資料,用Intent;

傳遞不可序列化的對象,最好使用全域對象;如果想讓某些資料長時間駐留在記憶體,最好使用全域對象。

















在不同Activity傳遞資料(四種方式)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.