亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android startActivityForResult和setResult的區(qū)別

 更新時(shí)間:2017年08月29日 11:53:38   投稿:lqh  
這篇文章主要介紹了 Android startActivityForResult和setResult的區(qū)別的相關(guān)資料,希望通過本文能幫助大家理解這部分內(nèi)容,需要的朋友可以參考下

 Android startActivityForResult和setResult的區(qū)別

startActivityForResult與startActivity的不同之處在于:

1、startActivity( )

僅僅是跳轉(zhuǎn)到目標(biāo)頁面,若是想跳回當(dāng)前頁面,則必須再使用一次startActivity( )。

2、startActivityForResult( )

可以一次性完成這項(xiàng)任務(wù),當(dāng)程序執(zhí)行到這段代碼的時(shí)候,假若從T1Activity跳轉(zhuǎn)到下一個(gè)Text2Activity,而當(dāng)這個(gè)Text2Activity調(diào)用了finish()方法以后,程序會(huì)自動(dòng)跳轉(zhuǎn)回T1Activity,并調(diào)用前一個(gè)T1Activity中的onActivityResult( )方法。

相關(guān)函數(shù):

startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

 簡單例子介紹:

1.跳轉(zhuǎn)的時(shí)候不是采用startActivity(intent) 這個(gè)方法,而是startActivityForResult(intent, 0)

Intent intent=new Intent();
intent.setClass(A.this, B.class);
Bundle bundle=new Bundle();
String str1="aaaaaa";
bundle.putString("str1", str1);
intent.putExtras(bundle);
startActivityForResult(intent, 0);//這里采用startActivityForResult來做跳轉(zhuǎn),此處的0為一個(gè)依據(jù),可以寫其他的值,但一定要>=0

2.重寫onActivityResult方法,用來接收B回傳的數(shù)據(jù)。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode為回傳的標(biāo)記,我在B中回傳的是RESULT_OK
  case RESULT_OK:
  Bundle b=data.getExtras(); //data為B中回傳的Intent
  String str=b.getString("str1");//str即為回傳的值
  break;
default:
  break;
  }
}

3.在B中回傳數(shù)據(jù)時(shí)采用setResult方法,并且之后要調(diào)用finish方法。

setResult(RESULT_OK, intent); //intent為A傳來的帶有Bundle的intent,當(dāng)然也可以自己定義新的Bundle
finish();//此處一定要調(diào)用finish()方法

Android activity的setResult()在什么時(shí)候調(diào)用(重點(diǎn)也是難點(diǎn))

如果在startActivityForResult起來的Activity里面設(shè)置setResult,結(jié)果并不會(huì)馬上返回給parent的Activity,只有當(dāng)前Activity被finish,結(jié)果才會(huì)被發(fā)送給parent的onActivityResult去處理!

如果一個(gè)activity要返回?cái)?shù)據(jù)到啟動(dòng)它的那個(gè)activity,可以調(diào)用setResult()方法。那什么時(shí)候去調(diào)用setResult()方法返回?cái)?shù)據(jù)呢?
看一下源碼就明白了:

public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
      mResultCode = resultCode;
      mResultData = data;
    }
  }

  public void finish() {
    if (mParent == null) {
      int resultCode;
      Intent resultData;
      synchronized (this) {
        resultCode = mResultCode;
        resultData = mResultData;
      }
      if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
      try {
        if (ActivityManagerNative.getDefault()
          .finishActivity(mToken, resultCode, resultData)) {
          mFinished = true;
        }
      } catch (RemoteException e) {
        // Empty
      }
    } else {
      mParent.finishFromChild(this);
    }
  }

這段代碼可以看出activity返回result是在被finish的時(shí)候,也就是說調(diào)用setResult()方法必須在finish()之前。

那么如果在如下方法中調(diào)用setResult()也有可能不會(huì)返回成功: onPause(), onStop(), onDestroy(),

因?yàn)檫@些方法調(diào)用不一定是在finish之前的,當(dāng)然在onCreate()就調(diào)用setResult肯定是在finish之前的

