Activity的生命周期(进阶第二天)

上面介绍了android的四大组件,下面将Activity的生命周期和启动模式来个全面的分析。

这是在任玉刚大神书下的总结,让我也有重新的认识。希望这篇对大家都有所帮助。

Activity的生命周期的话 分为正常情况下生命周期和异常情况下生命周期。正常情况下的生命周期指的用户点击进入一个界面时Activity所经历的生命周期;异常情况下的生命周期指的是Activity被系统回收或者由于当前的设备屏幕进行切换了。可以先看下Activity生命周期的流程图,我再详细说下下面的方法会在哪里走。

Activity生命周期的切换过程

正常情况下的Activity会经历以下的生命周期: 

1. OnCreate 表示 Activity正在创建,这也是生命周期的第一个方法也是必走的方法,在这里我们可以做一些初始化的工作,比如加载这个Activity 的布局呀,还有初始化一些所需的数据等。

2.OnRestart  看上面的流程图 可以会有一些凝问,也有一些码帅,或码漂(妹子)已经发现了。别急这里我再来介绍下这个方法。首先这个方法字面意思,重启的意思,没错这指的就是Activity正在重启启动,当目前的Activity在用户的眼睛里不可见变成可见的时候,这个方法就会被调用。这种情况一般是用户按Home返回了也或者进入另一个Activity(这里并没有将这个Activity给finish掉),这时的Activity就会不可见了(OnPause—>Onstop),接着用户又返回到这个Activity,就会出现这种情况了。

3.OnStart 表示Activity正在启动,这时的Activity已经在后台是可见的,但是没有出现在前台,无法与用户进行交互。

4.OnResume 表示Activity已经可见,并处于前台显示,可以进行与用户进行交互。

5.OnPause 表示Activity正在停止,正常情况下,紧接着 OnStop就会被调用,在特殊情况下,如果这个时候用户迅速的返回,那么会再调用OnResume,一般很难重现。此时可以进行停止动画,但是注意不要进行过大的耗时操作,因为这会影响到Activity的显示。OnPause必须先执行完,新的Activity才会进行。

6.OnStop 表示Activity即将停止,可以做一些回收工作,但同样不能太耗时。

7 OnDestory 表示Activity即将被销毁。这也是最后一个生命周期,在这里我们可以进行一些资源释放。

下面我举的具体说明大家也可以两个Acitivity 打印下生命周期 自己观察下。

(1)当我们点击按钮打开一个界面时 Activity的生命周期:OnCreate—>OnStart—>OnResume;

(2) 当用户点击back时 Activity的生命周期: OnPause—>OnStop—>OnDestory;

(3) 当用户从aActivity 跳转到bActivity时  A生命周期: OnPause—>OnStop;B生命周期  OnCreate—>OnStart—>OnResume;我们如果从bActivity返回到aActivity A的生命周期:OnRestart—>OnStart—>OnResume;B的生命周期 OnPause—>OnStop—>OnDestory;

(4)当用户用Home回到主界面 Activity的生命周期:OnPause—>OnStop 这里有个特殊情况就是 一旦我们采用的是透明主题

Activity透明主题

Activity的生命周期不会再调OnStop;

(5) 当Activity被系统回收再次打开,生命周期的回调过程和(1)一样。切记就是生命周期一样。

我们可以这样记Activity的生命周期  我们可以采用相规则 OnCreate—OnDestory, onRestart—onStop,onResume—onPasue  如果返回到A 那么多一个方法 OnRestart; 

关于大神书下的Aactivity打开Bactivity 是先走a的onPasue  还是b的onResume。

我自己写了一个Demo 从生命周期的运行结果来看 是先走的a下的onPasue,然后才是b的onResume。具体是怎么进行,大家可以去源码里面看看。 正常情况下的生命周期到这里也就结束了。

下面的是异常情况下的生命周期,所谓异常就是没有按照正常流程走,在中途出现Activity被杀死而重现创建。资源文件发生改变或者内存不足导致Activity被杀死。

1.资源相关的系统配置发生改变导致Activity被杀死重新创建。

