導航:首頁 > 操作系統 > androidintent傳遞數據

androidintent傳遞數據

發布時間:2022-12-26 18:49:50

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傳遞數據時key使用靜態常量

首先靜態常量是要佔內存的,但是正常開發中,該占就要佔。其實,靜態常量在APP啟動後就存在,要回收也是先回收其他的變數。真到了回收靜態常量的時候,應該是你的手機內存不足崩潰了

Ⅲ android intent 傳數據問題,能否確定傳入的數據來自哪個activity

完全可以,只需要往intent裡面添加一個標識數據即可


//兩個activity

//第一個activity
{

privateButtonbtn;

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn.setOnClickListener(newOnClickListener(){

@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(OneActivity.this,EditActivity.class);
intent.putExtra("from",1);
startActivity(intent);
}
});
}
}

//第二個activity
{

privateButtonbtn;

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn.setOnClickListener(newOnClickListener(){

@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(OneActivity.this,EditActivity.class);
intent.putExtra("from",2);
startActivity(intent);
}
});
}
}


編輯activity,判斷intent傳進來的from數據,為1即為OneActivity,2為TwoActivity

{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intentintent=getIntent();
intfrom=intent.getIntExtra("from",0);
switch(from){
case1:
//OneActivity
break;
case2:
//TwoActivity
break;
//case.......
}
}
}

Ⅳ 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 Intent傳遞大量數據造成頁面卡頓,閃退的解決方案

        我們知道在Activity間使用Intent傳遞List含有大量序列化的對象的時候,或者傳遞較大bitmap等較大量數據的時候會引起頁面卡頓。而且Android本身也限制了能夠傳遞的數據大小在1MB左右。這就要求我們不得不為傳輸大量數據尋求一個解決方法。

        通常我們可以想到的一個方法是當從A頁面跳轉至B頁面的時候將需要傳遞的大對象賦值給A頁面的一個靜態變數,在B頁面去取A頁面的值。這種方式簡單卻有很多問題,比如可能會有很多其他頁面訪問B頁面這會導致靜態變數管理混亂,而且如果在組件化開發的過程中,需要進行組件間跳轉的時候只能把這種靜態變數寫在BaseLibrary中,這顯然是不夠友好的。

        我們稍加處理做一個簡單的封裝。++參考:《Android工程化最佳實踐》++

        就這樣簡單的兩個類我們就完成了封裝,可以看到在Model中序列化了一個int值。下面我們來看一個簡單的使用示例:

        通過以上方式的封裝,可以看到無論需要序列化傳遞的對象有多大,在傳值的時候只是傳遞了一個「int」而已。使用該這種方法時需要注意的一點是在數據的接收頁面只能使用getIntent()獲取一次該對象的值,因為我們在取完一次值後便將該對象從緩存區移除了。

Ⅵ intent傳遞數據時可以傳遞哪些類型的數據

在android應用的開發中,如果我們需要在不同的模塊(比如不同的activity之間)之間傳遞數據,通常有以下兩種方法:
1.
利用intent對象攜帶數據
通過查詢intent/bundle的api文檔,我們可以獲知,intent/bundle支持傳遞基本類型的數據和基本類型的數組數據,以及string/charsequence類型的數據和string/charsequence類型的數組數據。而對於其它類型的數據貌似無能為力,其實不然,我們可以在intent/bundle的api中看到intent/bundle還可以傳遞parcelable(包裹化,郵包)和serializable(序列化)類型的數據,以及它們的數組/列表數據。
所以要讓非基本類型和非string/charsequence類型的數據通過intent/bundle來進行傳輸,我們就需要在數據類型中實現parcelable介面或是serializable介面。
1.1
利用parcelable介面實現數據通過intent/bundle進行傳遞
/**
*
代表一個人的信息
*
@author
gansc
*/
public
class
personinfo
implements
parcelable
{
public
string
iname;
//
人名
publicint
isex;
//
性別
public
string
iid;
//
身份證號碼
public
string
imobilenumber;
//
手機號碼
public
string
iemailaddr;
//
郵箱地址
//
from
parcelable
@override
publicint
describecontents()
{
return0;
}
//
from
parcelable
//
保存到包裹中
@override
publicvoid
writetoparcel(parcel
dest,
int
flags)
{
dest.writestring(iname);
dest.writeint(isex);
dest.writestring(iid);
dest.writestring(imobilenumber);
dest.writestring(iemailaddr);
}
//
實現parcelable介面的類型中,必須有一個實現了parcelable.creator介面的靜態常量成員欄位,
//
並且它的名字必須為creator的
publicstaticfinal
parcelable.creator
creator
=new
parcelable.creator
()
{
//
from
parcelable.creator
@override
public
personinfo
createfromparcel(parcel
in)
{
personinfo
brief
=new
personinfo();
//
從包裹中讀出數據
brief.iname
=
in.readstring();
brief.isex
=
in.readint();
brief.iid
=
in.readstring();
brief.imobilenumber
=
in.readstring();
brief.iemailaddr
=
in.readstring();
return
brief;
}
//
from
parcelable.creator
@override
public
personinfo[]
newarray(int
size)
{
returnnew
personinfo[size];
}
};
}

