onCreate()状态,activity加载与用户交互的接口 setContentView();
onStart()状态,activity做用户可见之间的最后准备工作,调用onStart()方法后activity对用户可见
onResume()状态,调onResume()后activity在backStack的top,对用户可见且获得焦点(在onResume()中初 始化在onPause()方法中释放掉的资源等)
onPause(),activity仍然对用户可见,但失去焦点(不是在backStack的top上)时系统调用onPause()方法;(在onPause()释放一些程序暂时不用的系统资源或者消耗电量的资源(动画,摄像头,广播接收器等)onPause()方法执行时间非常短,不可以做储存数据等耗时操作
onStop(),activity对用户完全不可见时系统会调用onStop()方法,(在onStop()方法中释放掉所有占用内存的资源,可以在主线程进行耗时操作如储存数据等)(在android7.0之前onStop()方法在activity不可见后5秒系统回调,因此视频的停止应该在onPause()方法中。在Android7.0之后activity不可见的同时系统调用onStop()方法,所以在onStop()方法中停止视频的播放
onRestart(),当activity处于onStop状态,用户重新回到该activity时,调用onRestart()方法后调onStart()
OnDestory(),activity的最后状态(在onDestory()方法中所有还没有被释放的资源),当手机旋转(横屏或竖屏)时,系统会调用onDestory()方法再调用onCreate()方法重新创建进程(和所有在之前已经创建的组件)
2.当内存空间不足时,系统杀死进程的优先顺序 background(不可见)处于destory状态的进程 >>> background(不可见)处于stop状态的进程 >>> background(可见失去焦点)处于Pause状态 >>> foreground的处于(Create/start/resume状态)的进程 3.activity 被系统自动销毁重建时保存和取读activity状态 **1.取读activity状态信息** //在onCreate()方法中 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 首先调用父函数 // 判断之前的activity的实例有没有保存状态信息 if (savedInstanceState != null) { // 从保存的状态中提取信息值 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // Probably initialize members with default values for a new instance } ... } //如之前的activity实例被系统自动销毁(如横屏,或系统内存不足时)且在销毁前onSaveInstanceState()保存了状态信息,则再次创建实例的时候会调函数onCreate()->onStart()- // >onRestoreInstanceState()->onResume(); //只有当上一下销毁的activity实例在onSaveInstanceState()方法中保存了状态信息时,才会调用该方法 public void onRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState(savedInstanceState); // 读取保存的状态(这里的savedInstanceState和onCreate()里的是同一个对象) mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } **2.保存activity状态信息** //在onPause()之后,onStop()之前调用该方法,下次创建该activity时可以取读保存的信息 onSaveInstanceState()方法并不是每次都调用,当以下情况时系统会自动调用该方法 1、当用户按下HOME键时。 2、长按HOME键,选择运行其他的程序时。 3、按下电源按键(关闭屏幕显示)时。 4、从activity A中启动一个新的activity时。 5、屏幕方向切换时,例如从竖屏切换到横屏时。 //当用户按back键手动销毁activity时不会调用该方法,只有activity在未得到同意时被系统销毁时才调用 @Override public void onSaveInstanceState(Bundle savedInstanceState) { //保存当前activity实例中参数的信息,(如游戏的等级信息等) savedInstanceState.putInt(STATE_SCORE, mCurrentScore); savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); // 调用父函数来保存视图层级信息(view的位置及属性等) super.onSaveInstanceState(savedInstanceState); } 4.通过重写onBackPressed()方法来控制按后退键的逻辑 默认情况下按back键会销毁当前activity(用户销毁的,系统不会调用onSaveInstanceState方法)onPause()->onStop()->onDestory() 调用了onDestory()方法的activity实例会被从stack上移除 5.activity与process进程之间的关系 当application在Linux平台开启时,系统会给这个application创建一个进程(process)来运行同时分配内存资源给该application,当程序结束运行时,该进程结束系统回收内存资源 1.系统空间不足时,会杀死进程的优先顺序: foreground process <<< visible process <<< service process <<< cached process 同等级的process会根据最后一次运行的时间排序重要性 满足以下至少一个条件的叫做 foreground progcess: a.有一个Activity在前台获得焦点可与用户互动 b.有一个 BroadcastReceiver组件正在运行onReceive()方法 c.有一个Sevice组件正在运行onCreate()/onStart()/onDestory()方法 满足以下至少一个条件的叫做 visible progcess: a.有一个Activity能被用户看见但是失去焦点(处于onPause()状态) b.有一个 Service调用了startForeground()方法 c.绑定了一个Service,系统将该Service作为一个特殊的用户知道的功能使用如自动更换壁纸,输入法服务等。 service process:通过startService()方法开启的没有绑定在activity上的Service的进程,Service长时间运行 (超过30分钟以上)会被降级到cached process cached process:当前不需要使用到的process(即处在后台且没有组件是活跃状态的)