Activity

来源:互联网 发布:日本 衰落 知乎 编辑:程序博客网 时间:2024/06/05 11:13
  • 1.activity生命周期

这里写图片描述

  1. onCreate()状态,activity加载与用户交互的接口 setContentView();

  2. onStart()状态,activity做用户可见之间的最后准备工作,调用onStart()方法后activity对用户可见

  3. onResume()状态,调onResume()后activity在backStack的top,对用户可见且获得焦点(在onResume()中初
    始化在onPause()方法中释放掉的资源等)

  4. onPause(),activity仍然对用户可见,但失去焦点(不是在backStack的top上)时系统调用onPause()方法;(在onPause()释放一些程序暂时不用的系统资源或者消耗电量的资源(动画,摄像头,广播接收器等)onPause()方法执行时间非常短,不可以做储存数据等耗时操作

  5. onStop(),activity对用户完全不可见时系统会调用onStop()方法,(在onStop()方法中释放掉所有占用内存的资源,可以在主线程进行耗时操作如储存数据等)(在android7.0之前onStop()方法在activity不可见后5秒系统回调,因此视频的停止应该在onPause()方法中。在Android7.0之后activity不可见的同时系统调用onStop()方法,所以在onStop()方法中停止视频的播放

  6. onRestart(),当activity处于onStop状态,用户重新回到该activity时,调用onRestart()方法后调onStart()

  7. OnDestory(),activity的最后状态(在onDestory()方法中所有还没有被释放的资源),当手机旋转(横屏或竖屏)时,系统会调用onDestory()方法再调用onCreate()方法重新创建进程(和所有在之前已经创建的组件)

  • 2.当内存空间不足时,系统杀死进程的优先顺序
background(不可见)处于destory状态的进程 >>> background(不可见)处于stop状态的进程 >>> background(可见失去焦点)处于Pause状态 >>> foreground的处于(Create/start/resume状态)的进程
  • 3.activity 被系统自动销毁重建时保存和取读activity状态
**1.取读activity状态信息**//在onCreate()方法中@Overrideprotected 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在未得到同意时被系统销毁时才调用@Overridepublic 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(即处在后台且没有组件是活跃状态的)
1 0
原创粉丝点击