概述:

    在Android中,不同的 Activity实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在Activity之间传递消息。Android中通过intent对象来表示一条消息,一个Intent对象不仅包含有这个消息的目的,还可以包含消息的内容。对于一个Intent对戏,消息”目的地“是必须的,而内容则是可选项。

1.通过Bundle对象来传递

    发送:

 

Intent intent = new Intent("本类文件名,可用this表示收件人地址,必须加class");
//创建email内容
//编写内容
"可自定义变量名","要传值的名字");
//封装 email
      srartActivity(intent)//启动新的Activity

    接受:

Intent intent =getIntent();//接受
     Bundle bundle = intent.getBundleExtra("key");//打开email
      bundle.getString("变量名");

2.使用Intent定义的Bundle对象

    上面通过bundle对象来传递信息,bundle维护了一个HashMap<String,Object>对象,将我们的数据存储在这个HschMap中来进行传递。但是像上面这样的代码稍显复杂。

Intent intent = new Intent("当前类用this",将传递的类加class);
     intent.putExtra("boolan_key",true);
     intent.putExtra("string_key","string_value");
     startActivity(intent);

 接受:

 

Intent intent = getIntent();
      intent.getBooleanExtra("boolean_key",false);
      intetn.getStringExtra("string_key");

 3.Activity返回数据 实例:

       Android提供了一个机制,跳转到其他activity时,再返回,可以接受到其他activity返回的值,无需再start新的当前activity。

       理论:在activity1中添加信息按钮为它添加onclick事件,实现跳转到activity2,在activity2中添加学生信息,比如姓名,年龄,班级等,然后点击提交,将信息映射到activity1中的TextView.

1)创建activity1XML文件

    

<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:onClick="add"
        android:layout_marginLeft="141dp"
        android:layout_marginTop="214dp"
        android:text="添加信息" />

添加一个button按钮,给一个事件

 

<TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textColor="#FF4A06"
        android:textSize="18sp"
        android:layout_marginLeft="77dp"
        android:layout_marginTop="58dp" />

添加一个TextView让其信息显示

2)创建Activity1

   

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text=(TextView)findViewById(R.id.textView1);
        }
        public void add(View v)
        {
         Intent intent = new Intent(this,newxinxi.class);
         startActivityForResult(intent,1);

可以一次性完成这项任务,当程序执行到这段代码的时候,假若从Activity1跳转到下一个Activity2,而当这个Activity2调用了finish()方法以后,程序会自动跳转回Activity1,并调用前一个Activity1中的onActivityResult( )方法

        这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0

   

}
        @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if(requestCode==1&& resultCode==1)
         {
          String ages=data.getStringExtra("ages");
          System.out.println(ages);
          text.setText(ages);
         }
         }

(1)当需要返回值时,那么在启动另一个Activity时要用到Activity2(intent, REQUEST_CODE);
     注意第二个参数是请求的int类型的值,这个值要在onActivityResult()方法中和requestCode做判断的,
     由此来判断是启动的某个Activity。
(2)onActivityResult()方法中的第二个参数就是Activity2传回来的键,
     第三个参数就是Activity2传回来的键对应的值。

    3)创建Activity2的XML文件

 

   

<TextView android:text="姓名:"
            android:layout_width="70dp"
            android:id="@+id/name"
            android:layout_height="20dp"/>

 

 

<EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" >

 创建姓名TextView和EditText

     

<requestFocus />
 <TextView android:text="年龄:"
            android:layout_width="70dp"
            android:id="@+id/age"
            android:layout_height="20dp"/>
           <EditText
            android:id="@+id/editText2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" >
            <requestFocus />
           </EditText>

 创建年龄TextView和EditText

<TextView android:text="学校:"

            android:layout_width="70dp"

            android:id="@+id/school"

            android:layout_height="20dp"/>
        <EditText

            android:id="@+id/editText3"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:ems="10" >

            <requestFocus />

        </EditText>

        创建学校TextView和EditText

<Button

        android:id="@+id/button1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="tijiao"

        android:text="Button" />

      创建提交的按钮为其添加事件

4)创建Activity2文件

   

public void tijiao(View v)

         {

          school1=(EditText)findViewById(R.id.editText1);

          names=(EditText)findViewById(R.id.editText2);

          ages=(EditText)findViewById(R.id.editText3);

获取学校姓名和年龄的id

       

a=ages.getText().toString();

          n=names.getText().toString();

          s=school1.getText().toString();

取得输入框里的内容

         

Intent intent=new Intent();

          String zong="姓名:"+n+" "+"年龄:"+a+" "+"学校:"+s;

          intent.putExtra("ages", zong);

  用intent的putExtra进行传值

          setResult(1, intent);

1、要接收setResult参数,只有通过startActivityForResult的方式启动,通过startActivity的方式是不行的。
2、哪个activity中写startActivityForResult(a1.this,a2.class),就在a1中的onActivityResult接收a2返回的setResult的值

          newxinxi.this.finish();

在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。
当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity。


         }