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

Android Activity的跳转与传值详解

程序员文章站 2023-11-29 08:19:40
android activity的跳转与传值详解 activity跳转与传值,主要是通过intent类来连接多个activity,以及传递数据。  int...

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"); 

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!