android的Activity直接可以进行跳转和数据传递,就是通过Intent来实现的。
Intent作用有三种,第一种是启动一个新的Activity。第二种是启动一个新的Service。第三种是来广播一个事件。
1.主界面main.xml放两个按钮。
首先定义第二个按钮的监听器和监听事件:
//定义一个button2的监听器
Button.OnClickListener button2_listener = new Button.OnClickListener() {
public void onClick(View v){
setTitle("这是在MainActivity");//触发这个监听器的时候,把这个activity的title设置一下
Intent intent = new Intent();//
intent.setClass(MainActivity.this, button2Activity.class);//启动button2Activity
startActivity(intent);//启动
}
};
Button bt2_button = (Button)findViewById(R.id.button2);//得到bt2_button对象
bt2_button.setOnClickListener(button2_listener);//设置监听器
仅仅是启动一个新的Activity,新的Activity界面里又有一个button按钮,点击后可以再启动一个Activity。
public class button2Activity extends ActionBarActivity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
Button.OnClickListener button3_listener = new Button.OnClickListener() {
public void onClick(View v) {
// finish();//点击按钮,退出
Intent intent = new Intent(button2Activity.this,button3Activity.class);//启动另一个Activity,xml文件和button3Activity.java就不具体写了
startActivity(intent);
}
};
Button button3_button = (Button)findViewById(R.id.button3);
button3_button.setOnClickListener(button3_listener);
setTitle("现在是在activity2里");
}
}
2.关键是这个例子,通过Intent实现 Activity间的数据传递。
定义button1的点击事件,并设置监听器:
Button.OnClickListener button1_listener = new Button.OnClickListener() {
public void onClick(View v){
Intent intent = new Intent();
intent.setClass(MainActivity.this, button1Activity.class);
intent.putExtra("activityMain", "数据来自activityMain");//putExtra()方法是将一组名值对添加到Intent的mExtras变量里边。他是一个Bundle类型,类似于HashMap。当新的Activity获取的时候,通过第一个参数字符串来获取第二个参数。(成对的映射)
startActivityForResult(intent,REQUEST_CODE);//用这个函数启动Activity,当新的Activity结束时,还必须执行原Activity里的回调函数onActivityResult()。第二个参数是请求码,请求码大于0时,当新的Activity结束的时候,这个请求码被返回到onActivityResult()的参数里边。通过请求码不同在回调 函数里执行不同的操作。
//startActivity(intent);//用这个函数启动Activity的话,不需要执行回调函数,也就是不需要返回结果。
}
};
Button bt1_button = (Button)findViewById(R.id.button1);
bt1_button.setOnClickListener(button1_listener);
新的Activity界面activity1.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="TextView" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button4" />
</LinearLayout>
有一个Textview来显示从主Activity传过来的数据,还有一个按钮button4,点击后返回数据给主Activity。
button1Activity.java如下:
public class button1Activity extends ActionBarActivity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
Bundle extras = getIntent().getExtras();//getIntent()方法返回启动这个Activity的Intent,这里返回的就是MainActivity里定义的用来启动的intent。getExtras()方法返回这个Intent的Bundle类型的变量eExtras。这里存储了Intent携带的数据,就是从主Activity传来的数据。
if(extras != null) {
String data = extras.getString("activityMain");//名值对 //存储的数据是名值对存储的,通过“activityMain”映射获取对应的数据。
TextView textview = (TextView)findViewById(R.id.textView1);
textview.setText(data);
setTitle("现在是在Activity1里::" +data);//显示在title
}
Button.OnClickListener button4_listener= new Button.OnClickListener() {
public void onClick(View v) {
Bundle bundle = new Bundle();//用于在Intent中携带需要返回的数据,定义一下
bundle.putString("store", "数据来自Activity1");//初始化一下,名值对形式存储,主Activity可通过“store”获取第二个参数。
Intent intent = new Intent();//定义一个新的Intent
intent.putExtras(bundle);//把存有名值对的bundle放在Intent中
setResult(RESULT_OK,intent);//第一个参数是结果码,第二个参数是intent
finish();//结束当前Activity,就把数据返回给主Activity了
}
};
Button button4_button = (Button)findViewById(R.id.button4);
button4_button.setOnClickListener(button4_listener);
}
}
主Activity还有个重要的回调函数处理返回结果
protected void onActivityResult(int requestCode,int resultCode,Intent data) {//处理从新Activiy返回的数据
if(requestCode == REQUEST_CODE) {//requestCode(请求码)就是原始Intent当中的requestCode,此例是REQUEST_CODE
if(resultCode == RESULT_CANCELED) {//resultCode(结果码)是新的Activity当中的操作是否合法,如果一切正常,那么返回0,如果出现了什么问题,就不会返回0。可以构造自己的值,来区分发生了什么。
setTitle("取消");
}
else if(resultCode == RESULT_OK) {
String temp = null;
Bundle extras = data.getExtras();//Intent data就是新的Activity执行完毕返回的Intent,通过getExtras函数来获取返回的数据
if(extras != null) {
temp = extras.getString("store");//通过名值对映射来获取store映射的值。
}
setTitle(temp);//设置为Title
}
}
}
最后不要忘记在 AndroidMainfest.xml文件中注册新的Activity。