Intent傳遞數據全解

      網友投稿 983 2022-05-29

      概述

      之前的博文也有介紹,查看—->用戶界面開發基礎

      這里單獨抽取出來,更加詳細的記錄一下,其實主要是API的使用。

      Intent傳遞簡單數據

      可以以直接通過調用Intent的putExtra()方法存入數據,然后在獲得Intent后調用getXxxExtra獲得 對應類型的數據;傳遞多個的話,可以使用Bundle對象作為容器,通過調用Bundle的putXxx先將數據 存儲到Bundle中,然后調用Intent的putExtras()方法將Bundle存入Intent中,然后獲得Intent以后, 調用getExtras()獲得Bundle容器,然后調用其getXXX獲取對應的數據。

      Intent傳遞數組

      寫入數組:

      bd.putStringArray("StringArray", new String[]{"xx","oo"}); //可把StringArray換成其他數據類型,比如int,float等等,具體查看API

      1

      2

      讀取數組:

      String[] str = bd.getStringArray("StringArray")

      1

      Intent傳遞集合

      List<基本數據類型或String>

      寫入集合:

      intent.putStringArrayListExtra(name, value) intent.putIntegerArrayListExtra(name, value)

      1

      2

      讀取集合:

      intent.getStringArrayListExtra(name) intent.getIntegerArrayListExtra(name)

      1

      2

      List< Object>

      將list強轉成Serializable類型,然后傳入(可用Bundle做媒介)

      寫入集合:

      putExtras(key, (Serializable)list)

      1

      讀取集合:

      (List) getIntent().getSerializable(key)

      1

      PS:Object類需要實現Serializable接口

      Map

      //傳遞復雜些的參數 Map map1 = new HashMap(); map1.put("key1", "value1"); map1.put("key2", "value2"); List> list = new ArrayList>(); list.add(map1); Intent intent = new Intent(); intent.setClass(MainActivity.this,ComplexActivity.class); Bundle bundle = new Bundle(); //須定義一個list用于在budnle中傳遞需要傳遞的ArrayList,這個是必須要的 ArrayList bundlelist = new ArrayList(); bundlelist.add(list); bundle.putParcelableArrayList("list",bundlelist); intent.putExtras(bundle); startActivity(intent);

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      Intent傳遞對象

      傳遞對象的方式有兩種:將對象轉換為Json字符串或者通過Serializable,Parcelable序列化 不建議使用Android內置的摳腳Json解析器,可使用fastjson或者Gson第三方庫!

      將對象轉換為Json字符串

      Gson解析的例子:

      Model:

      public class Author{ private int id; private String name; // .... }

      1

      2

      3

      4

      5

      寫入數據:

      Book book=new Book(); book.setTitle("Java編程思想"); Author author=new Author(); author.setId(1); author.setName("Bruce Eckel"); book.setAuthor(author); Intent intent=new Intent(this,SecondActivity.class); intent.putExtra("book",new Gson().toJson(book)); startActivity(intent);

      1

      2

      3

      4

      5

      6

      7

      8

      9

      讀取數據:

      Intent傳遞數據全解

      String bookJson=getIntent().getStringExtra("book"); Book book=new Gson().fromJson(bookJson,Book.class); Log.d(TAG,"book title->"+book.getTitle()); Log.d(TAG,"book author name->"+book.getAuthor().getName());

      1

      2

      3

      4

      使用Serializable,Parcelable序列化對象

      Serializable實現:

      ①業務Bean實現:Serializable接口,寫上getter和setter方法

      ②Intent通過調用putExtra(String name, Serializable value)傳入對象實例 當然對象有多個的話多個的話,我們也可以先Bundle.putSerializable(x,x);

      ③新Activity調用getSerializableExtra()方法獲得對象實例: eg:Product pd = (Product) getIntent().getSerializableExtra(“Product”);

      ④調用對象get方法獲得相應參數

      Parcelable實現:

      一般流程:

      ①業務Bean繼承Parcelable接口,重寫writeToParcel方法,將你的對象序列化為一個Parcel對象;

      ②重寫describeContents方法,內容接口描述,默認返回0就可以

      ③實例化靜態內部對象CREATOR實現接口Parcelable.Creator

      ④同樣式通過Intent的putExtra()方法傳入對象實例,當然多個對象的話,我們可以先 放到Bundle里Bundle.putParcelable(x,x),再Intent.putExtras()即可。

      通過writeToParcel將你的對象映射成Parcel對象,再通過createFromParcel將Parcel對象映射 成你的對象。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流里面, 在通過createFromParcel從流里讀取對象,只不過這個過程需要你來實現,因此寫的 順序和讀的順序必須一致。

      實現Parcelable接口的代碼示例:

      //Internal Description Interface,You do not need to manage @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int flags){ parcel.writeString(bookName); parcel.writeString(author); parcel.writeInt(publishTime); } public static final Parcelable.Creator CREATOR = new Creator() { @Override public Book[] newArray(int size) { return new Book[size]; } @Override public Book createFromParcel(Parcel source) { Book mBook = new Book(); mBook.bookName = source.readString(); mBook.author = source.readString(); mBook.publishTime = source.readInt(); return mBook; } };

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      Android Studio生成Parcleable插件:

      Intellij/Andriod Studio插件android-parcelable-intellij-plugin 只要ALT+Insert,即可直接生成Parcleable接口代碼。

      另外:Android中大量用到Parcelable對象,實現Parcable接口又是非常繁瑣的,可以用到 第三方的開源框架:Parceler

      可參考Android的Parcelable自動生成

      兩種序列化方式的比較

      1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。

      2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。

      3)Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的 持續性在外界有變化的情況下。盡管Serializable效率低點,但此時還是建議使用Serializable。

      Intent傳遞Bitmap

      bitmap默認實現Parcelable接口,直接傳遞即可

      Bitmap bitmap = XXXX; Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putParcelable("bitmap", bitmap); intent.putExtra("bundle", bundle);

      1

      2

      3

      4

      5

      通過全局對象傳遞數據

      詳見本人另外一篇博客用戶界面開發基礎-使用全局對象傳遞變量

      如果你想某個數據可以在任何地方都能獲取到,你就可以考慮使用 Application全局對象了!

      Android系統在每個程序運行的時候創建一個Application對象,而且只會創建一個,所以Application 是單例(singleton)模式的一個類,而且Application對象的生命周期是整個程序中最長的,他的生命 周期等于這個程序的生命周期。如果想存儲一些比靜態的值(固定不改變的,也可以變),如果你想使用 Application就需要自定義類實現Application類,并且告訴系統實例化的是我們自定義的Application 而非系統默認的,而這一步,就是在AndroidManifest.xml中加入application標簽添加:name屬性!

      注意事項

      Application對象是存在于內存中的,也就有它可能會被系統殺死,比如這樣的場景:

      我們在Activity1中往application中存儲了用戶賬號,然后在Activity2中獲取到用戶賬號,并且顯示!

      如果我們點擊home鍵,然后過了N久候,系統為了回收內存kill掉了我們的app。這個時候,我們重新 打開這個app,這個時候很神奇的,回到了Activity2的頁面,但是如果這個時候你再去獲取Application 里的用戶賬號,程序就會報NullPointerException,然后crash掉~

      之所以會發生上述crash,是因為這個Application對象是全新創建的,可能你以為App是重新啟動的, 其實并不是,僅僅是創建一個新的Application,然后啟動上次用戶離開時的Activity,從而創造App 并沒有被殺死的假象!所以如果是比較重要的數據的話,建議你還是進行本地化,另外在使用數據的時候 要對變量的值進行非空檢查!還有一點就是:不止是Application變量會這樣,單例對象以及公共靜態變量 也會這樣~

      單例模式的MyApplication

      按照上述的寫法,獲取context ,需要這樣,

      // 獲取全局變量 AppContext context = (AppContext)getApplication(); String name = context.appName; Data data = context.data;

      1

      2

      3

      4

      5

      如果覺得麻煩,可以寫成單例模式,比如

      private String myState; private static MyApp instance; public static MyApp getInstance(){ return instance; } public String getState(){ return myState; } public void setState(String s){ myState = s; } @Override public void onCreate(){ onCreate(); instance = this; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      然后在任意地方我們就可以直接調用:MyApp.getInstance()來獲得Application的全局對象!

      單例模式傳參

      上面的Application就是基于單例的,單例模式的特點就是可以保證系統中一個類有且只有一個實例。 這樣很容易就能實現,在A中設置參數,在B中直接訪問了。這是幾種方法中效率最高的。

      單例類

      public class XclSingleton { //單例模式實例 private static XclSingleton instance = null; //synchronized 用于線程安全,防止多線程同時創建實例 public synchronized static XclSingleton getInstance(){ if(instance == null){ instance = new XclSingleton(); } return instance; } final HashMap mMap; private XclSingleton() { mMap = new HashMap(); } public void put(String key,Object value){ mMap.put(key,value); } public Object get(String key) { return mMap.get(key); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      設置參數

      XclSingleton.getInstance().put("key1", "value1"); XclSingleton.getInstance().put("key2", "value2");

      1

      2

      Android 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:MapReduce初體驗——統計指定文本文件中每一個單詞出現的總次數
      下一篇:一篇搞定python基礎(二)
      相關文章
      亚洲乱码中文字幕久久孕妇黑人| 亚洲熟妇中文字幕五十中出| 国产亚洲一区二区精品| 亚洲色一色噜一噜噜噜| 日韩精品电影一区亚洲| 蜜臀亚洲AV无码精品国产午夜.| 亚洲欧美国产国产综合一区| 国产精品亚洲片夜色在线| 亚洲成a人片7777| 亚洲成人一级电影| 亚洲一级毛片免费观看| 亚洲毛片免费观看| 亚洲午夜精品在线| 国产色在线|亚洲| 亚洲国产乱码最新视频| 亚洲一区二区三区高清在线观看 | 亚洲国产精品成人精品小说| 亚洲国产精品综合久久久| 亚洲伊人久久大香线蕉| 中文字幕在线观看亚洲日韩| 亚洲中文字幕久久无码| 亚洲国产无线乱码在线观看 | 亚洲AV日韩AV永久无码绿巨人| 亚洲av无码不卡| 亚洲黄色网址在线观看| 亚洲免费人成视频观看| 亚洲高清中文字幕免费| 久久综合亚洲色hezyo| 亚洲国产综合无码一区二区二三区| 久久久久亚洲精品男人的天堂 | 亚洲中文字幕无码中文字| 亚洲精品乱码久久久久久V | 亚洲精品美女在线观看| 亚洲人成777在线播放| 亚洲色大情网站www| 国产偷国产偷亚洲高清人| 中文字幕亚洲图片| 久久99国产亚洲精品观看| 亚洲激情黄色小说| 亚洲欧美国产日韩av野草社区| 亚洲成?Ⅴ人在线观看无码|