Android总结篇系列:Activity中几个主要函数详解
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总结篇系列:Activity中几个主要函数详解相关推荐
- python平方数迭代器_对python中的高效迭代器函数详解
python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...
- pythonpandas函数详解_对pandas中Series的map函数详解
Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然Dat ...
- python中plt定义,对Python中plt的画图函数详解
1.plt.legend plt.legend(loc=0)#显示图例的位置,自适应方式 说明: 'best' : 0, (only implemented for axes legends)(自适应 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- 在oracle中游标的操作,Oracle中的游标和函数详解
Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操 ...
- 转:linux中fork()函数详解
转:linux中fork()函数详解 https://blog.csdn.net/jason314/article/details/5640969 转载于:https://www.cnblogs.co ...
- Oracle中nvl()与nvl2()函数详解
Oracle中nvl()与nvl2()函数详解: 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值: 函数nvl2(expression1,e ...
- android mvp模式例子_Android中mvp模式使用实例详解
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
- linux内核中send与recv函数详解
Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...
- python中文件读写--open函数详解
python中open函数详解 在python中文件的读取分为三步走: 读:打开文件 -> 读文件 -> 关闭文件 (有点像把大象放进冰箱需要几步?的问题) 1.open函数 open函数 ...
最新文章
- 2006校园流行语锋线排行TOP10
- 实践人生 —— 一个普通IT人的十年回顾(下)
- 路径字符串生成树形结构的思路_LeetCode 22. 括号生成
- 多线程基础(五)NSThread线程通信
- python【力扣LeetCode算法题库】136-只出现一次的数字
- 各种烧写文件格式简介-ELF Hex Bin axf
- Winform中设置ZedGraph的字体和间距不随图形的缩放而缩放
- Redis 实践笔记
- Qt-调用dll动态链接库
- HDOJ 1875 HDU 1875 畅通工程再续 ACM 1875 IN HDU
- java后端模拟http请求_Http请求后端
- Tensorflow入门--图与会话
- Oralce的内存结构
- Python 数据科学手册 5.5 朴素贝叶斯分类
- windows10系统如何设置标题栏显色
- tomcat端口被占用的两个解决方法
- shiro的详细讲解
- linux中备份mysql数据库命令_linux备份mysql数据库命令
- Java+mysql毕业设计,网上订餐系统
- 如何把应用程序变成.exe执行文件