Android Activity的跳转与传值详解
android activity的跳转与传值详解
activity跳转与传值,主要是通过intent类来连接多个activity,以及传递数据。
intent是android一个很重要的类。intent直译是“意图”,什么是意图呢?比如你想从这个activity跳转到另外一个activity,这就是一个意图。intent类在android系统中的作用很大,在此不详细说了,后面有文章介绍!
activity跳转,无返回结果
这是最简单的activity跳转方式。从一个activity启动另一个activity,直接startactivity(new intent(当前activity.this, 下一activity.class))。
((button) findviewbyid(r.id.notepadv1)).setonclicklistener( new onclicklistener() { public void onclick(view v) { startactivity(new intent (myandroidappactivity.this, notepadv1.class) ); } });
activity跳转,返回数据/结果
需要返回数据或结果的,则使用startactivityforresult (intent intent, int requestcode),requestcode的值是自定义的,用于识别跳转的目标activity。
跳转的目标activity所要做的就是返回数据/结果,setresult(int resultcode)只返回结果不带数据,或者setresult(int resultcode, intent data)两者都返回!
而接收返回的数据/结果的处理函数是onactivityresult(int requestcode, int resultcode, intent data),这里的requestcode就是startactivityforresult的requestcode,resultcode就是setresult里面的resultcode,返回的数据在data里面。
myandroidappactivity:
static final int send_sms_request = 0; static final int call_request = 1; ((button) findviewbyid(r.id.sms)).setonclicklistener( new onclicklistener() { public void onclick(view v) { intent intent = new intent(myandroidappactivity.this, sendsmsactivity.class); startactivityforresult(intent, send_sms_request); } }); @override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (requestcode == send_sms_request) { if (resultcode == result_ok) { toast.maketext(this, "send sms result_ok", toast.length_short).show(); }else if (resultcode == result_canceled) { bundle bundle = data.getextras(); string phoneno = bundle.getstring("phoneno"); toast.maketext(this, "send sms result_canceled "+phoneno, toast.length_short).show(); } }else if (requestcode == call_request) { if (resultcode == result_canceled) { toast.maketext(this, "call result_canceled", toast.length_short).show(); } } }
sendsmsactivity:
((button) findviewbyid(r.id.send)).setonclicklistener( new button.onclicklistener() { public void onclick(view v) { sendsmsactivity.this.setresult(result_ok); sendsmsactivity.this.finish(); } }):
** 注意,在setresult后,要调用finish()销毁当前的activity,否则无法返回到原来的activity,就无法执行原来activity的onactivityresult函数,看到当前的activity没反应。
result_ok和result_canceled是系统空间里面的常量,不需要自定义,直接使用就行。
另外在运行过程中,发现按back键后,是可以返回result_canceled的,看了sdk doc后,原来真的是那样,而且不带有数据的。这意味着,如果你设想在返回result_canceled时并返回数据,那么需要截获back键的事件处理,把原来返回result_canceled的核心逻辑copy到事件处理里面。这里给个例子:
((button) findviewbyid(r.id.cancel)).setonclicklistener( new button.onclicklistener() { public void onclick(view v) { // 实例化 bundle,设置需要传递的参数 bundle bundle = new bundle(); bundle.putstring("phoneno", "020-123"); sendsmsactivity.this.setresult(result_canceled, sendsmsactivity.this.getintent().putextras(bundle)); sendsmsactivity.this.finish(); } }); @override public boolean onkeydown(int keycode, keyevent event) { // 是否触发按键为back键 if (keycode == keyevent.keycode_back) { // 实例化 bundle,设置需要传递的参数 bundle bundle = new bundle(); bundle.putstring("phoneno", "020-123"); setresult(result_canceled, this.getintent().putextras(bundle)); this.finish(); return true; }else { return super.onkeydown(keycode, event); } }
这里要注意的是,在处理back键事件后return true则表示本事件不再传递给其他函数处理,可理解为由当前函数全权负责处理,所以在return前finish当前activity,保持原来的行为表现,当然我们可以设置为隐藏当前activity等其他行为。
activity传送数据
在上面的代码中,我们可以看到使用bundle来存储数据,并将其putextras到intent里面。bundle使用“名字-值”来存储数据。那么,从原来的activity a传送数据到新的activity b, activity b如何获取传送过来的intent参数时呢?最近写了这样的一个例子:
in activity a:
// 在某个按钮响应事件里 intent intent = new intent(this, textinputactivity.class); intent.putextra("text", mtext); intent.putextra("textcolor", mtextcolor); intent.putextra("textsize", mtextsize); intent.putextra("textbold", mtextbold); startactivityforresult(intent, request_text);
in activity b:
// in oncreate(bundle savedinstancestate) bundle extras = getintent().getextras(); mtext = extras.getstring("text"); mtextcolor = extras.getint("textcolor"); mtextsize = extras.getfloat("textsize"); mtextbold = extras.getboolean("textbold");
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!