1、用startActivityForResult()时,必须注意跳转前页面和跳转后的页面在AndroidManifest.xml文件中的注册事件必须不能包含:android:launchMode="singleTask"原因参考笔记25.
2、getIntent():Return the intent that started this activity.(取得开启这个Activity的intent)。注意若用startActivityForResult(),getIntent()得到的值为跳转前界面的intent,而非跳转后的。
3、startActivityForResult()和startActivity()不要混搭。假设A跳B再跳回A,想实现A执行一半跳到B执行,B执行完继续执行A未执行的部分:只能用startActivityForResult()。混搭即本来B中用setResult()返回A,结果你想用startActivity()返回A,这是不对的。
接着说A跳B再跳回A,想实现A执行一半跳到B执行,B执行完继续执行A未执行的部分:A要被执行的后半部分必须放在onActivityResult()函数中,否则无法实现。
4、startActivity():调用后并不是立即跳转,而是执行完该函数的剩余部分才跳转。所以如果startActivity()所在函数中,startActivity()后还有代码,执行完剩余代码后才跳转。startActivityForResult()同理。
5、三个activity,分别是A、B、C。A通过startActivityForResult跳到B,B又跳到C,C再跳到B,然后B再通过setResult()回到A。在A的onActivityResult()方法中不能获得B传回的值。必须通过其他方式,比如在B或C中将值保存在一个地方,然后在A中的onActivityResult()方法中,从这个地方取出来;而且在onActivityResult()方法中只能通过判断requestCode是否为请求的值的方式来取得。大概说下原因:A跳到B,B跳到C,C再到B,此时getIntent将是C传入的intent而不是A传入的intent,所以在B中调用setResult()回到A,通过OnActivityResult()的resultCode是不能获得返回值的。(我在购物车的选择地址中用到此种情况)
6、startActivityForResult(intent, requestCode)传入的requestCode值必须大于等于零。
1、startActivity():仅仅是跳转到目标页面,若想跳回之前页面,必须再用一次startActivity()。
Intent intent=new Intent(this, TestActivity.class); startActivity(intent);
2、startActivityForResult():可一次完成跳转到目标页面再跳回的功能。假设从T1Activity跳转到T2Activity,当T2Activity调用finish()方法后,程序会自动跳回T1Activity,并调用T1Activity中的onActivityResult()方法。调用逻辑(假设跳转前页面为A,跳转后页面为B):1)A页面调用startActivityForResult()跳转(可同时向B传数据)。2)在B调用setResult()方法(B向A传的数据)和finish()方法(结束B,返回A)。3)在A中重写onActivityResult()方法,用来接收B传回的数据。
A源码:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn=(Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO 自动生成的方法存根 Intent intent=new Intent(); intent.setClass(MainActivity.this, TestActivity.class); Bundle b=new Bundle(); b.putString("MyKey", "MyValue"); intent.putExtras(b); startActivityForResult(intent, 0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO 自动生成的方法存根 switch (resultCode) { case RESULT_OK:<span style="color:#ff0000;">//此处取值时intent用data</span> <span style="white-space:pre"> </span>Intent intent=data; // Toast.makeText(getApplicationContext(), "ab", Toast.LENGTH_LONG).show(); break; default: break; } } }B源码:
public class TestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO 自动生成的方法存根 super.onCreate(savedInstanceState); setContentView(R.layout.test); Button btn=(Button) this.findViewById(R.id.btn); //获取intent final Intent intent=getIntent(); //获取数据 final Bundle b=getIntent().getExtras(); String str=b.getString("MyKey"); btn.setText(str); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO 自动生成的方法存根 TestActivity.this.setResult(RESULT_OK, intent); finish(); } }); } }
注意:setResult()并不是调用后立即返回数据,而是在执行finish()之后才返回。setResult()必须在finish()之前调用,在如下方法中调用有可能返回失败:onPause()、onStop()、onDestroy(),因这些方法调用不一定是在finish之前的,当然在onCreate()调用setResult()肯定在finish()之前。为什么说上述方法不一定在finish()之前呢:因安卓机的返回(BACK)键。
按BACK从一个activity退出,一按BACK,android就会自动调用Activity的finish()方法,然后设置返回码为RESULT_CANCELD,就不返回任何数据了。解决方法是在activity里捕获BACK事件,捕获之后先setResult(),后自己调用finish()。
@Override public void onBackPressed() { // TODO 自动生成的方法存根 <span style="white-space:pre"> </span>setResult(); <span style="white-space:pre"> </span>super.onBackPressed(); }
3、Bundle类:Bundle类是一个key-value对:A mapping from String values to various Parcelable types.Bundle类是一个final类。
两个activity之间通信可以通过Bundle类来实现:分两步
第一把:A向B传数据
1)新建一个Bundle类。2)Bundle对象中加入数据(key-value的形式,另一个activity里取数据的时候,就要用到key,找出对应的value)。3)新建一个intent对象,并将该bundle加入这个intent对象。
Intent intent=new Intent(); intent.setClass(MainActivity.this, TestActivity.class); Bundle b=new Bundle(); b.putString("MyKey", "MyValue"); intent.putExtras(b); startActivityForResult(intent, 0);
第二步:B获取数据:
//获取intent final Intent intent=getIntent(); //获取数据 final Bundle b=getIntent().getExtras(); String str=b.getString("MyKey");B向A传数据时,可用从A得到的intent或者新建一个intent。如果传A得到的intent,且不添加任何数据时,那么A得到的数据为空。
关于传类对象、集合、类对象集合:参考笔记37