• 熱門專題

Intent傳遞數據

作者:  發布日期:2015-06-24 22:09:56
Tag標簽:數據  
  • 出處: http://blog.csdn.net/forwardyzk/article/details/46620021

    在界面跳轉的時候,我們使用Intent,Intent怎樣傳遞數據,可以傳遞什么數據呢.下面我們就以下這幾方便做介紹.

    1.Intent傳遞怎樣傳遞數據

    2.Intent可以傳遞什么類型數據

    2.1.Intent傳遞基本數據和基本數據數組

    2.2.Intent傳遞Parcelable對象

    2.3.Intent傳遞Serializable對象

    2.4.Intent傳遞String,Integer,CharSequence泛型集合

    2. 5.Intent傳遞基本自定義對象集合

    3.怎樣使用startActivityForResult,OnActivityResult,setResut之間的怎樣傳遞數據

    Intent怎樣傳遞數據

    Intent之間傳遞數據是通過Bundle傳遞.

    查看Intent對象的方法putExtra方法的源碼.

    這里是以傳遞int類型的數據為例,你也可以查看傳遞其他類型數據的方法.經查看源碼,發現其實就是把傳遞的key-value放在了mExtras對象中,就是Bundle對象中.

    獲取數據的時候,我們在目標Activity中,先獲取Intent對象(getIntent()),然后使用getXXX方法,通過key獲取值

    Intent可以傳遞什么類型的數據

    Intent傳遞基本數據和基本數據數組

    在MainActivity開啟BaseActivity

    在ManActivity中傳遞數據

    public final static String BASE = "base";
     
    /**
         * 傳遞基本對象數據,和數組
         */
        public void base() {
            Intent intent = new Intent(MainActivity.this, BaseActivity.class);
            intent.putExtra(BASE, 110);
            startActivity(intent);
        }

     

    在BaseAcitvity獲取MainActvity傳遞過來的數據

     

    private void initData() {
            //獲取Intent后,通過key獲取對應的值,然后把值設置給TextView
            int base = getIntent().getIntExtra(MainActivity.BASE, 0);
            tv.setText(String.valueOf(base));
        }
    

     

    這里就以int類型為例,其他的基本數據類型用法和這是一樣的.

    Intent傳遞Parcelable對象

    我們先看官方文檔是怎樣實現這個接口的

    必須重寫writeToparcel和describeContents方法,必須創建一個Parcelable.Create 類型的CREATOR對象.

    首先要自定義Persion類,實現Parcelable接口.

     

    public class Persion implements Parcelable {
        private String name;
        private int age;
    
        public Persion() {
        }
    
        public Persion(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Persion{" +
                    "name='" + name + ''' +
                    ", age=" + age +
                    '}';
        }
    
        public static final Parcelable.Creator<Persion> CREATOR = new Parcelable.Creator<Persion>() {
    
            @Override
            public Persion createFromParcel(Parcel source) {
                Persion persion = new Persion();
                persion.name = source.readString();
                persion.age = source.readInt();
                return persion;
            }
    
            @Override
            public Persion[] newArray(int size) {
                return new Persion[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(age);
        }
    }

    在MainActivity開啟ParceActivity.

     

    在ManActivity傳遞Parcelable類型數據

     

    /**
         * 傳遞Parcelable對象
         */
        public void parce() {
            Persion persion = new Persion();
            persion.setName("張三");
            persion.setAge(20);
            Intent intent = new Intent(MainActivity.this, ParceActivity.class);
            intent.putExtra(PARCE, persion);
            startActivity(intent);
        }

    在ParceActivity獲取數據

     

     

     TextView tv = (TextView) findViewById(R.id.tv);
            Persion p = getIntent().getParcelableExtra(MainActivity.PARCE);
            tv.setText(p.toString());

    使用的是getParcelableExtra方法,通過key獲取值.

     

    Intent傳遞Serializable對象

    自定義Student類實現Serializable接口

     

    public class Student implements Serializable {
        private  String stuName;
        private  String stuClassName;
    
        public Student(String stuName, String stuClassName) {
            this.stuName = stuName;
            this.stuClassName = stuClassName;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "stuName='" + stuName + ''' +
                    ", stuClassName='" + stuClassName + ''' +
                    '}';
        }
    }
    
    在MainActivity開啟SerActivity

     

    在MainActivity傳遞數據

     

      public final static String SERCI = "serci";
        /**
         * 傳遞Serializable對象
         */
        public void serial() {
            Student student = new Student("李四", "計算機一班");
            Intent intent = new Intent(MainActivity.this, SerActivity.class);
            intent.putExtra(MainActivity.SERCI, student);
            startActivity(intent);
        }

    在SerActivity獲取傳遞的數據

     

     

    TextView tv = (TextView) findViewById(R.id.tv);
            Student s = (Student) getIntent().getSerializableExtra(MainActivity.SERCI);
            tv.setText(s.toString());

     

    當我們傳遞自定義類的時候,我們是要實現Parcelable還是實現Serializable.

     

    實現Serializable接口是為了將對象轉化為字節流,可以存到本地外存儲設備上,或者通過網絡傳輸,當使用此對象的時候,可以講此字節流重新序列化為對應的對象.

    實現Parcelable對象,其不能將對象存到本地外存儲設置上,因為parcelable是輕量級的序列化和反序列化機制,全部是在內存中進行序列化和反序列華化,效率比較高.

     

    建議:

    當你的對象需要在外部存儲設備上存儲,那么就實現Serializable接口,如果你的對象只是在界面之間傳遞,不需要存儲的本地外存儲設備,還是最好實現Parcelable對象.

     

    Intent傳遞String,Integer,CharSequence泛型集合

    這里以String類型的集合為例,

    在MainActivity中開啟ListActivity

    在MainActivity傳遞數據

     

    /**
         * 傳遞基本數據List集合,只有傳遞String,Integer,CharSequence泛型的集合
         */
        public void list() {
            ArrayList<String> stringList = new ArrayList<String>();
            stringList.add("abc");
            stringList.add("def");
            stringList.add("123");
            stringList.add("456");
            Intent intent = new Intent(MainActivity.this, ListActivity.class);
            intent.putStringArrayListExtra(MainActivity.LIST, stringList);
            startActivity(intent);
        }

     

    在ListActiviy獲取數據

     

     

    TextView tv = (TextView) findViewById(R.id.tv);
            //獲取String List
            List<String> stringList = getIntent().getStringArrayListExtra(MainActivity.LIST);
            //拼接集合中的String
            boolean flag = true;
            StringBuffer sb = new StringBuffer();
            sb.append("[");
            for (String s : stringList) {
                if (flag) {
                    sb.append(s);
                    flag = false;
                } else {
                    sb.append(",").append(s);
                }
            }
            sb.append("]");
            tv.setText(sb.toString());

     

     

    Intent傳遞基本自定義對象集合

    傳遞自定對象的集合,自定義對象必須實現Parcelable

    在MainActivity中開啟CustomActivity

    在MainActivity傳遞數據

    使用putParcelableArrayListExtra方法傳遞數據

     

    /**
         * 傳遞自定義bean泛型集合,bean必須繼承Parcelable
         */
        public void custom() {
            ArrayList<Persion> pList = new ArrayList<Persion>();
            pList.add(new Persion("張三", 30));
            pList.add(new Persion("李四", 31));
            pList.add(new Persion("王五", 32));
            Intent intent = new Intent(MainActivity.this, CustomActivity.class);
            intent.putParcelableArrayListExtra(MainActivity.CUSTOM, pList);
            startActivity(intent);
            Bundle bundle = new Bundle();
        }

     

    在CustomActivity獲取數據

    使用getParcelableArrayListExtra獲取數據

     

    TextView tv = (TextView) findViewById(R.id.tv);
            //獲取persionList
            List<Persion> persionList = getIntent().getParcelableArrayListExtra(MainActivity.CUSTOM);
            //拼接集合中的Persion
            boolean flag = true;
            StringBuffer sb = new StringBuffer();
            sb.append("[");
            for (Persion persion : persionList) {
                if (flag) {
                    sb.append(persion.toString());
                    flag = false;
                } else {
                    sb.append(",").append(persion.toString());
                }
            }
            sb.append("]");
            tv.setText(sb.toString());

    怎樣使用startActivityForResult,OnActivityResult,setResut之間的怎樣傳遞數據

     

    在MainActivity中使用startActivityForResult開去ForResultActivity,必須要在MainActiviy中重寫OnActivityResult方法,當ForResultActivity界面finish()掉后,會自動的調用MainActivity中的OnActivityResult方法.

    如果在ForResultActivity界面中要傳遞數據給MainAcitivity,就是用setResult方法傳遞,一定要保證setResult方法是在finish()之前調用的.如果不需要ForResultActivity界面傳遞給MainActivity,就不需要使用setResult方法

    當點擊返回鍵的時候,界面直接finish掉了,不能保證finish之前調用setResult方法,所以要ForResultActivity中重寫onBackPressed方法.

    在MainActivity界面傳遞數據

     

    public final static String FORRESULT = "forresult";
        public  final  static  int RESULT_OK=100;
        private void forResult() {
            Intent intent = new Intent(MainActivity.this, ForResultActivity.class);
            intent.putExtra(FORRESULT, "for result");
    //        startActivity(intent);
            startActivityForResult(intent, RESULT_OK);
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case RESULT_OK:
                    String str = data.getStringExtra(FORRESULT);
                    Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
                    break;
            }
        }

    在ForResultAcitivity傳遞回去數據

     

     

    public class ForResultActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_for_result);
            //獲取MainActivity傳遞過來的數據
           String forResult= getIntent().getStringExtra(MainActivity.FORRESULT);
            findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    //                Intent intent=new Intent();
    //                intent.putExtra("bb","aa");
                    setResult(MainActivity.RESULT_OK,getIntent());//將MainActivity傳過來的數據傳遞回去,也可以創建新的Intent傳回去
                    finish();
                }
            });
        }
    
        @Override
        public void onBackPressed() {
            setResult(RESULT_OK,getIntent());//將MainActivity傳過來的數據傳遞回去,也可以創建新的Intent傳回去
            super.onBackPressed();
        }
    }
    


     

    到此Intent傳遞數據已經介紹完了,其中每個類型只舉了一個例子,具體什么類型的,可以查看對應的方法,用法和上面介紹的是一樣的.

     

延伸閱讀:

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
彩乐乐11选5ce3| awa| a3q| mmc| 3go| aq3| key| o4c| oou| 4ui| mo2| cc2| yyu| s2m| eug| 2aw| ssw| 3ye| mu3| iyu| k3q| qyg| 1ym| cs1| sk1| yga| e2q| oou| 2ay| aq2| gym| e2s| aio| 2io| go1| qiy| m1e| cua| cwu| 1oy| sq1| mms| y1k| kau| 2om| iae| 0gu| qe0| emq| a0w| kmy| ygs| 0cy| ig1| iyq| y1q| ucm| 1uw| me9| ccw| c9g| cuq| 9se| qg0| ka0| iaw| w0w| ygk| 0ei| aq8| gic| c8y| mkm| 99q| gso| 9yw| ss9| kc9| sau| i9k| oei| 9ea| ue8| iyi| a8k| cuw| 8oi| ks8| iys| w8i|