Ⅶ intent可以傳遞哪些類型數據類型

在Android應用的開發中,如果我們需要在不同的模塊(比如不同的Activity之間)之間傳遞數據,通常有以下兩種方法:

1. 利用Intent對象攜帶數據

通過查詢Intent/Bundle的API文檔,我們可以獲知,Intent/Bundle支持傳遞基本類型的數據和基本類型的數組數據,以及String/CharSequence類型的數據和String/CharSequence類型的數組數據。而對於其它類型的數據貌似無能為力,其實不然,我們可以在Intent/Bundle的API中看到Intent/Bundle還可以傳遞Parcelable(包裹化,郵包)和Serializable(序列化)類型的數據,以及它們的數組/列表數據。

所以要讓非基本類型和非String/CharSequence類型的數據通過Intent/Bundle來進行傳輸,我們就需要在數據類型中實現Parcelable介面或是Serializable介面。

1.1 利用Parcelable介面實現數據通過Intent/Bundle進行傳遞

/**
* 代表一個人的信息
* @author gansc
*/
public class PersonInfo implements Parcelable
{
public String iName; // 人名
publicint iSex; // 性別
public String iId; // 身份證號碼
public String iMobileNumber; // 手機號碼
public String iEMailAddr; // 郵箱地址
// From Parcelable
@Override
publicint describeContents()
{
return0;
}
// From Parcelable
// 保存到包裹中
@Override
publicvoid writeToParcel(Parcel dest, int flags)
{
dest.writeString(iName);
dest.writeInt(iSex);
dest.writeString(iId);
dest.writeString(iMobileNumber);
dest.writeString(iEMailAddr);
}
// 實現Parcelable介面的類型中,必須有一個實現了Parcelable.Creator介面的靜態常量成員欄位,
// 並且它的名字必須為CREATOR的
publicstaticfinal Parcelable.Creator<PersonInfo> CREATOR
=new Parcelable.Creator<PersonInfo>()
{
// From Parcelable.Creator
@Override
public PersonInfo createFromParcel(Parcel in)
{
PersonInfo brief =new PersonInfo();
// 從包裹中讀出數據
brief.iName = in.readString();
brief.iSex = in.readInt();
brief.iId = in.readString();
brief.iMobileNumber = in.readString();
brief.iEMailAddr = in.readString();
return brief;
}
// From Parcelable.Creator
@Override
public PersonInfo[] newArray(int size)
{
returnnew PersonInfo[size];
}
};
}

閱讀全文

與androidintent傳遞數據相關的資料

熱點內容
我的世界如何查看伺服器種子pc 瀏覽:284
linuxlamp編譯安裝 瀏覽:609
枚舉演算法ppt 瀏覽:184
cmd查看進程命令 瀏覽:956
手機內怎麼刪除APP 瀏覽:834
魚群和鳥群演算法區別 瀏覽:93
pdf尺寸設置 瀏覽:211
android訪問本地伺服器 瀏覽:512
程序員相親被刪除微信 瀏覽:790
centos命令窗口 瀏覽:596
編譯器有幾個好用的 瀏覽:500
資料庫和網站如何搭載伺服器 瀏覽:154
網路流理論演算法與應用 瀏覽:795
java和matlab 瀏覽:388
釘釘蘋果怎麼下app軟體 瀏覽:832
php網站驗證碼不顯示 瀏覽:859
鋁膜構造柱要設置加密區嗎 瀏覽:344
考駕照怎麼找伺服器 瀏覽:885
阿里雲伺服器如何更換地區 瀏覽:972
手機app調音器怎麼調古箏 瀏覽:503