Activity生命周期

1:activity四种启动方式

standard,SingleTask,SingleTop,SingleInstance
standard:是系统默认的,每次启动该activity都会创建一个实例放在返回栈中,并且置于栈顶。
SingleTop:在每次启动活动的时候如果发现栈的栈顶已经有该活动了,那么就直接使用它,不会再创建新的活动实例。如果启动的时候没有在栈顶,那么还是会创建一个新的实例,比如说A->B ,返回栈存放过程是创建A,创建B,然后B->A(并非通过back回到A),创建A实例,因为此时返回栈中栈顶是B,所以会创建A实例。
SingleTask:整个返回栈中只有一个实例。每次启动的时候,就会在返回栈中检查是否有实例,如果有实例但不在栈顶,那么就会让栈顶出栈,它称为栈顶。例子:A->B,创建A实例,创建B实例,从B->A,此时返回栈中有A实例,就会让B实例出栈,此时栈中只有A的实例,所以点击Back后就会退出程序。(只要是在A上的实例全部出栈,如ABCD,需要用到B,此时栈中AB,CD出栈)
SingleInstance:对于设置该模式的活动(Activity),会创建一个实例保存在新的返回栈中,这是因为可供其他的程序调用这个活动,达到了共享这个实例,在单个程序中如:A->B(模式SingleInstance)->C,创建A实例,创建B实例(新返回栈中),创建C实例,当点击back键时,会C弹出栈,显示A,再次点击back键,A弹出栈,显示B。原因是A和C在一个返回栈中,而B在一个新的返回栈中。
 

2:Activity正确使用

  在实际开发中,页面很多,activity很多,所以,想要通过运行程序来判断当前所看的页面是对应哪一个activity就要创建一个父类activity,这样的话,让他们都来继承这个父类,在父类中通过OnCreate方法来执行一些公用的代码和Log日志即可。主要BaseActivity不需要在清单中注册。

所有继承该父类的activity都要调用一个父类的onCreate方法。
public class BaseActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("BaseActivity",getClass().getSimpleName());
}
}

3:Activity随时随地都可以退出

  一个程序中有退出登录,这个时候就要保所有的activity,然后可以销毁所有的activity并且之后跳转到登录页面,如果想要退出到桌面,也可以加入杀死进程的代码,防止该程序进程在后台一直运行。
杀死进程代码
android.os.Process.killProcess(Process.myPid());//获取id,杀死当前id,并杀死当前进程,不可杀死其他程序进程
Activity管理类
public class ActivityCollector {
public static List<Activity> listActivity = new ArrayList<>();
/**
* 添加活动
* */
public static void addActivity(Activity activity){
listActivity.add(activity);
}
/*删除活动*/
public static void removeActivity(Activity activity){
listActivity.remove(activity);
}
/*销毁所有活动*/
public static void finishAllActivity(){
for (Activity activity:listActivity) {
if(!activity.isFinishing()){
activity.finish();
}
}
}
}

4:启动Activity最佳写法

  问题:假设两个Activity,FirstActivity和SecondActivity,第二个活动不是你写的,但是你需要跳转到该页面,同时需要传一些参数,此时,你可以问你同事需要传什么参数,或者自己去看需要什么参数,这样太麻烦。这时就需要优化代码,你同事可以在第二个界面就留一个方法入口,把需要的参数都列出来,你只需要用类名.方法名即可
该方法写在第二个活动里,也就是需要跳转到的页面。
/*启动最佳写法*/
public static void actionStart(Context context,String param1,String param2){
Intent intent = new Intent(context,MainActivity2.class);
intent.putExtra("param1",param1);
intent.putExtra("param2",param2);
context.startActivity(intent);
}
在MAinActivity1里调用。
MainActivity2.actionStart(this,"ceshi1","ceshi2");

5:生命周期以外的方法

  • onSaveInstanceState()
  • onRestoreInstanceState()

