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()方式打开。具体方式如下:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AActivity.this, BActivity.class);
startActivityForResult(intent, 1);
}
});
其中,startActivityForResult第一个参数为Intent,因此,对于需要传递额外参数时,可以通过Intent直接传递。其中Bundle为可选参数。第二个参数为requestCode,即业务请求码。
B Activity中,在处理完或相应完用户操作后,自身结束前,需要通过setResult将数据回传给A。
btnClose.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 需要返回的数据存入到intent中
Intent intent = new Intent();
intent.putExtra("name", "corn");
//设置返回数据
setResult(RESULT_OK, intent);
//关闭Activity
finish();
}
});
接下来A接手B回传的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
String name;
// 取得B回传的数据
if(resultCode == RESULT_OK ){
name = intent.getStringExtra("name");
} else if(resultCode == RESULT_CANCELED){
// ...
}
}
此函数组合中,需要注意如下问题:
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键效果,此时可以直接通过此函数实现,非常实用。
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
此方法直接将当前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方法中做数据还原。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.getString("name", ""); } @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString("name", "corn");
}
或在onCreate中:
public class AActivity extends ActionBarActivity {
private String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
if (savedInstanceState != null) {
name = savedInstanceState.getString("name");
}
}
}
需要注意的是,onSaveInstanceState被调用时,其调用发生在Activity生命周期中具体的位置。以A->B为例,A中onSaveInstanceState调用发生在A:onPause -> B:onCreate -> B:onResume -> A:onSaveInstanceState -> A:onStop。
onSaveInstanceState常常用于存储应用程序中当前Activity中重要的状态数据,以免Activity被系统意外杀掉的情况下当用户再次回来时不能找到之前的状态。如同一个Activity中使用多个fragment实现菜单功能时,最好需要在此函数中记录下当前菜单对应的fragment id等。
Android总结篇系列:Activity中几个主要函数详解的更多相关文章
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- linux内核中send与recv函数详解
Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- Android 短信模块分析(二) MMS中四大组件核心功能详解
接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity 1 ...
- Delphi中Format与FormatDateTime函数详解
copy:http://hi.baidu.com/yunfanleo/blog/item/0c51d9cdbc0531550eb34558.html Format是一个很常用,却又似乎很烦的方法,本人 ...
- linux中fork()函数详解(原创!!实例讲解) (转载)
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不 ...
- (转)linux中fork()函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...
- linux中fork()函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...
- linux中fork()函数详解(转)
转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过 ...
随机推荐
- [python]numpy.mean()用法
a=np.array([[[1,1],[2,2],[3,3]],[[4,4],[5,5],[6,6]],[[7,7],[8,8],[9,9]],[[10,10],[11,11],[12,12]]]) ...
- vmware虚机 修改bios方法
.vmx文件添加以下行,会在下次启动时自动出现bios,并会将"TRUE"改为“false” bios.forceSetupOnce = "TRUE"
- HDU-AcmKeHaoWanLe训练实录
菜鸡队训练实录. 现场赛记录:[名称:奖项/排名] 2017: ICPC Shenyang:Gold/3 CCPC Hangzhou:Gold/3 ICPC Beijing:Gold/13 CCPC ...
- Chapter 5 : Control Structures 2 : Repetition
import java.util.*; import java.io.*; public class Loop { static Scanner console = new Scanner(Syste ...
- Vue(三十一)轮播组件
直接上源码 (1)组件文件 Carousel.vue <template> <div class="carousel-component"> <div ...
- 微信小程序开发---自定义组件
开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用:也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护.自定义组件在使用时与基础组件非常相似. 创建自定义组件 类似于页面, ...
- [LeetCode] Find And Replace in String 在字符串中查找和替换
To some string S, we will perform some replacement operations that replace groups of letters with ne ...
- 有关promise的技巧
其实promise的作用是将异步的代码转化为同步,这里的异步指的是request1,request2.
- SQL Server Service Broker创建单个数据库会话(消息队列)
概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...
- VUE插件大总结
UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...