Activity數(shù)據(jù)傳遞詳解

唉,好久都沒有寫過博客了。真的是太懶了。最近在看《Android權(quán)威編程指南》,挺不錯的一本書,感覺里面有很多開發(fā)規(guī)范,是很值得一看的一本書。
  • 感覺在工作中經(jīng)常處理Activity之間的數(shù)據(jù)傳遞,通常我們都是只用(以前我是的)startActivity(),但是看一些別人的代碼中經(jīng)常用到startActivityForResult()。當(dāng)時就是感覺很高大上的樣子,然后一直不太清楚里面的具體到底是干什么的。但是我看了上面的一本書之后就比較明白了。so,我就想寫一篇博客把他們之間的關(guān)系寫清楚,當(dāng)然也為下一篇博客打一下基礎(chǔ)。
  • 先說一下應(yīng)用場景吧,有時候我們會從Activity1跳轉(zhuǎn)到Activity2之后,還需要從Activity2中拿到一些處理后的數(shù)據(jù)那怎么辦呢?
  • 通常,以前的我肯定會想,這不是很簡單嗎?再從Activity2直接調(diào)用startActivity跳轉(zhuǎn)到Activity1不就行了嘛,我以前也是這樣做的(┬_┬),當(dāng)然這個方法是可以解決這樣的問題的,但是現(xiàn)在我就是覺得這樣的方法很low,所以startActivityForResult(),setResult(),onActivityResult()這三個方法就很好解決上面的問題。
  • 下面說一下用法:首先在Activity1中調(diào)用startActivityForResult()方法,其實這個是比startActivity()更為高級?,F(xiàn)在先看一下Activity的跳轉(zhuǎn)的代碼,startActivityForResult()會比startActivity多一個參數(shù),第二個參數(shù)叫做請求代碼,請求代碼是先發(fā)送給子Activity,然后再返回給父Activity的的整數(shù)值。如果在Activity1中只跳轉(zhuǎn)一個Activity的話,是沒有用的,但是跳轉(zhuǎn)多個Activity的時候就可以區(qū)分不同類型的Activity。
Intent intent=SetActivity.newIntent(StartActivity.this,true);
startActivityForResult(intent,REQUEST_CODE_CHAT);
  • 當(dāng)從Activity1跳轉(zhuǎn)到Activity2的時候,需要調(diào)用setResult()方法,需要傳入兩個參數(shù),第一個返回碼的值int類型的,第二個參數(shù)是Intent類型。一般來說第一個參數(shù)可以是一下任意的一個預(yù)定義常量:Activity.REUSLT_OK 或者 Activity.RESULT_CANCELED。當(dāng)然這兩個有什么區(qū)別呢,當(dāng)然是有區(qū)別的。我們從REUSLT后面就可以猜到,如果沒有調(diào)用setResult()方法的情況下,用戶按了后退按鈕,Activity1則會收到收到 Activity.RESULT_CANCELED的結(jié)果代碼。一般情況下都是填A(yù)ctivity.REUSLT_OK這個code值。
 Intent data=new Intent();
 data.putExtra(EXTRA_SHOW,isAnswerShown);
 //這里可以設(shè)置也可以不用設(shè)置。要看具體的返回值
 setResult(RESULT_OK,data);
  • 當(dāng)從Activity2返回到Activity1的時候。需要在Activity1中添加 onActivityResult()回調(diào)方法。onActivityResult()中有三個參數(shù),第一個參數(shù)requestCode叫做請求值,就是從Activity1中跳轉(zhuǎn)到Activity2中在startActivityForResult()中設(shè)置的第二個參數(shù)的值。第二個參數(shù)resultCode叫做結(jié)果值,就是從Activity2中跳轉(zhuǎn)到Activity1中在setResult()中設(shè)置的第一個參數(shù)的值。最后一個參數(shù)data,就是跳轉(zhuǎn)過來傳遞的值嘍。(感覺是不是有點暈)
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode != Activity.RESULT_OK){
            return;
        }
        //如果只有一個Activity跳轉(zhuǎn)的話,這個判斷可以不用寫
        if(REQUEST_CODE_CHAT == requestCode){
        if(data==null) return;
            isTure=SetActivity.wasAnswerShown(data);
            Toast.makeText(this,"回來的結(jié)果"+isTure,Toast.LENGTH_SHORT).show();
        }

    }
  • 首先判斷一下:resultCode 的值是否和在Activity2中setResult()的值是否一樣。如果不一樣的就returned。如果有多個Activity跳轉(zhuǎn)的話,這里就可以用requestCode用來區(qū)分是從那個Activity跳轉(zhuǎn)過來的。最后就可以從data中取值了。下面貼一下倆個Activity的全部代碼

