唉,好久都沒有寫過博客了。真的是太懶了。最近在看《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ù)。