Android编程——AMS启动流程归纳总结

AMS的主要功能

  • 统一调度Activity
  • 进程管理
  • 内存管理

AMS中相关的一些配置变量

static final int KEY_DISPATCHING_TIMEOUT = 5*1000;//按键无响应的超时时间,这是google的标准,国内的联想手机大部分按照这个标准设计,华为手机不是按照这个标准

static final int MAX_RECENT_TASKS = 20;//AMS记录的activity的最大数量,超过20则会舍弃最早记录的Activity

static final int BROADCAST_TIMEOUT=10*1000;//广播超时时间

final ArrayList<PendingActivityLaunch> mPendingActivityLaunches = new ArrayList<PendingActivityLaunch>();//暂时保存客户端请求

static final int PAUSE_TIMEOUT=500;//AmS通知应用进程暂停指定的Activity,AmS的忍耐是有限的,只有500毫秒。如果应用进程在该常量时间内还同有停止,AmS就是强制暂停关闭该Activity。这就是为什么应用程序设计时,不能在onPause()不能做过多事情的原因。

实验1:在onPause中做Thread.sleep(5000)处理,按Home退出正常,5S后出现onPause日志,如果5S之内再次打开Activity会出现黑屏现象,得出结论不建议在onPause中做耗时处理。

实验2:在onPause中做异步处理耗时操作如保存数据,BACK键直接销毁Activity异步操作也随之销毁,HOME键异步会执行,得出结论不建议在onPause中做数据保存等操作处理。

Activity的启动模式

Stardard:普通模式,每次启动都会创建Activity实例,放入栈顶中

SingleTop:如果栈顶存在当前实例则不需要创建,否则创建实例并且放入栈顶,如当前栈为ABCD启动B后栈顺序为ABCDB

SingleTask:如果栈中存在当前实例则不需要创建,否则创建实例,如当前栈为ABCD启动B后栈顺序为AB

SingleInstance:在一个新栈中创建实例,并让多个应用恭喜该栈中的Activity实例,任何应用激活Activity时都会调用该实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。该模式下,不会再有新的Acitvity实例压入到栈里面,其它地方和’singleTask’一样。这意味着,栈中只有唯一的一个Activity实例。这是一个非常特殊的模式,这只能用在只有唯一的一个Activity的程序中。

Activity的各个生命周期

《Android编程——AMS启动流程归纳总结》

启动MainActivity

01-01 08:21:09.657 7273-7273/cn.sample.dagger D/===MainActivity: onCreate
01-01 08:21:09.753 7273-7273/cn.sample.dagger D/===MainActivity: onStart
01-01 08:21:09.753 7273-7273/cn.sample.dagger D/===MainActivity: onPostCreate
01-01 08:21:09.754 7273-7273/cn.sample.dagger D/===MainActivity: onResume
01-01 08:21:09.757 7273-7273/cn.sample.dagger D/===MainActivity: onPostResume

 从MainActivity启动SecondActivity

01-01 08:21:56.872 7273-7273/cn.sample.dagger D/===MainActivity: onPause
01-01 08:21:56.947 7273-7273/cn.sample.dagger D/===SecondActivity: onCreate
01-01 08:21:56.980 7273-7273/cn.sample.dagger D/===SecondActivity: onStart
01-01 08:21:56.981 7273-7273/cn.sample.dagger D/===SecondActivity: onPostCreate
01-01 08:21:56.982 7273-7273/cn.sample.dagger D/===SecondActivity: onResume
01-01 08:21:56.982 7273-7273/cn.sample.dagger D/===SecondActivity: onPostResume
01-01 08:21:57.210 7273-7273/cn.sample.dagger D/===MainActivity: onCreateDescription
01-01 08:21:57.213 7273-7273/cn.sample.dagger D/===MainActivity: onSaveInstanceState
01-01 08:21:57.213 7273-7273/cn.sample.dagger D/===MainActivity: onStop

SecondActivity界面按返回键

01-01 08:24:43.672 7273-7273/cn.sample.dagger D/===SecondActivity: onPause
01-01 08:24:43.722 7273-7273/cn.sample.dagger D/===MainActivity: onRestart
01-01 08:24:43.723 7273-7273/cn.sample.dagger D/===MainActivity: onStart
01-01 08:24:43.724 7273-7273/cn.sample.dagger D/===MainActivity: onResume
01-01 08:24:43.724 7273-7273/cn.sample.dagger D/===MainActivity: onPostResume
01-01 08:24:43.856 7273-7273/cn.sample.dagger D/===SecondActivity: onStop
01-01 08:24:43.857 7273-7273/cn.sample.dagger D/===SecondActivity: onDestroy


启动一个Activity的完整流程

《Android编程——AMS启动流程归纳总结》

《Android编程——AMS启动流程归纳总结》

    原文作者:Aqinh
    原文地址: https://blog.csdn.net/wuhuiyi10/article/details/79580993
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