Activity基础相关(持续完善)

这里是对Activity一些基础知识的总结,有问题欢迎指正,有遗漏的地方,欢迎补充。
PS:我是现在从事游戏开发,比较喜欢Android,想以后有机会做Android开发!

Activity的生命周期

这里主要是参考了这位同学的博客,然后我本地调试了一下。

 public class OurActivity extends Activity { 
    protected void onCreate(Bundle savedInstanceState); 
    protected void onStart(); 
    protected void onResume(); 
    protected void onPause(); 
    protected void onStop(); 
    protected void onDestroy(); 
 }
  1. onCreate(Bundle savedInstanceState)Activity处于不可视化,在这个过程中主要是一些数据,视图资源的初始化工作。
  2. onStart()Activity从不可视化到可视化状态的过程,让Activity在后台显示。
  3. onResume()这个方法执行完成以后已经在前台显示,可以进行用户交互。
  4. onPause()Activity正在停止,一般会紧接着onStop()。
  5. onStop()Activity即将停止。
  6. onDestroy()Activity从即将被销毁,可以在这里做一些回收工作和最终资源释放。
  • 当Activity切换到桌面再回到Activity:onPause()onStop()onRestart()onStart()onResume()
    当Aty1切换到Aty2过程:onPause_1()→onCreate_2()→onStart_2()→onResume_2()→onStop_1(),这个过程需要注意的就是onPause_1()中不能做耗时操作
    当手机横竖屏切换的时候:
    onPause()→onStop()→onDestroy()→onCreate()→onStart()→onResume()**

销毁:当系统配置发生改变后,Activity会被销毁,其onPause,onStop,onDestroy方法都会调用,由于是异常状态下终止,所以会调用onSaveInstanceState方法来保存当前Activity的状态(视图结构、输入的数据、ListView滚动的位置等);这个方法的调用时机是在onStop之前,可能在onPause之前或之后。

恢复:重新创建时会调用onRestoreInstanceState,把刚刚onSaveInstanceState方法所保存的Bundle对象传递给onRestoreInstanceState和onCreate方法。onRestoreInstance发生在onStart之后。

Activity的加载模式

首先在看加载模式之前,我们需要先了解一下Task和Back Stack。关于这一块的详细讲解请看这位同学的博客,已经分析的相当透彻!

  1. Task基本工作原理介绍:Task是我们在完成某项工作时所交互的Activity的集合。这些Activity按照打开的顺序被放置在同一个栈中,这个栈被称为Back Stack。当我们点击桌面上的launcher图标时,对应的Task会被置换到前台。如果这个应用不存在Task,就会创建一个新的Task,此时应用的MainActivity就会被创建,压入Back Stack中。当从当前Activity启动到一个新的Activity的时候,新的Activity会被压入栈中,之前的Activity会处于停止状态。当我们按返回键时,新的Activity会被出栈并销毁,之前的Activity会恢复状态。当我们按返回键回到桌面,此时所有的Activity已经出栈,然后Task被销毁。
  2. 保存Activity的状态:当Activity停止(Stoped)时,系统会默认保存其状态。当我们通过back键返回到这个Activity的时候就会恢复到离开时的界面。当然,也会存在多个Task同时存在的情况,内存紧张时可能会销毁后台的Activity,回收内存。在这种情况下,系统仍然会知道Activity在Task中的位置,当通过back键回到这个Activity时,系统会重新创建一个Activity,而不是之前那种Resume。因此,为了不丢失Activity的内容,可以通过实现onSaveInstanceState()方法主动保存数据,但是值得一提的是onSaveInstanceState()在我们一直按back键退出的时候,是不会调用的,因此一些永久性的数据需要用onPause()方法保存。

加载模式:

  1. 设置一个launchMode,两种方法:
  • 可以直接在AndroidManifest.xml 标签的一个属性中设置launchMode,如下:
  
  • 通过叫做 Intent addFlags方法设置更多的行为,比如:
  Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  startActivity(intent);
  1. Activity的四种启动模式:
  • standard:Activity的默认启动方式。启动的Activity都会压进上面所说的Back Stack中。这种方式启动Activity每次都会创建一个新的Activity实例。

  • singleTop:对应的Flags为FLAG_ACTIVITY_SINGLE_TOP。启动Activity之前,都会先判断Back Stack顶部的Activity是不是要启动的Activity。如果不是,则新创建一个新的Activity。如果是,则直接引用,但是会在Activity启动的时候调用onNewIntent()方法。此时这个Activity生命周期方法为onNewIntent()→onRestart()→onStart()→onResume(),因此如果遇到这种情况,我们应该在onNewIntent()做对应的数据处理方法。但是,需要注意的是系统随时可能杀死后台运行的Activity,如果对应的Activity被杀死了,那么系统就不会调用上面说的onNewIntent(),而是调用onCreate()方法。所以为了保险起见最好在onCreate()中也要有相同逻辑的初始化方法。

  • singleTask:对应的Flags为FLAG_ACTIVITY_NEW_TASK。如果当前要启动的Activity已经存在于Back Stack中(之前已经创建了一个对应的Activity的实例),会直接使用已经存在的Activity,并且把它上面的活动都给弹出。如果没有则创建一个新的活动实例。

  • singleInstance:声明为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在这一个Activity。除非这个任务栈被销毁了,否则后续的请求均不会创建新的实例。每个Activity都有一个自己的任务栈,除了singleInstance,剩下的启动模式下,Activity都是被保存在了自己App的任务栈里

你可能感兴趣的:(Activity基础相关(持续完善))