美文网首页
Android开发艺术探索笔记——第一章:Activity的生命

Android开发艺术探索笔记——第一章:Activity的生命

作者: MS_CAOXU | 来源:发表于2019-01-23 21:00 被阅读0次

17的时候为了学习买了这本书,之前看过一遍。但是记忆不是很牢固。最近又重新看了一遍,把自己的笔记发出来,以后在想看的时候也能直接看看。也希望能给别人一些帮助

1.1 Activity生命周期全面分析

Android的生命周期主要分两部分 一种是正常情况下的生命周期,我们也比较熟悉这一部分,另一部分是异常情况下,主要是Activity被系统回收或者由于当前设备的Configuration改变导致Activity被销毁重建。

1.1.1典型情况下的生命周期分析

正常情况下Activity 会经历如下生命周期

  • onCreate:表示Activity正在创建,也是生命周期的第一个方法,一般在这个方法中 做一些初始化的工作。

  • onRestart:表示Activity正在重新启动,一般当前Activity由不可见变为可见时,系统就会调用onRestart方法比如用户从桌面再次进入到当前页面。

  • onStart:表示Activity正在被启动,这时Activity已经可见了,但是没有出现在前台,无法和用户交互。

  • onResume:表示Activity已经可以看见了,出现在前台并开始活动。 (onStart和onResume都表示Activity已经可见了但是onStart的时候Activity还在后台,onResume时才显示到前台)。

  • onPause:表示Activity正在停止,我们可以在这个方法中做一些轻量的回收操作,比如存储一些数据,停止动画等操作,但是不能太耗时,否则会影响新的Activity的显示

  • onStop:表示Activity 即将停止,我们可以做一些稍微重量的回收工作,但时同样不能太耗时。

  • onDestrory:表示Activity即将被销毁。这时activity生命周期的最后一个回调,我们在这里可以做一些回收工作和资源的释放。

Activity各种生命周期的切换过程。

  • Activity 第一次启动时,回调如下: onCreate→onStart→onResume,
02-11 18:44:00.186 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onCreate
02-11 18:44:00.196 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStart
02-11 18:44:00.196 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onResume
  • 当用户打开新的Activity,或者切换到桌面时 回调如下 onPause →onStop ,\color{HotPink}{注意:如果新的Activity如果采用了透明主题,那么当前Activtity 不会回调onStop}
02-11 18:45:23.226 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onPause
02-11 18:45:23.756 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStop
  • 当用户再次回到原 Activity时,回调如下 onRestart →onStart→ onResume
02-11 18:45:55.516 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onRestart
02-11 18:45:55.516 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStart
02-11 18:45:55.516 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onResume
  • 当用户按bask键回退时,回调如下:onPause→onStop→onDestroy
02-11 18:46:57.086 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onPause
02-11 18:46:57.476 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStop
02-11 18:46:57.476 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onDestroy
  • 在TestActivity1中打开TestActivity2回调如下 TestActivity1 的onPause →B的onCreate →onStart→onResume →TestActivity1的onStop
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onPause
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onCreate
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onStart
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onResume
02-11 18:48:03.636 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStop
  • 在TestActivity2中返回TestActivity1回调如下 TestActivity2的onPause →TestActivity1的onRestart→onStart→onResume →TestActivity1的onStop →onDestroy
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onPause
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onRestart
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStart
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onResume
02-11 18:48:15.966 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onStop
02-11 18:48:15.966 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onDestroy

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

情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
  • 销毁:
    例屏幕旋转时,系统会调用onSeveInstanceState来保存状态,该方法调用顺序是onStop之前 可能在onPause之前调用 也可能是在此方法之后调用。

onSeveInstanceState方法只会在Activity异常情况下调用,手动关闭此Activity并不会调用。

-创建:
Activity重新创建时系统会调用onRestoreInstanceState,并把销毁时onSeveInstanceState保存的Bundle作为参数传递给onRestoreInstanceState和onCreate。我们可以在onRestoreInstanceState和onCreate判断Activity是否被重新创建,并且赋值。onRestoreInstanceState的调用时机是onStart之后

onRestoreInstanceState被调用Bundle一定是有值的,但onCreate如果是正常启动的话其Bundle参数是null,所以我们要加额外判断,所以官方文档的建议是采用onRestorteInstanceState来恢复数据。

  • 配置发生改变时Activity如何不被重新创建

当系统配置改变时,Activity会被重新创建,如何不被重新创建呢?我们可以给Activity指定configChanges属性,如屏幕旋转时我们使用
android:configChanges="orientation|screenSize"
此时Activity不会被重新创建了,而会调用onConfigurationChanged方法

情况2:资源内存不足导致优先级低的Activity被杀死

其数据存储和恢复的过程和情况1一致

  • Activity优先级排序
    1.前台Activity----正在和用户交互的Activity,其优先权最高
    2.可见但非前台Activity---比如Activity中弹出对话框,导致其可见但无法交互。
    3.后台Activity---已经被暂停的Activity,如执行了onStop方法。其优先级最低

1.2Activity启动模式

任务栈是一种后进先出的栈结构

Activity的启动模式
  • standard:标准模式,系统和默认的启动模式。每次启动Activity都会创建一个新的实例。

standard模式下 谁启动了Activity ,Activity就用运行在他所在的栈中,所以ApplicationContext去启动standard的activity会报错。因为Android 的Context没有任务栈,

  • singleTop:栈顶复用模式。如果处于栈顶不会被创建,并调用onNewIntent(intent)

  • singleTask:栈内复用模式。这是一种单例模式。只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。

  • singleInstance:单例模式,是一种加强版的singleTask,此模式的Activity 会单独位于一个任务栈中。

Activity的Flags
  • FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式。
  • FLAG_ACTIVITY_NEW_TASK :对应singleTask模式。

1.3 IntentFilter的匹配规则

  • action 匹配规则
    Intent 中的action必须和过滤规则中的action匹配,字符串的值完全一样
    注:Intent中必须有且匹配成功
  • category
    Intent中的category必须和某个category相同,但是可以不传值,因为startActivity和staryActivityForResult时会默认为Intent加上< category android:name="android.intent.category.DEAFAULT" />

相关文章

网友评论

      本文标题:Android开发艺术探索笔记——第一章:Activity的生命

      本文链接:https://www.haomeiwen.com/subject/vhejjqtx.html