androidintent傳值
㈠ android intent跳轉怎樣傳輸大數據
在Activity或者組件之前傳遞信息時,一般採用intent綁定bundle的方式傳值,但在使用過程中需要注意的是不要用bundle傳遞大容量數據:
在做項目的過程中,需要將聽寫界面的聽寫結果信息傳遞到聽寫記錄界面供顯示用,但是由於傳遞的數據量過大導致程序ANR,甚至直接報異常(傳遞的信息裡面有bitmap轉換成的byte數組、每一個片語的拼音、詞語、語音信息),經過分析發現是由於bundle不能傳遞大容量的數據信息,在stackoverflow裡面查閱發現有同行遇到類似的問題:
(1)「The size limit of Intent is still pretty low in Jelly Bean, which is somewhat lower than 1MB (around 90K), so you should always be cautious about your data length, even if your application targets only latest Android versions.」
(2)「As per my experience (sometime ago), you are able to put up to 1MB of data in a Bundleencapsulated inside Intent. I think, this restriction was valid up till Froyo or GingerBread.」
所以在通過bundle傳遞數據時只能傳遞較小的數據信息,對於在不同組件之間需要傳遞大容量數據的情況時,有幾種替代方式可以解決不能用bundle傳遞這些數據的問題:
方法一:將需要傳遞的數據寫在臨時文件或者資料庫中,再跳轉到另外一個組件的時候再去讀取這些數據信息,這種處理方式會由於讀寫文件較為耗時導致程序運行效率較低;
方法二:將需要傳遞的數據信息封裝在一個靜態的類中(注意當前組件和要跳轉到的組件必須屬於同一個進程,因為進程之間才能夠共享數據),在當前組件中為類設置內容,然後再跳轉到的組件中去取,這種處理方式效率很高,但是會破壞程序的獨立性。
具體採用哪種替代方式取決於具體的情況,本人建議採取第二種處理方式,因為這樣會大大提高程序的運行效率,至於程序的獨立性,看你怎麼去封裝這個類了。
㈡ android兩個activity之間怎麼傳遞數據
Activity之間是沒有辦法直接傳遞數據的。Android的設計原則是,用Intent在不同的Activity和進程之間進行通信,但是通常來講,Intent中只能存入基本數據類型和系統默認支持的比如Uri之類的。那麼對於用戶自己定義的數據結構是無法直接用Intent來傳送的,如果想要通過Intent來傳遞自定義數據,可以讓數據結構實現Parcelable介面,這樣就可以把數據放入Intent。但是Intent的傳送效率也不是很高,特別是當傳遞一些如Bitmap的大數據,用Intent傳遞超過500K的Bitmap,就會造成Framework層的Java Binder掛掉,結果就是傳遞不成功。
這點可以算成是Android的一個弊端,沒有很好的解決方案。能做到的就是盡量設計的時候注意,盡量讓Activity之間共享基本數據類型。
Android本身的應用中也深受其害,可以看到有很多應用程序的源代碼中的主要的類在三千行以上的不在少數,比如Browser中的BrowserActivity有四千多行;Mms中的ComposeMessageActivity也有四千多行,等等。為什麼一個類會如此之大,就是因為它們是程序的主頁面,是業務的核心邏輯所在,裡面也控制著很多的其他的數據結構,而又無法與另外的Activity共享,所以就只能在一個Activity裡面做所的事情。
㈢ Android Intent的作用,哪些類型的數據可以被傳遞
(1) 要激活一個新的Activity,或者讓一個現有的Activity執行新的操作,可以通過調用Context.startActivity()或者Activity.startActivityForResult()方法。這兩個方法需要傳入的Intent參數也稱為Activity Action Intent(活動行為意圖),根據Intent對象對目標Activity描述的不同,來啟動與之相匹配的Activity或傳遞信息。
(2) 要啟動一個新的服務,或者向一個已有的服務傳遞新的指令,調用Context.startService()方法或調用Context.bindService()方法將調用此方法的上下文對象與Service綁定。
Intent一旦發出,Android都會准確找到相匹配的一個或多個Activity、Service或Broadcast-Receiver作為響應。所以,不同類型的Intent消息不會出現重疊:BroadcastIntent消息只會發送給BroadcastReceiver,而絕不可能發送給Activity或Service。由startActivity()傳遞的消息也只可能發送給Activity,由startService()傳遞的Intent只可能發送給Service。
向下一個Activity傳遞數據(使用Bundle和Intent.putExtras)
Intent it = new Intent(Activity1.this, Activity2.class);
Bundle bundle=new Intent();
bundle.putString("name", "This is from MainActivity!");
it.putExtras("bd",bundle); // it.putExtra(「test」, "shuju」);
startActivity(it); // startActivityForResult(it,REQUEST_CODE);