对于activity的启动有两种方式
1.startActivity-这种方式比较简单,我们就不做讲解了
2.startActivityForResult-这种启动方式可以实现父子activity双向数据的传递,下面我们就结合demo学习这种启动方式
直接看代码
下面有三个activity(HeadSetActivity-主activity,MyActivity1,MyActivity2),用的是同一个layout(activity_main.xml),具体如下
activity_main.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" > <RelativeLayout android:id="@+id/abc" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="400dp" android:background="@drawable/select" android:gravity="center" android:textSize="30dp" android:text="main_activity" android:textColor="#ff0000" /> <Button android:id="@+id/bt1" android:layout_width="170dp" android:layout_height="100dp" android:layout_below="@+id/tv" android:src="@drawable/select" android:text="activity_1" android:textColor="#ff0000" /> <Button android:id="@+id/bt2" android:layout_width="170dp" android:layout_height="100dp" android:layout_alignParentRight="true" android:layout_below="@+id/tv" android:src="@drawable/select" android:text="activity_2" android:textColor="#ff0000" /> </RelativeLayout> </LinearLayout>
HeadSetActivity
package com.example.alert; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class HeadSetActivity extends Activity { private TextView textView; private Button button1; private Button button2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv); button1 = (Button) findViewById(R.id.bt1); button2 = (Button) findViewById(R.id.bt2); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //启动activity1 Intent intent = new Intent("activity_one"); startActivityForResult(intent, 1); } }); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //启动activity2 Intent intent = new Intent("activity_two"); startActivityForResult(intent, 2); } }); } //这个方法主要是接受子activity返回的数据的 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); //requestCode 这个是启动子activity的时候,父activity给予的标签,父分组管理 //resultCode 这个是子activity返回来的标签,是子activity分组管理 //data里面是子activity返回来的数据 if (requestCode == 1) { if (resultCode == 10) { String string = data.getExtras().getString("activity_finish"); textView.setText("com from activity 1 and finish"+" " + string); } else if (resultCode == 100) { String string = data.getExtras().getString("activity_no_finish"); textView.setText("com from activity 1 and no finish"+" " + string); } } else if (requestCode == 2) { if (resultCode == 20) { textView.setText("com from activity 2 and finish"); } else if (resultCode == 120) { textView.setText("com from activity 2 and no finish"); } } } }
MyActivity1
package com.example.alert; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MyActivity1 extends Activity { private TextView textView; private Button button1; private Button button2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv); textView.setText("i am activity1"); button1 = (Button) findViewById(R.id.bt1); button1.setText("setresult but no finish"); button2 = (Button) findViewById(R.id.bt2); button2.setText("setresult but and finish"); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putString("activity_no_finish", "i am no finish"); intent.putExtras(bundle); //不传输数据 //MyActivity1.this.setResult(100); //可以传输数据,数字是对应parent 中的resultCode MyActivity1.this.setResult(100, intent); } }); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putString("activity_finish", "i am finish"); intent.putExtras(bundle); MyActivity1.this.setResult(10,intent); finish(); } }); } }
MyActivity2
package com.example.alert; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MyActivity2 extends Activity { private TextView textView; private Button button1; private Button button2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv); textView.setText("i am activity2"); button1 = (Button) findViewById(R.id.bt1); button1.setText("setresult but no finish"); button2 = (Button) findViewById(R.id.bt2); button2.setText("setresult but and finish"); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub MyActivity2.this.setResult(120); } }); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub MyActivity2.this.setResult(20); finish(); } }); } }
接下来我们直接演示结果
从上面的结果我们可以总结如下
1.startActivityForResult(intent, 1);第一个参数是父传子数据, 第二个参数是启动组号;
setResult(100, intent),第一个参数是返回组号,第二个参数是返回数据
两个组号定位onActivityResult 方法中的执行项
2.setResult 仅仅是给父activity传递消息跟数据,并不会销毁当前activity,一般我们会在调用setResult方法以后,主动调用finish方法
3.setResult 方法,当启动方式是startActivity的时候,这个方法无效,但也不会有什么异常
4.两个不同的子activity 可以拥有完全一样的启动组好跟返回组号。毕竟onActivityResult方法,只有在子activity返回父activity的时候,才会被触发一次