欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android学习笔记--Activity中使用Intent传值示例代码

程序员文章站 2023-08-12 19:02:24
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的生命周期
}
});
}
}