我这里举个列子 我们在mipmap目录下 放一张图片,然后通过Resources去获取这张图片,同时为了兼容不同的设备我们还需要在其他的一些目录下放置不同的图片,比如mipmap-xhdpi,mipmap-xxhdpi等,当程序启动时,系统会根据当前设备的情况去加载合适的Resources资源,比如说横屏手机和竖屏手机就会拿到两张不同的图片,当前我们的Activity目前是处于竖屏状态,如果屏幕突然旋转了,由于系统配置发生了改变,在默认情况下 我们的Activity会被销毁并且重新创建,当然我们也可以阻止系统重新创建Activity。当系统配置发生了改变,Activity 就会被销毁,onPause,onStop,onDestory均会被调用,但是由于Activity是异常停止,系统会调用onSaveIntanceState来保存当前的 Activity状态,这个方法可以在onPause之前也或之后,但是不能再onStop之后调用,因为那时无法保存状态 也不能进行大量的耗时操作。当Activity被重新创建,系统则会调用onRestoreIntancestate,然后onSaveIntancestate保存的Bundle对象就可以传递给onRestoreintancestate和onCreat方法,这时我们可以取出之前保存的数据并恢复的话,说明Activity被创建了。我们下面来写个旋转屏幕的例子来验证系统会自己做数据存储和恢复。                   

 public class OnSaveintanceActivityextends AppCompatActivity {

@Override

        protected void onCreate(@Nullable Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

    //    因为第一次进来就走这个onCreate 所以再次判断savedInstanceState不能为空

            if (savedInstanceState!=null){

                String test=savedInstanceState.getString("test");

                Log.d(">>onCreateTest",test);

            }

}

@Override

        protected void onSaveInstanceState(Bundle outState) {

            super.onSaveInstanceState(outState);

    //        这里我们将数据返回给 onRestoreInstanceState和onCreate;

            outState.putString("test","测试");

        }

@Override

        protected void onRestoreInstanceState(Bundle savedInstanceState) {

           String test=savedInstanceState.getString("test");

            Log.d(">>onRestoreTest",test);

        }

@Override

        protected void onPause() {

          super.onPause();

           Log.d(">>onPause","onPause");

        }

@Override

        protected void onStop() {

          super.onStop();

           Log.d(">>onStop","onStop");

        }

@Override

        protected void onDestroy() {

          super.onDestroy();

           Log.d(">>onDestroy","onDestroy");

        }

}

旋转时候的生命周期

通过这个例子我们能清楚的知道 Activity被销毁了以后调用onSaveIntanceState来保存数据,重新创建以后在onCreate和onRestoreIntanceState中都能正确的得到我们保存的数据。刚刚我还想这样来保存数据 减轻数据请求,但是我又做了一个测试,这种情况只会发生在异常情况下,也就是说Activity是异常停止。正常情况下,我们不会触发这个过程。

2.资源内存不足导致优先级的Activity被杀死。

Activity按照优先级的顺序从高到低,可以分为以下三种,

(1)前台Activity 正在和用户交互的Activity 优先级是最高的

(2)可见但非在前台显示的Activity——比如Activity中弹出窗体,导致Activity是可见 但是无法和用户直接进行交互

(3)后台的Activity——已经被暂停的Activity,这样的优先级是最低。可以理解为不可见 无法与用户交互  优先级最低。

当系统内存不足时,系统就会按照上述优先级杀死目标Activity所在的进程,并在后续通过onSaveIntanceState和onRestoreIntanceState来存储数据和恢复数据,如果一个进程中没有四大组件执行,那么这个进程将很快被系统杀死,因此一些后台工作,不适合脱离四大组件而单独运行,不然很容易被杀死,比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会容易地被系统杀死。我们知道当系统配置发生改变后,Activity会被重新创建,有什么好的办法不让他重新创建呢。我们不想系统重新创建Activity可以给Activity指定configChanges属性,比如不想让屏幕旋转我们可以加个让他一直竖屏或横屏,android:configChanges="orientation“。

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

推荐阅读更多精彩内容

  • 您的应用中的Activity应该做到如下需求: 1.用户在使用应用时接听来电或切换到另一个应用,它不会崩溃。 2....
    正阳Android阅读 532评论 1 0
  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    安卓Boy阅读 1,775评论 3 5
  • 本文出自 “阿敏其人” 简书博客,转载或引用请注明出处。 一、前言 Activity,安卓四大组件之一。 每个 A...
    阿敏其人阅读 9,101评论 8 88
  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    mouekz阅读 648评论 0 0
  • 今日去花市,走走停停看到很多不同种类的花。可是走着走着却想起来了姥姥。姥姥在世的时候最喜欢花了。我小时候还从她家搬...
    树皮酱阅读 183评论 0 0