Android Activity和Intent

来源:互联网 发布:程序员的思维修炼 豆瓣 编辑:程序博客网 时间:2024/05/01 04:14

一个界面就是一个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 activityfinish()

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

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

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