Activity和Intent

一个界面就是一个Activity,不同的界面之间切换(单纯的转向或是传递数据转向)均需要 Intent 媒介,并通过使用 startActivity(myintent)或者startActivityForResult(myintent)实现。举例如下:

代码1

 //单纯切换界面
Intent myintent = new Intent(this,otherPage.class);
startActivity(myintent);

该段代码将从当前页面跳转到名为otherPage的界面。

如果要传递数据给下一个页面,需要将数据绑定至Intent中。

代码2

Intent myintent = new Intent(this,otherPage.class);
myintent.putExtra(“MY_DATA_NAME_1”,MY_stringDATA_1);
myintent.putExtra(“MY_DATA_NAME_2”,MY_stringDATA_2);
startActivity(myintent);

如果传递的数据比较多,可以创建一个Bundle类,它是一种特别定义的Map类型,采用一名一值对应形式存储数据。

代码3

Bundle mybundle = new Bundle();
mybundle.putString(“MY_DATA_NAME_1”,MY_stringDATA_1);
mybundle.putString(“MY_DATA_NAME_2”,MY_stringDATA_2);
mybundle.putInt(“MY_DATA_NAME_3”,MY_intDATA_3);
Intent myintent = new Intent(this,otherPage.class);
myintent.putExtras(mybundle);
startActivity(myintent);

*注意红色字体,在加入Bundle类型的数据到Intent中时,需要用到putExtras()方法。

那么下一个页面该如何接受数据呢?对照代码2和代码3,分别看一下otherPage中的相关代码

对照代码2

Intent receiver = this.getIntent();
String mydata1=receiver.getStringExtra(“MY_DATA_NAME_1”);
String mydata2=receiver.getStringExtra(“MY_DATA_NAME_2”)

对照代码3

Bundle mydatas = this.getIntent().getExtras();
String mydata1 = mydatas.getString(“MY_DATA_NAME_1”);
String mydata2 = mydatas.getString(“MY_DATA_NAME_2”);
int mydata3 = mydatas.getInt(“MY_DATA_NAME_3”);

那么,如果我们需要从下一个页面取得返回值,供前一个页面使用呢?看看下面的代码

代码4

private static final int TAG_A = 0;
private static final int TAG_B = 1;
//some other codes here …
Intent myintent = new Intent(this,nextPageA.class);
startActivityForResult(myintent,TAG_A);
/* some other codes here
 …  …  … */
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
      super.onActivityResult(requestCode, resultCode, intent);
     switch(requestCode){
     case TAG_A:
          //do something
          break;
     case TAG_B:
          //do something
          break;
      }
  }

当使用startActivityForResult()方法时,都需要覆写onActivityResult()方法对返回值进行处理。注意startActivityForResult()中第二个int类型的参数,这个值是自定义的标记值,用来标记当前的intent。

如果一个页面需要进行多次不同的跳转,并都需要接受返回值时,这个标记值将非常有用。因为所有使用了startActivityForResult()方法所得到的返回值都会在onActivityResult函数中被接收到。可以看到在onActivityReslut函数中,使用了switch(request)来对标记值进行判断,用来确定接收到的是哪个intent所发出的。

再看看nextPageA中的代码,他是怎么执行返回值操作的。

Intent back = new Intent();
back.putExtra(“BACK_DATA_NAME”,BACK_DATA);
setResult(RESULT_OK,back);
//usually end this activity
finish()

通过setResult()方法来执行返回值操作。数值依然绑定在intent中进行传送。

注意看setResult()方法中的第一个int类型参数,作用依然是标记值,用来判断执行成功与否。可以自定义,但必须从1开始(一般用不着自定义吧)。RESULT_OK是自带参数,它的值为-1,还有个自带参数RESULT_CANCELED,它的值为0。

当发生特殊情况,比如产生返回值的activity崩溃了,这个参数将自动设为RESULT_CANCELED。在接受返回值的activity中的onActivityResult()方法中,resultCode就是对应的这个标记值。

原文地址:https://www.cnblogs.com/tt_mc/p/1678699.html