8Activity間傳遞數(shù)據(jù)

Activity之間傳遞數(shù)據(jù)一般通過以下幾種方式實(shí)現(xiàn):

  1. 通過intent傳遞數(shù)據(jù)
  2. 通過Application
  3. 使用單例
  4. 靜態(tài)成員變量。(可以考慮 WeakReferences)
  5. 持久化(sqlite、share preference、file等)

一、通過intent傳遞數(shù)據(jù)

  1. 直接傳遞,intent.putExtra(key, value)
  2. 通過bundle,intent.putExtras(bundle);

注意:

  1. 這兩種都要求傳遞的對象必須可序列化(Parcelable、Serializable)
  2. 通過intent傳遞數(shù)據(jù)是有大小限制滴,超過限制,要么拋異常,要么新的Activity啟動失敗,如果傳遞圖片要轉(zhuǎn)換成byte[ ]。

實(shí)例

類實(shí)現(xiàn)Serializable接口

public class NewsBean implements Serializable
    {

第一個(gè)activity

NewsResultBean.NewsBean newsBean=newsBeanList.get(position);
Intent intent=newIntent(ActivityNewsList.this,ActivityNewsArticle.class);
Bundle bundle=new Bundle();
bundle.putSerializable("newsBean",newsBean);
//將數(shù)據(jù)放進(jìn)其intent中
intent.putExtras(bundle);
startActivity(intent);

接收數(shù)據(jù)

Intent intent=getIntent();
Bundle bundle=intent.getExtras();
NewsResultBean.NewsBean newsBean=(NewsResultBean.NewsBean) bundle.getSerializable("newsBean");

二、Application

有時(shí)候,兩個(gè)頁面之間沒有跳轉(zhuǎn)關(guān)系,但是這兩頁面之間卻需要傳遞一些數(shù)據(jù),甚至說某個(gè)頁面獲得的數(shù)據(jù)要被之后的很多頁面拿來使用,這個(gè)時(shí)候就需要applicaiton。
application是與應(yīng)用程序的生命周期一致的,即只要應(yīng)用程序不關(guān)掉,他就會存活。只有應(yīng)用程序退出了它才會給銷毀。
但是需要注意的是:
當(dāng)由于某些原因(比如系統(tǒng)內(nèi)存不足),我們的app會被系統(tǒng)強(qiáng)制殺死,此時(shí)再次點(diǎn)擊進(jìn)入應(yīng)用時(shí),系統(tǒng)會直接進(jìn)入被殺死前的那個(gè)界面,制造一種從來沒有被殺死的假象。那么問題來了,系統(tǒng)強(qiáng)制停止了應(yīng)用,進(jìn)程死了,那么再次啟動時(shí)Application自然新的,那里邊的數(shù)據(jù)自然木有啦,如果直接使用很可能報(bào)空指針或者其他錯(cuò)誤。
因此還是要考慮好這種情況的:

  1. 使用時(shí)一定要做好非空判斷
  2. 如果數(shù)據(jù)為空,可以考慮邏輯上讓應(yīng)用直接返回到最初的activity,比如用 FLAG_ACTIVITY_CLEAR_TASK 或者 BroadcastReceiver 殺掉其他的activity。

創(chuàng)建application子類

public class MyApplication extends Application {
    private String str;
    private int myInt;
    
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
}

設(shè)置數(shù)據(jù)

//返回當(dāng)前activity的applicaiton對象
mapp=(MyApplication) getApplication();
mapp.setStr("張三");

獲得數(shù)據(jù)

mapp=(MyApplication) getApplication();
String str=mapp.getStr();

三、使用單例

public class DataHolder {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}
  private static final DataHolder holder = new DataHolder();
  public static DataHolder getInstance() {return holder;}
}

設(shè)置數(shù)據(jù)

DataHolder.getInstance().setData(data);

獲得數(shù)據(jù)

String data = DataHolder.getInstance().getData();

五、持久化數(shù)據(jù)

那就是sqlite、share preference、file等了。
優(yōu)點(diǎn):
(1)應(yīng)用中所有地方都可以訪問
(2)即使應(yīng)用被強(qiáng)殺也不是問題了
缺點(diǎn):
(1)操作麻煩
(2)效率低下
(3)io讀寫嘛,其實(shí)還是比較容易出錯(cuò)的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容