Android学习笔记--Activity中使用Intent传值示例代码
程序员文章站
2023-11-27 18:53:52
intent,又称为意图,是一种运行时绑定机制,它能在程序运行的过程中链接两个不同的组件(activity、service、broadcastreceiver)。通过int...
intent,又称为意图,是一种运行时绑定机制,它能在程序运行的过程中链接两个不同的组件(activity、service、broadcastreceiver)。通过intent,程序可以向android表达某种请求或意愿,android会根据意愿的内容选择适当的组件来请求。
在这些组件之间的通讯中,主要是由intent协助完成的。intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,android则根据此intent的描述,负责找到对应的组件,将intent传递给调用的组件,并完成组件的调用。因此,intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
通过intent请求activity,必须在androidmanifest.xml文件中对被请求的activity新增标签配置,否则会导致错误。
intent一般包含两个主要信息,action、data。
action:表示这个intent此次操作的动作。
data:表示这次动作涉及的数据。
通过一个例子来展示activity中使用intent导向新activity并传递数据。此程序仅在两个页面之间相互跳转,但是每次跳转会创建新的activity,所以在startactivity()之后需要调用finish()销毁当前activity,如果不销毁,多次跳转后,程序的activity栈中会存放多个activity,点击设备的返回按钮,会发现会一直向后退。
主要步骤:
新建android项目,增加新布局文件other.xml,新增activity类otheractivity.class,用于接受intent并展示other.xml。
在mainactivity类中,声明一个intent类,通过intent的构造函数指明源和目标。
获得intent后,使用intent.putextra()方法对其传入数据。
调用activity.startactivity启动这个intent。
在otheractivity类中,使用activity.getintent()获得当前activity的intent。
获得intent后,使用intent.getxxxextra()方法获得其中保存的数据。
在androidmanifest.xml配置otheractivity节点。
示例代码
步骤2--3:
public class mainactivity extends activity {
private textview textview;
private button btn;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
textview=(textview)findviewbyid(r.id.textview1);
btn=(button)findviewbyid(r.id.button1);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
// intent构造函数:intent来源;intent目的。
intent intent =new intent(mainactivity.this,otheractivity.class);
intent.putextra("data", "当前是页面2,信息来自页面1");
startactivity(intent);//启动activity
finish();
}
});
}
}
步骤4--5:
public class otheractivity extends activity {
private button btn;
private textview textview;
@override
protected void oncreate(bundle savedinstancestate) {
// todo auto-generated method stub
super.oncreate(savedinstancestate);
setcontentview(r.layout.other);
textview=(textview)findviewbyid(r.id.textview2);
btn=(button)findviewbyid(r.id.button2);
//通过activity.getintent()获取当前页面接收到的intent。
intent intent =getintent();
//getxxxextra方法获取intent传递过来的数据
string msg=intent.getstringextra("data");
textview.settext(msg);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
intent intent=new intent(otheractivity.this,mainactivity.class);
startactivity(intent);
finish();
}
});
}
}
步骤7:
<application
android:allowbackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/apptheme" >
<activity
android:name="cn.bgxt.intentforac.mainactivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<activity android:name=".otheractivity"/>
</application>
从activity中返回数据
上面例子中只是介绍了activity通过intent传递数据,然而在实际应用中,不仅仅需要向activity传递数据,而且要从activity中返回数据,虽然返回数据和传递数据类似,但是还是有部分区别。
主要区别如下:
传递数据需要使用activity.startactivityforresult()方法启动activity,需要传递请求码,而不是activity.startactivity()。
返回数据的时候,调用activity.setresult()方法设置返回intent以及返回码。
需要重写源activity的onactivityresult()方法以便于接受返回的intent,在onactivityresult()中会判断请求码和响应码。
通过一个例子说明从activity返回数据。此程序有两个activity,在mainactivity中输入加法运算的计算数,跳转到otheractivity中输入计算结果,并在点击返回后,把计算结果输出到mainactivity中。
示例代码
mainactivity:
public class mainactivity extends activity {
private edittext one,two,result;
private button btn;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
one=(edittext)findviewbyid(r.id.one);
two=(edittext)findviewbyid(r.id.two);
result=(edittext)findviewbyid(r.id.result);
btn=(button)findviewbyid(r.id.btngo);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
// todo auto-generated method stub
int ione=integer.parseint(one.gettext().tostring());
int itwo=integer.parseint(two.gettext().tostring());
intent intent=new intent(mainactivity.this, otheractivity.class);
intent.putextra("one", ione);
intent.putextra("two", itwo);
//启动需要监听返回值的activity,并设置请求码:requestcode
startactivityforresult(intent, 1);
}
});
}
@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
super.onactivityresult(requestcode, resultcode, data);
//当otheractivity中返回数据的时候,会响应此方法
//requestcode和resultcode必须与请求startactivityforresult()和返回setresult()的时候传入的值一致。
if(requestcode==1&&resultcode==2)
{
int three=data.getintextra("three", 0);
result.settext(string.valueof(three));
}
}
@override
public boolean oncreateoptionsmenu(menu menu) {
// inflate the menu; this adds items to the action bar if it is present.
getmenuinflater().inflate(r.menu.main, menu);
return true;
}
}
otheractivity:
public class otheractivity extends activity {
textview tvshow;
edittext etresult;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.other);
tvshow=(textview)findviewbyid(r.id.tvshow);
etresult=(edittext)findviewbyid(r.id.etresult);
intent intent=getintent();
int a=intent.getintextra("one", 0);
int b=intent.getintextra("two", 0);
tvshow.settext(a+" + "+b+" = "+" ? ");
button btnresult=(button)findviewbyid(r.id.btnreturn);
btnresult.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
//新声明一个intent用于存放放回的数据
intent i=new intent();
int result=integer.parseint(etresult.gettext().tostring());
i.putextra("three", result);
setresult(2, i);//设置resultcode,onactivityresult()中能获取到
finish();//使用完成后结束当前activity的生命周期
}
});
}
}
在这些组件之间的通讯中,主要是由intent协助完成的。intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,android则根据此intent的描述,负责找到对应的组件,将intent传递给调用的组件,并完成组件的调用。因此,intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
通过intent请求activity,必须在androidmanifest.xml文件中对被请求的activity新增标签配置,否则会导致错误。
intent一般包含两个主要信息,action、data。
action:表示这个intent此次操作的动作。
data:表示这次动作涉及的数据。
通过一个例子来展示activity中使用intent导向新activity并传递数据。此程序仅在两个页面之间相互跳转,但是每次跳转会创建新的activity,所以在startactivity()之后需要调用finish()销毁当前activity,如果不销毁,多次跳转后,程序的activity栈中会存放多个activity,点击设备的返回按钮,会发现会一直向后退。
主要步骤:
新建android项目,增加新布局文件other.xml,新增activity类otheractivity.class,用于接受intent并展示other.xml。
在mainactivity类中,声明一个intent类,通过intent的构造函数指明源和目标。
获得intent后,使用intent.putextra()方法对其传入数据。
调用activity.startactivity启动这个intent。
在otheractivity类中,使用activity.getintent()获得当前activity的intent。
获得intent后,使用intent.getxxxextra()方法获得其中保存的数据。
在androidmanifest.xml配置otheractivity节点。
示例代码
步骤2--3:
复制代码 代码如下:
public class mainactivity extends activity {
private textview textview;
private button btn;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
textview=(textview)findviewbyid(r.id.textview1);
btn=(button)findviewbyid(r.id.button1);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
// intent构造函数:intent来源;intent目的。
intent intent =new intent(mainactivity.this,otheractivity.class);
intent.putextra("data", "当前是页面2,信息来自页面1");
startactivity(intent);//启动activity
finish();
}
});
}
}
步骤4--5:
复制代码 代码如下:
public class otheractivity extends activity {
private button btn;
private textview textview;
@override
protected void oncreate(bundle savedinstancestate) {
// todo auto-generated method stub
super.oncreate(savedinstancestate);
setcontentview(r.layout.other);
textview=(textview)findviewbyid(r.id.textview2);
btn=(button)findviewbyid(r.id.button2);
//通过activity.getintent()获取当前页面接收到的intent。
intent intent =getintent();
//getxxxextra方法获取intent传递过来的数据
string msg=intent.getstringextra("data");
textview.settext(msg);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
intent intent=new intent(otheractivity.this,mainactivity.class);
startactivity(intent);
finish();
}
});
}
}
步骤7:
复制代码 代码如下:
<application
android:allowbackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/apptheme" >
<activity
android:name="cn.bgxt.intentforac.mainactivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<activity android:name=".otheractivity"/>
</application>
从activity中返回数据
上面例子中只是介绍了activity通过intent传递数据,然而在实际应用中,不仅仅需要向activity传递数据,而且要从activity中返回数据,虽然返回数据和传递数据类似,但是还是有部分区别。
主要区别如下:
传递数据需要使用activity.startactivityforresult()方法启动activity,需要传递请求码,而不是activity.startactivity()。
返回数据的时候,调用activity.setresult()方法设置返回intent以及返回码。
需要重写源activity的onactivityresult()方法以便于接受返回的intent,在onactivityresult()中会判断请求码和响应码。
通过一个例子说明从activity返回数据。此程序有两个activity,在mainactivity中输入加法运算的计算数,跳转到otheractivity中输入计算结果,并在点击返回后,把计算结果输出到mainactivity中。
示例代码
mainactivity:
复制代码 代码如下:
public class mainactivity extends activity {
private edittext one,two,result;
private button btn;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
one=(edittext)findviewbyid(r.id.one);
two=(edittext)findviewbyid(r.id.two);
result=(edittext)findviewbyid(r.id.result);
btn=(button)findviewbyid(r.id.btngo);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
// todo auto-generated method stub
int ione=integer.parseint(one.gettext().tostring());
int itwo=integer.parseint(two.gettext().tostring());
intent intent=new intent(mainactivity.this, otheractivity.class);
intent.putextra("one", ione);
intent.putextra("two", itwo);
//启动需要监听返回值的activity,并设置请求码:requestcode
startactivityforresult(intent, 1);
}
});
}
@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
super.onactivityresult(requestcode, resultcode, data);
//当otheractivity中返回数据的时候,会响应此方法
//requestcode和resultcode必须与请求startactivityforresult()和返回setresult()的时候传入的值一致。
if(requestcode==1&&resultcode==2)
{
int three=data.getintextra("three", 0);
result.settext(string.valueof(three));
}
}
@override
public boolean oncreateoptionsmenu(menu menu) {
// inflate the menu; this adds items to the action bar if it is present.
getmenuinflater().inflate(r.menu.main, menu);
return true;
}
}
otheractivity:
复制代码 代码如下:
public class otheractivity extends activity {
textview tvshow;
edittext etresult;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.other);
tvshow=(textview)findviewbyid(r.id.tvshow);
etresult=(edittext)findviewbyid(r.id.etresult);
intent intent=getintent();
int a=intent.getintextra("one", 0);
int b=intent.getintextra("two", 0);
tvshow.settext(a+" + "+b+" = "+" ? ");
button btnresult=(button)findviewbyid(r.id.btnreturn);
btnresult.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
//新声明一个intent用于存放放回的数据
intent i=new intent();
int result=integer.parseint(etresult.gettext().tostring());
i.putextra("three", result);
setresult(2, i);//设置resultcode,onactivityresult()中能获取到
finish();//使用完成后结束当前activity的生命周期
}
});
}
}