在Android中,Activity作为界面显示。google并不推荐在Activity中做耗时操作,如果Activity操作耗时超过5s时,会提示是否等待对话框。
一般耗时操作会在Service中处理,Service主要负责长期在后台运行。
自从google推出Fragment以来,中文翻译为碎片,使用的越来越广泛。在同一个Activity界面会插入几个Fragment,用来显示不同的功能界面。
在我们的实际项目中,总是会用到Activity、Service及Fragment。Activity与它们之间是怎么进行通信,完成UI更新。接下来,我们一一道来。
一、Activity与Activity之间的通信
当A Activity打开B Activity时,大家都知道通过调用startActivity(intent),由A启动B。如果希望A传递信息给B,只需如果在intent携带即可。如果携带的信息中包含自定义类,需要将类序列化,实现接口Parcelable或者Serializable。
A启动B:
<span style="font-size:14px;"> Intent intent = new Intent(this, AtySecond_.class);
// 设置启动Activity时携带的参数信息 的Intent
Bundle bundle = new Bundle();
bundle.putString("AtySecond", "AtyCommActivity传递的消息,不需要返回值");
intent.putExtras(bundle);
startActivity(intent);</span>
B中获取A传递的信息:<span style="font-size:14px;"> // 获取出入的Budle
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
msg = bundle.getString("AtySecond", "");</span>
这种方法,大家都很熟悉,如果在关闭B Activity时,A希望从B中获取操作结果,该如何做呢?在A启动B时只能使用另外一种启动方法——startActivityForResult。startActivityForResult(Intent intent,int requestCode,)的主要作用就是它可以回传数据,其中参数intent,就是启动Activity的意图,参数requestCode是启动Activity,获取返回值的请求码,在onActivityResult作返回值处理时使用,以便分别是哪一个返回值请求。1.A在启动B时,再使用startActivity()而是使用startActivityForResult
<span style="font-size:14px;"> // 设置启动Activity时携带的参数信息 的Intent
Intent intent = new Intent(this, AtySecond_.class);
Bundle bundle = new Bundle();
bundle.putString("AtySecond", "AtyCommActivity传递的消息,需要返回值");
intent.putExtras(bundle);
// 参数 REQUEST_ONE :请求依据,作为在onActivityResult做处理时识别码
startActivityForResult(intent, REQUEST_ONE);</span>
2.重写onActivityResult,来获取从BActivity返回的数据<span style="font-size:14px;"> protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i("123", "requestCode: " + requestCode);
if (requestCode == REQUEST_ONE) {
if (null != data) { // data为AtySecond返回的Intent
// msg即为回传的值
St