关于Activity的一点愚见

原创 2016年08月29日 14:02:08

这一段时,准备研究一下四大组件中Activity的启动过程。在此之前,让我自己总结一下Activity里面一些基础的知识点。

Activity 的生命周期

Activitty有七大生命周期,也是有七个函数标识着这个七个生命周期。下面就用最常见的图来显示整个路程:
Activity生命周期

从上图可以清晰的知道:
Activity的七大生命周期分别为:

1.onCreate():这个方法是指Activity被创建,在这个方法中将会做一些初始化工作,如setContentView去加载一些资源文件,需要打开Service的时候,也可以在这里startService()等等。

2.onStart():表示这个Activity正在被启动,即将开始。这个时候Activity已经是可见,但是没有出现在前台,不能与用户交互。

3.onResume():表示Activity已经可见了,并且在前台运行,可以和用户交互了。这里要注意onStart()的时候Activity还在后台运行这个时候可见不可交互,onResume()的时候,Activity在前台运行了。

4.onPause():表示Activity正在停止。接下来分两种情况,要么立即调用onStop()方法,要么立即调用onResume去恢复在Activity栈中前一个Activity。这个时候,可以释放掉一些消耗CPU资源,停止动画,以及保存数据。记住一定要时间短,快。不然会影响新的新的Activity的显示。

5.onStop():表示Activity即将停止。此时Activity不可见。和onPause的区别在于,如果启动的新活动活动是对话框,那么onPause调用,onStop不调用。可以做些稍微重量级一点的回收工作。

6.onRestart():表示从Activity不可见到可见的时候,被调用。一般来说,这个行为是用户造成的,比如说用户按Home键去到桌面,或者切换到新的Activity。

7.onDestroy():表示Activity即将被销毁,这是Activity最后一个生命周期,用来做回收工作和最终资源的释放。

调用情况说明:
(1)第一次启动Activity的时候,过程:onCreate->onStart->onResume;
(2)打开一个新的Activity或者切换到桌面:onPause->onStop,如果Activity是透明主题则不会调用onStop;
(3)回到原来Activity:onRestart->onStart->onResume;
(4)按Back键回退:onPause->onStop->onDestroy;
(5)Activity被系统回收后再次打开和回调过程(1)一样。

异常情况下的生命周期的分析

第一种情况:资源相关的系统配置发生改变导致Activity杀死并重新创建
比如,转屏的时候,会出现Activity被销毁并且被重建的情况。
Activity意外重建
上图清晰的表明了Activity出现意外情况导致Activity销毁重建,会调用onSaveInstanceSate函数将数据存储(也是会返回一个Parcelable类型,便于进程间通讯),将数据传递给重建好的新Activity。
onSaveInstanceState的调用时逐级保存调用,首先通知window,再通知顶级的view一般为DectorView,接着通知ziview去保存数据。

第二种情况:资源内存不足时导致低优先级的Activity被杀死
Activity优先级从高到低排列:
(1)前台Activity:正在和用户交互的Activity
(2)可见但非前台Activity:比如说弹出一个对话框,导致Activty可见但是属于后台
(3)后台Activity:已经被暂停的Activity,比如执行了onStop()

当资源内存不足时,就会按照优先级从低到高的杀死Activity所在的进程,并且通过onSaveInstanceState和RestoreInstanceState存储与恢复数据。
当一个进程不在四大组件中运行时,这个进程很快被杀死。比较好的方法是将后台工作丢到Service中完成,这样就不会轻易被系统杀死。

当我们我不想转屏是重新建立Activity,我们必须配置android:configChanges=”orientation”
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

但是到了API13之后这个方案就不会成功,我们需要这么改:
android:configChanges=”orientation|screenSize“
这样子就能阻止Activity在转屏时候的重建。

Activity的启动模式(LaunchMode)

Activity的启动模式有四种:standard,singleTop,singleTask,singleInstance

1.standard:就是标准模式,我们默认的就是这个模式。每启动一个新的Activity都会将前一个处于栈顶的Activity压入栈中,让新的Activity置于栈顶。
注意:当我们尝试着用ApplicationContext去启动standard模式的时候,会出现错误,原因是没有创建Activity的栈。

2.singleTop,栈顶复用。在这种模式下,只要栈顶存在了将要创建的Activity,则直接复用原来的Actvity,否则就创建一个新的Activity。
举个例子:任务栈内有四个活动,从栈底到栈顶依次为:ABCD。加入要创建一个新的活动D,就会复用栈顶的D,此时Activiy栈:ABCD。如果D的模式为standard,则栈内为ABCDD。

