Android开发之为你详解Activity的常用函数
白羽 2018-06-07 来源 :网络 阅读 1772 评论 0

摘要:Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件、intent、widget以及系统各项服务等之间的交互的函数。在此,本文主要选取实际项目开发中常用的,但完全理解又需要有一定深入了解的几个函数进行讲解,后续本文会根据需要不断更新。希望本文对大家学Android有所帮助。



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     @Override3     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         //关闭Activity12         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 @Override2 public void onBackPressed() {3     moveTaskToBack(true);4 }

此方法直接将当前Activity所在的Task移到后台,同时保留activity顺序和状态。

 

3.onNewIntent调用时机

onNewIntent只有在以下场景才会回调:当前通过Intent方式启动的Activity不是重新完整新建实例,而是复用之前已经存在的实例(如被设置了singleTop启动模式,或FLAG_ACTIVITY_SINGLE_TOP intent flags或设置了Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP等,以此类推,被设置了singleTask或single。此时都会执行到onNewIntent)。onNewIntent调用后,将继续回调onRestart,onResume...

 

4.onSaveInstanceState / onRestoreInstanceState调用时机

onSaveInstanceState调用时机:当Activity变得“容易”被系统销毁时,onSaveInstanceState即被回调,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?

1.当用户按下HOME键时;

2.长按HOME键,选择运行其他的程序时;

3.按下电源按键(关闭屏幕显示)时;

4.从activity A中启动一个新的activity时;

5.屏幕方向切换时,例如从竖屏切换到横屏时。

onRestoreInstanceState调用时机,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,也可以选择在onCreate方法中做数据还原。


 1 @Override 2     protected void onRestoreInstanceState(Bundle savedInstanceState) { 3         // TODO Auto-generated method stub 4         super.onRestoreInstanceState(savedInstanceState); 5         savedInstanceState.getString("name", ""); 6          7     } 8  9     @Override10     public void onSaveInstanceState(Bundle savedInstanceState) {11         super.onSaveInstanceState(savedInstanceState);12         savedInstanceState.putString("name", "corn");13     }


或在onCreate中:


 1 public class AActivity extends ActionBarActivity { 2  3     private String name; 4  5     @Override 6     protected void onCreate(Bundle savedInstanceState) { 7         super.onCreate(savedInstanceState); 8         setContentView(R.layout.a); 9 10         if (savedInstanceState != null) {11             name = savedInstanceState.getString("name");12         }13 14     }15 16 }


需要注意的是,onSaveInstanceState被调用时,其调用发生在Activity生命周期中具体的位置。以A->B为例,A中onSaveInstanceState调用发生在A:onPause -> B:onCreate -> B:onResume -> A:onSaveInstanceState -> A:onStop。

onSaveInstanceState常常用于存储应用程序中当前Activity中重要的状态数据,以免Activity被系统意外杀掉的情况下当用户再次回来时不能找到之前的状态。如同一个Activity中使用多个fragment实现菜单功能时,最好需要在此函数中记录下当前菜单对应的fragment id等。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved