笔记19--startActivity、startActivityForResult、Bundle--更新传类对象、集合、类对象集合

来源:互联网 发布:离开以后网络歌手 编辑:程序博客网 时间:2024/06/05 14:40

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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn=(Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic 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);}});}@Overrideprotected 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO 自动生成的方法存根super.onCreate(savedInstanceState);setContentView(R.layout.test);Button btn=(Button) this.findViewById(R.id.btn);//获取intentfinal Intent intent=getIntent();//获取数据final Bundle b=getIntent().getExtras();String str=b.getString("MyKey");btn.setText(str);btn.setOnClickListener(new OnClickListener() {@Overridepublic 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()。

@Overridepublic 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获取数据:

//获取intentfinal Intent intent=getIntent();//获取数据final Bundle b=getIntent().getExtras();String str=b.getString("MyKey");
B向A传数据时,可用从A得到的intent或者新建一个intent。如果传A得到的intent,且不添加任何数据时,那么A得到的数据为空。
第三步:要想获得B传给A的数据,只需使用onActivityResult中的data参数。

关于传类对象、集合、类对象集合:参考笔记37


0 0
原创粉丝点击