3.singleTask,栈内复用。这是一种单实例模式。在这种模式下,只要栈中存在要创建Activity都不回重新创建,而是直接使用。
举个例子:
1)任务栈S1为ABC,这时候singleTask的D请求启动,需要任务栈为S2。此时S2和D都不存在,则创建S2和D,将D压入S2中。
2)当D所需的任务栈为S1,此时任务栈存在,则创建,压入栈顶。
3)当原本存在了了ADBC,此时要创建D,则头顶上的活动将出栈,此时任务栈为AD。

4.singleInstance 单实例模式。是singleTask的加强版。具有这种属性的活动启动时会先创建一个新的栈再压入栈顶。

Activity其他零散的知识点

Activity的Flags:
通过方法addFlags添加
1.FLAG_ACTIVITY_NEW_TASK :意思是将活动指定为singleTask
2.FLAG_ACTIVITY_SINGLETOP:活动指定为singleTop
3.FLAG_ACTIVITY_CLEAR_TOP:一般适合singleTask一起使用,作用是具有这种属性的活动将会把位于他之上的活动全部出栈,并位于栈顶。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS :具有标记的Activity不会出现在历史Activity的列表中,当我们不希望用户通过历史列表回到我们的Activity中这个标记比较有用。

Activity的interfilter匹配规则:
需要同时匹配其中的action,category,data,才会匹配成功。

Activity的action的匹配规则:
要求Intent中的action存在且必须和过滤规则中的一个action相同。

Activity的category的匹配规则:
要求所有的category都必须和过滤规则中的一个category相同。

Activity的data匹配规则:
要求Intent中必须含有data且data能够和过滤规则中的一个data相同。

感谢郭霖大神的第一行代码和任玉刚大神的android开发探索艺术。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于activity启动流程的一点愚见

前言Activity在android开发中作为显示的组件,它在整个Acndroid开发中占有着重要的地位。已经开发了Android一段时间的我对Activity七大生命周期以及如何启动产生了兴趣。然而...

关于Window创建流程的一点愚见(Activity启动过程中)

在介绍Window在Activity启动中的创建流程时,我先简单的说明一下Activity的启动流程,Activity的启动是通过函数startActivity(Intent intent)启动的。如...

关于RemoteView的一点愚见(实现桌面小部件)

RemoteView中的应用除了有通知栏的自定义,当还有桌面小部件也是通过RemoteView来完成的。

关于Notification的一点愚见(PendingIntent工作流程)

PendingIntent,顾名思义,延迟的Intent。那么肯定会产生一个疑问,那就是PendingIntent究竟和Intent的区别在哪里呢? 其实PendingIntent其实就是对Inte...

关于Handler消息机制一点愚见与总结

Handler消息机制在android刷新UI中是经常使用到的一个工具,但是Handler并不是专门用于刷新UI,是为了让任务能够轻易的切换到Handler中操作。出现的缘由,主要是因为android...

关于Notification通知的一点愚见(自定义通知栏)

今天在复习Notification通知栏的时候,好奇翻了一下源码,终于弄懂了PendingIntent在Notification中的机制以及工作流程,这对我研究Activity的启动流程有了一定的帮助...

关于AsyncTask的一点愚见

在Android开发中,为了避免出现ANR现象,主要是指来自于接触事件响应事件过长来说,我们开发者通常会将耗时长的操作,如网络操作,大图片加载,IO操作等等会放在子线程中去处理。而Android中线程...

关于Window和WindowManager的一点愚见(添加,删除,更新)

正文先看看自己要编写一个WindowManager该如何实现。 先看看MainActivity.java @Override protected void onCreate(Bundl...

关于滚动图片停在浏览器边界上的一点解决办法(个人愚见)。。

最近开始学习javascript,想写个滚动图片的脚本来试试。   想想这种脚本的模板网上应该有许多,果断百度之,果然一堆,然后复制了一个代码下来试试,大概如下(向上滚动): var speed=3...

关于IPC的一点愚见

IPC是Inter-Process-Communication的简写,就是指进程间通讯。Linux的进程间通讯,不必多说,就是指管道,信号和跟踪,信号量,套字节,共享内存等。在这里主要讨论的是Andr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)