按BACK鍵從一個(gè)Activity退出來的,一按BACK,android就會(huì)自動(dòng)調(diào)用Activity的finish()方法,然后設(shè)置resultCode為RESULT_CANCELED,也就不會(huì)返回任何數(shù)據(jù)了 .

解決方法就是在Activity里面捕獲按BACK的事件,捕獲到之后先setResult,然后自己來調(diào)用finish,就搞定了……把BACK事件直接自己給吞了

@Override
  public void onBackPressed() {
    Log.i(TAG, "onBackPressed");
    setResult(Const.LIVE_OK);
    super.onBackPressed();
  }

當(dāng)然還可以在onCreate()就調(diào)用setResult,不過我覺得這種方法沒有重寫onBackPressed()方法好.

 以上就是Android startActivityForResult和setResult的區(qū)別,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Android學(xué)習(xí)筆記(二)之電話撥號器

    Android學(xué)習(xí)筆記(二)之電話撥號器

    目前手機(jī)市場上android已經(jīng)具有強(qiáng)大的霸主地位,吸引了很多的追棒者,android學(xué)習(xí)越來越火熱,本文給大家介紹android學(xué)習(xí)筆記(二)之電話撥號器,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • Android開發(fā)之開發(fā)者頭條(二)實(shí)現(xiàn)左滑菜單

    Android開發(fā)之開發(fā)者頭條(二)實(shí)現(xiàn)左滑菜單

    本文給大家介紹Android開發(fā)之開發(fā)者頭條(二)實(shí)現(xiàn)左滑菜單,主要用android自帶的DrawerLayout控件實(shí)現(xiàn)的此功能,具體實(shí)現(xiàn)過程請參考下本文
    2016-04-04
  • Flutter底部導(dǎo)航欄的實(shí)現(xiàn)方式

    Flutter底部導(dǎo)航欄的實(shí)現(xiàn)方式

    這篇文章主要為大家詳細(xì)介紹了Flutter底部導(dǎo)航欄的實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Android編程中HTTP服務(wù)用法詳解

    Android編程中HTTP服務(wù)用法詳解

    這篇文章主要介紹了Android編程中HTTP服務(wù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android中http服務(wù)的具體步驟與相關(guān)使用技巧,需要的朋友可以參考下
    2016-01-01
  • Android中ListView的幾種常見的優(yōu)化方法總結(jié)

    Android中ListView的幾種常見的優(yōu)化方法總結(jié)

    Android中的ListView應(yīng)該算是布局中幾種最常用的組件之一,本篇文章主要做了三種優(yōu)化總結(jié),有興趣的可以了解一下。
    2017-02-02
  • 基于fluttertoast實(shí)現(xiàn)封裝彈框提示工具類

    基于fluttertoast實(shí)現(xiàn)封裝彈框提示工具類

    這篇文章主要為大家介紹了基于fluttertoast實(shí)現(xiàn)封裝彈框提示工具類的實(shí)現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Android QQ登錄界面繪制代碼

    Android QQ登錄界面繪制代碼

    這篇文章主要為大家詳細(xì)介紹了Android QQ登錄界面繪制代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android實(shí)現(xiàn)炫酷的網(wǎng)絡(luò)直播彈幕功能

    Android實(shí)現(xiàn)炫酷的網(wǎng)絡(luò)直播彈幕功能

    這篇文章主要為大家詳細(xì)介紹了Android仿網(wǎng)絡(luò)直播彈幕功能的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android如何實(shí)現(xiàn)設(shè)備的異顯功能詳解

    Android如何實(shí)現(xiàn)設(shè)備的異顯功能詳解

    這篇文章主要給大家介紹了關(guān)于Android如何實(shí)現(xiàn)設(shè)備的異顯功能的相關(guān)資料,這篇文章通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Android手機(jī)內(nèi)存中文件的讀寫方法小結(jié)

    Android手機(jī)內(nèi)存中文件的讀寫方法小結(jié)

    這篇文章主要介紹了Android手機(jī)內(nèi)存中文件的讀寫方法,實(shí)例總結(jié)了Android針對文件讀寫操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評論