一个界面就是一个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就是对应的这个标记值。