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 <activity>标签的一个属性中设置launchMode,如下:
  <activity
  android:name=".SingleTaskActivity"
  android:label="singleTask launchMode"
  android:launchMode="singleTask">
  • 通过叫做 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的任务栈里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容