onSaveInstanceState()和onRestoreInstanceState()使用详解 
注意
1、如果是用户自动按下返回键,或程序调用finish()退出程序,是不会触发onSaveInstanceState()和onRestoreInstanceState()的。
2、每次用户旋转屏幕时,您的Activity将被破坏并重新创建。当屏幕改变方向时,系统会破坏并重新创建前台Activity,因为屏幕配置已更改,您的Activity可能需要加载替代资源(例如布局)。即会执行onSaveInstanceState()和onRestoreInstanceState()的。
  • 1.配置改变导致Activity被杀死,横屏变竖屏:在onStop之前会调用onSaveInstanceState()保存数据在重建Activity之后,会在onStart()之后调用onRestoreInstanceState(),并把保存下来的Bundle传给onCreate()和它会默认重建Activity当前的视图,我们可以在onCreate()中,回复自己的数据。
  • 2.内存不足杀掉Activity,优先级分别是:前台可见,可见非前台,后台。
在stop()之前系统会调用onSaveInstanceState()方法,以便您的Activity可以使用一组键值对来保存状态信息。此方法的默认实现保存有关Activity视图层次结构状态的信息,例如EditText小部件中的文本或ListView的滚动位置。
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
... @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// 保存用户自定义的状态
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); // 调用父类交给系统处理,这样系统能保存视图层次结构状态
super.onSaveInstanceState(savedInstanceState);
}

恢复您的Activity状态

  当您的Activity在之前被破坏后重新创建时,您可以从Bundle系统通过您的Activity中恢复您的保存状态。这两个方法onCreate()和onRestoreInstanceState()回调方法都会收到Bundle包含实例状态信息的相同方法。因为onCreate()调用该方法是系统正在创建一个新的Activity实例或重新创建一个以前的实例,所以您必须Bundle在尝试读取之前检查该状态是否为空。如果它为空,那么系统正在创建一个Activity的新实例,而不是恢复之前被销毁的实例。

 
