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或设置了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     @Override
10     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等。

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: Android
本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3776184.html,如需转载请自行联系原作者

Android总结篇系列:Activity中几个主要函数详解相关推荐

  1. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  2. pythonpandas函数详解_对pandas中Series的map函数详解

    Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然Dat ...

  3. python中plt定义,对Python中plt的画图函数详解

    1.plt.legend plt.legend(loc=0)#显示图例的位置,自适应方式 说明: 'best' : 0, (only implemented for axes legends)(自适应 ...

  4. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  5. 在oracle中游标的操作,Oracle中的游标和函数详解

    Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操 ...

  6. 转:linux中fork()函数详解

    转:linux中fork()函数详解 https://blog.csdn.net/jason314/article/details/5640969 转载于:https://www.cnblogs.co ...

  7. Oracle中nvl()与nvl2()函数详解

    Oracle中nvl()与nvl2()函数详解: 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值: 函数nvl2(expression1,e ...

  8. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  9. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  10. python中文件读写--open函数详解

    python中open函数详解 在python中文件的读取分为三步走: 读:打开文件 -> 读文件 -> 关闭文件 (有点像把大象放进冰箱需要几步?的问题) 1.open函数 open函数 ...

最新文章

  1. 2006校园流行语锋线排行TOP10
  2. 实践人生 —— 一个普通IT人的十年回顾(下)
  3. 路径字符串生成树形结构的思路_LeetCode 22. 括号生成
  4. 多线程基础(五)NSThread线程通信
  5. python【力扣LeetCode算法题库】136-只出现一次的数字
  6. 各种烧写文件格式简介-ELF Hex Bin axf
  7. Winform中设置ZedGraph的字体和间距不随图形的缩放而缩放
  8. Redis 实践笔记
  9. Qt-调用dll动态链接库
  10. HDOJ 1875 HDU 1875 畅通工程再续 ACM 1875 IN HDU
  11. java后端模拟http请求_Http请求后端
  12. Tensorflow入门--图与会话
  13. Oralce的内存结构
  14. Python 数据科学手册 5.5 朴素贝叶斯分类
  15. windows10系统如何设置标题栏显色
  16. tomcat端口被占用的两个解决方法
  17. shiro的详细讲解
  18. linux中备份mysql数据库命令_linux备份mysql数据库命令
  19. Java+mysql毕业设计,网上订餐系统
  20. 如何把应用程序变成.exe执行文件

热门文章

  1. SQL 通配符 、分页 功能的学习
  2. 群体智能之人工蜂群算法及其改进(ABC)
  3. 【Git/Github学习笔记】GitHub上README写法暨GFM语法解读
  4. leetcode刷题日记-课程表 III
  5. 批量修改txt文件名,删除相同部分
  6. HDF5数据模型介绍及h5py
  7. VirtuoZo数字摄影测量(一)——单模型的建立
  8. EXCEL VLOOKUP函数的使用(二)
  9. 补码转源码 吐血总结
  10. Java虚拟机优化在哪里,锁在Java虚拟机中的实现和优化