笔记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
- 笔记19--startActivity、startActivityForResult、Bundle--更新传类对象、集合、类对象集合
- 笔记37--Bundle传类对象、集合、类对象集合
- Bundle传递集合对象
- Bundle传输数据之携带集合对象
- mybatis 批量更新(对象集合)
- 5.4更新 Dapper通用类新增方法:Oracle多表联查 获取集合 动态类型集合对象
- javascript 普通对象和集合类的操作学习笔记
- 集合对象
- Fragment之间使用Bundle传递对象,数据,序列化,集合
- 集合类 :VBA集合对象的安全包装
- 集合类:VBA集合对象的安全包装
- 类继承CollectionBase,对象集合管理。继承DictionaryBase,管理集合
- API常用对象--集合类(集合框架)
- 一个对象集合排序的类
- 一个对象集合排序的类
- 一个类得到两个集合对象
- 写一个对象集合排序的类
- Iphone 集合类的对象释放
- find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer 的问题有待解决
- PE 导入表
- URL规范化(URL normalization) 及 不规则URL
- pb 实现后台自动打印pdf 文件
- 测序发展小结
- 笔记19--startActivity、startActivityForResult、Bundle--更新传类对象、集合、类对象集合
- 台阶问题
- 一个人写的 一些开源的资源 主要是记录下
- 【C++ 快速入门】一个使用IO库的程序
- oracle 解锁
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
- mybatis多对一查询
- Hadoop 2.2 and Maven
- 为什么电脑很热?