Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件、intent、widget以及系统各项服务等之间的交互的函数。在此,本文主要选取实际项目开发中常用的,但完全理解又需要有一定深入了解的几个函数进行讲解,后续本文会根据需要不断更新。
1. startActivityForResult / onActivityResult / setResult 函数组合
提到这类函数组合,相信只要有过一段时间Android开发的来说都很熟悉了,此函数组合主要用于如下场景:用户在A Activity上点击某个按钮,跳转到B Activity,然后用户在B Activity上进行一些具体的操作,待操作完成后返回到A Activity,同时常常将B Activity中操作的一些数据返回到A Activity中。
再如上场景中,A -> B 需要通过startActivityForResult()方式打开。具体方式如下:
1 button.setOnClickListener(new View.OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 Intent intent = new Intent(AActivity.this, BActivity.class);
5 startActivityForResult(intent, 1);
6 }
7 });
其中,startActivityForResult第一个参数为Intent,因此,对于需要传递额外参数时,可以通过Intent直接传递。其中Bundle为可选参数。第二个参数为requestCode,即业务请求码。
B Activity中,在处理完或相应完用户操作后,自身结束前,需要通过setResult将数据回传给A。
1 btnClose.setOnClickListener(new View.OnClickListener() {
2 public void onClick(View v) {
3
4 // 需要返回的数据存入到intent中
5 Intent intent = new Intent();
6 intent.putExtra("name", "corn");
7
8 //设置返回数据
9 setResult(RESULT_OK, intent);
10
11 //关闭Activity
12 finish();
13 }
14 });
接下来A接手B回传的数据。
1 @Override
2 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
3 String name;
4 // 取得B回传的数据
5 if(resultCode == RESULT_OK ){
6 name = intent.getStringExtra("name");
7 } else if(resultCode == RESULT_CANCELED){
8 // ...
9 }
10 }
此函数组合中,需要注意如下问题:
1.根据项目的实际需要进行定义,特别需要注意的是,requestCode必须 >= 0,否则此类效果失效,其效果将变成startActivity()效果;
2.resultCode表示B中处理后的结果状态,系统内部定义了RESULT_OK、RESULT_CANCELED和RESULT_FIRST_USER三种状态。当然,自己可以定义成任何int型标识状态。
3.有时在复杂的业务逻辑中,可能存在A startActivityForResult 到B,同时C也startActivityForResult 到B,且requestCode可能相同(以表示同意业务请求),这时可能需要在B中针对性的判断此请求来源(来自于A还是C)。此时,可以通过intent传参形式。相信大家都比较熟悉,其实Activity类中也提供了相应的函数可以获取到来源Activity的类型函数:getCallingActivity()。但需要注意此函数仅针对startActivityForResult有效,返回的结果中包含完成包名。
4.A中回调函数调用时机需要注意,其调用发生在B的onPause之后,A的onRestart之前(如果B完成遮住了A),且必然在onResume之前。
5.此函数组合针对B的启动模式为singleTask或singInstance将会失效。此时,onActivityResult将在A的onpause之后直接回调,且resultCode为RESULT_CANCELED。
2.moveTaskToBack
如《Android总结篇系列:Activity生命周期》一文中有提到的,模拟现在的主流应用最后按Back键时不是强制退出应用或直接结束根Activity,而是采取类Home键效果,此时可以直接通过此函数实现,非常实用。
1 @Override
2 public void onBackPressed() {
3 moveTaskToBack(true);
4 }
此方法直接将当前Activity所在的Task移到后台,同时保留activity顺序和状态。
3.onNewIntent调用时机
onNewIntent只有在一下场景才会回调:当前通过Intent方式启动的Activity不是重新完整新建实例,而是复用之前已经存在的实例(如被设置了singleTop启动模式,或FLAG_ACTIVITY_SINGLE_TOP intent flags等,以此类推,被设置了singleTask或single。此时都会执行到onNewIntent)。此函数回调发生在onResume之前。