例如,下面是如何恢复一些状态数据onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 记得总是调用父类 // 检查是否正在重新创建一个以前销毁的实例
if (savedInstanceState != null) {
// 从已保存状态恢复成员的值
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// 可能初始化一个新实例的默认值的成员
}
...
}
onCreate()您可以选择执行onRestoreInstanceState(),而不是在系统调用onStart()方法之后恢复状态。系统onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,因此您不需要检查是否Bundle为空:
public void onRestoreInstanceState(Bundle savedInstanceState) {
// 总是调用超类,以便它可以恢复视图层次超级
super.onRestoreInstanceState(savedInstanceState); // 从已保存的实例中恢复状态成员
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

6:onNewIntent()方法

该方法和启动模式紧密相关
前提:ActivityA已经启动过,处于当前应用的Activity任务栈中;
 
当ActivityA的LaunchMode为Standard时:
由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法
当ActivityA的LaunchMode为SingleTop时:
如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法 ,生命周期顺序为:
onCreate--->onStart--->onResume---onPause>onNewIntent--->onResume
当ActivityA的LaunchMode为SingleInstance,SingleTask:
如果ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法,生命周期调用顺序为:
onCreate--->onStart--->onResume---按下Home键>onPause--->onstop--->onNewIntent--->onRestart--->onstart--->onResume
 
注意:在内存吃紧的情况下,系统可能会kill掉后台运行的 Activity ,如果不巧要启动的那个activity实例被系统kill了,那么系统就会调用 onCreate 方法,而不调用 onNewIntent 方法。这里有个解决方法就是在 onCreate 和 onNewIntent 方法中调用同一个处理数据的方法,
总结:在activityA中设置了对应的启动模式后,其他(自己也行)activityB往A中使用intent跳转,携带值时就会调用onNewIntent()方法,然后是onRestart->onStart()->onResume();

7:Activity的启动过程

启动过程不是启动模式,所谓启动过程,就是从你看到应用图标点击后到正式开启所经过的过程
  • 第一种是从桌面launcher上点击相应的应用图标
  • 第二种是在activity中通过调用startActivity来启动一个新的activity
由于launcher也是一个程序,所以当我们点击应用图标的时候系统会调用startActivitySately()。(具体在第二篇作答)

8:Activity和fragment绑定后流程

fragment存在被activity动态加载和静态加载,静态加载实在xml文件中加载,

Activity 不只有跳转。功能篇(一)的更多相关文章

  1. Android开发之Activity的创建跳转及传值

    在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider).今天所介 ...

  2. 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇

    Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...

  3. (转)Chrome开发者工具不完全指南(一、基础功能篇)

    本篇转载自卖烧烤夫斯基,并做了小部分的修改. 原文地址:Chrome开发者工具不完全指南(一.基础功能篇) 原作者:卖烧烤夫斯基 就算你不是一名前端开发工程师,相信你也不会对Chrome浏览器感到陌生 ...

  4. 定制Eclipse IDE之功能篇(二)

    上文回顾:定制Eclipse IDE之功能篇(一)   这一篇文章将记录一些Eclipse插件小功能,Smart but Useful.   一.设置工作空间 文本文件的编码   解决办法: 在org ...

  5. JQuery Pagination 分页插件 增加了首页尾页以及跳转功能

    JQuery分页插件 挺好用的 但是官方是没有提供首页尾页以及跳转功能 我觉得这个功能可以有,于是就改进了一下 一个js一个css从连接里面下 链接:http://pan.baidu.com/s/1n ...

  6. 实现android activity之间的跳转

    android程序一般不会只有一个activity,会碰到activity之间的跳转.以下是使用Intent做应用程序内部的activity做跳转.比如,应用程序第一个activity是: 点击“下一 ...

  7. 通过javascript库JQuery实现页面跳转功能代码

    通过javascript库JQuery实现页面跳转功能代码的四段代码实例如下. 实例1: 1 2 3 4 $(function(){ var pn = $("#gotopagenum&quo ...

  8. 第35讲 Activity入门和跳转

    第35讲Activity入门和跳转 1.Activity Activity是用户接口程序.在Android当中,Activity提供可视化的用户界面,一个Android应用通常由多个activity组 ...

  9. 杂记之activity之间的跳转

    代码结构图 manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xml ...

随机推荐

  1. 以简御繁介绍IOC

    1.IOC的理论背景 大家开发理念,一直都是奔着架构稳定.低耦合性.而IOC初衷,就是为了解决模块依赖问题,理解<六大设计原则(SOLID)> 如图所示,在我们开发中,业务的实现,就是靠着 ...

  2. RSA非对称加密算法实现:Python

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  3. Eclipse+Maven+JDK+tomcat搭建java的开发环境

    由于最近有几个同事都在学习java方面的东西,所以我写个博文做下笔记,其中遇到过很多个坑,这里就不多说了 首先,我用的是Eclipse+Maven的组合,用Ecplise是周边java开发的同事用这个 ...

  4. Go项目开源规范

    我们为什么一定要知道开源规范呢? 一是,开源项目在代码质量.代码规范.文档等方面,要比非开源项目要求更高,在项目开发中按照开源项目的要求来规范自己的项目,可以更好地驱动项目质量的提高: 二是,一些大公 ...

  5. 龙芯发布.NET 6.0.100开发者试用版

    龙芯在龙芯开源社区发布了LoongArch64-.NET-SDK-6.0.100开发者试用版 新闻 ,龙芯.NET基于上游社区 版本 适配支持龙芯平台架构. 目前支持LoongArch64架构和MIP ...

  6. JMeter_使用正则和JSON提取器参数化(常用于提取token)

    一.使用正则表达式提取器提取token 查看登录响应参数找出token.图中token为 "ticketString": "ccf26b17-a96f-4913-8925 ...

  7. 初识python 之 取101到200之前的所有素数

    素数:只能被1或本身整除 思路分析:这个数只有2个数据能整除 代码如下: n = 0 li = [] for i in range(101,200): m = 0 for j in range(1,2 ...

  8. vue - 指令创建 vue工程

    1.在需要创建工程的文件夹里打开cmd 执行 vue -V 看看版本号是否正常, 创建工程 vue create [工程名称] 如:vue create mytestvue 然后会弹出选择 按方向键, ...

  9. PowerShell 之常用方法

    随笔分类 - 常用 [PowerShell]文件的解压与压缩 摘要:1 New-Item -ItemType File 1.txt -Force #新建文本文件 2 Compress-Archive ...

  10. 从一堆 JAR 文件中,找出一个 Java class 文件的所在配置

    Find a class somewhere inside dozens of JAR files? find path/to/libs -name '*.jar' -exec grep -Hls C ...