第一個Activity,就是我說的Activity1

package zhan.com.typeview.simaple.intent;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import zhan.com.typeview.R;

/**
 * @date 創(chuàng)建時間: 2017/11/12 0012 16:25
 * @author zh_legend
 * @Description 跳過去的Activity
 * @Email code_legend@163.com
 * @Version 1.0
 */
public class StartActivity extends AppCompatActivity {

    //響應(yīng)碼
    private  static  final int REQUEST_CODE_CHAT=0;
    //得到的返回值
    private boolean isTure;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
    }
    public void jump(View v){
        Intent intent=SetActivity.newIntent(StartActivity.this,true);
        startActivityForResult(intent,REQUEST_CODE_CHAT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode != Activity.RESULT_OK){
            return;
        }
        //如果只有一個Activity跳轉(zhuǎn)的話,這個判斷可以不用寫
        if(REQUEST_CODE_CHAT == requestCode){
            if(data==null) return;
            isTure=SetActivity.wasAnswerShown(data);
            Toast.makeText(this,"回來的結(jié)果"+isTure,Toast.LENGTH_SHORT).show();
        }

    }
}

第二個Activity,就是我說的Activity2

package zhan.com.typeview.simaple.intent;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import zhan.com.typeview.R;

import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;
/**
 * @date 創(chuàng)建時間: 2017/11/12 0012 16:24
 * @author zh_legend
 * @Description  返回過去的
 * @Email code_legend@163.com
 * @Version 1.0
 */
public class SetActivity extends AppCompatActivity {

    //返回的結(jié)果
    private static final String EXTRA_IS_TRUE="zhan.com.typeview.simaple.intent.is_true";

    private static final String EXTRA_SHOW="zhan.com.typeview.simaple.intent.show";

    //跳轉(zhuǎn)得到的結(jié)果
    private boolean isAnsTrue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set);
        Intent intent = getIntent();
        isAnsTrue=intent.getBooleanExtra(EXTRA_IS_TRUE,false);
        Toast.makeText(this,"跳轉(zhuǎn)過來的結(jié)果"+isAnsTrue,Toast.LENGTH_SHORT).show();
        setAnswerShowResult(false);
    }

    public static Intent newIntent(Context packageContext,boolean answerIsTrue){
        Intent intent=new Intent(packageContext,SetActivity.class);
        intent.putExtra(EXTRA_IS_TRUE,answerIsTrue);
        return intent;
    }

    public static boolean wasAnswerShown(Intent result){
        return result.getBooleanExtra(EXTRA_SHOW,false);
    }

    private void setAnswerShowResult(boolean isAnswerShown){
        Intent data=new Intent();
        data.putExtra(EXTRA_SHOW,isAnswerShown);
        //這里可以設(shè)置也可以不用設(shè)置。要看具體的返回值
        setResult(RESULT_OK,data);
    }


}

  • 最后總結(jié)一下,感覺里面的代碼有很多借鑒支持,首先是Activity之間跳轉(zhuǎn),我們一般都是寫到第一個Activity中的,但是作者的寫法卻寫到了需要跳轉(zhuǎn)的Activity里面,感覺這種思想真的挺不錯。最直觀的好處就是數(shù)據(jù)傳遞的時候參數(shù)不容易出錯。

好了,就這樣吧。

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

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

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