您的位置:首页 > 移动开发 > Android开发

Android Activity生命周期详解

2015-09-07 16:08 405 查看
先介绍各个生命周期主要方法的使用:

onCreate

当Activity被第首次加载时执行。我们新启动一个程序的时候其主窗体的onCreate事件就会被执行。如果Activity被销毁后(onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行。

onStart
是activity用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互

onResume
是activity获得用户焦点,在与用户交互

onPause

用于由一个Activity转到另一个Activity、设备进入休眠状态(屏幕锁住了)、或者有dialog弹出时

onStop

用于不可见的Activity(有对话框弹出时,这时底下的activity仍然可见,所以此时onStop不会被调用)

onRestart
重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。

onStop
事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件

onDestroy
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源!

这是我自己写的demo打印初来各种情况下生命周期的执行顺序

1,首次加载Activity1

onCreate

onStart

onResume

onWindowFocusChanged

2,切换到Acitvity2

Activity1 执行顺序:

onPause

onWindowFocusChanged

onSaveInstanceState

onStop

Activity2执行顺序:

onCreate

onStart

onResume

onWindowFocusChanged

完整的流程是这样的:

Acvity1 ---> onCreate

Acvity1 --->onStart

Acvity1 --->onResume

Acvity1 --->onPause

Activity2--->onCreate

Activity2--->onStart

Activity2--->onResume

Acvity1 --->onStop

如果Activity2属性加入android:theme="@android:style/Theme.Dialog"

则Activity1就不会执行onStop方法

3,Activity2 返回指Activity1

Activity2执行顺序:

onPause

onWindowFocusChanged

onStop

onDestory

Activity1执行顺序:

onRestart

onStart

onResume

onWindowFocusChanged

4,Activity1退到后台

Activity1执行顺序:

onPause

onWindowFocusChanged

onSaveInstanceState

onStop

5,Activity1返回前台

Activity1执行顺序:

onRestart

onStart

onResume

onWindowFocusChanged

6,手机按下电源键息屏

Activity1执行顺序:

onPause

onSaveInstanceState

onStop

onWindowFocusChanged

7,手机按下电源键亮屏

Activity1执行顺序:

onRestart

onStart

onResume

onWindowFocusChanged

下面是两个Activity的源代码

Activity1的代码:

private static final String TAG = "MainActivity";  
	  private Context context = this;  
	    private int param = 1; 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate called.");  

		Button button = (Button)findViewById(R.id.setting_network);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, Activity2.class);
				MainActivity.this.startActivity(intent);
			}
		});
	}

	//Activity创建或者从后台重新回到前台时被调用  
    @Override  
    protected void onStart() {  
        super.onStart();  
        Log.i(TAG, "onStart called.");  
    }  
      
    //Activity从后台重新回到前台时被调用  
    @Override  
    protected void onRestart() {  
        super.onRestart();  
        Log.i(TAG, "onRestart called.");  
    }  
      
    //Activity创建或者从被覆盖、后台重新回到前台时被调用  
    @Override  
    protected void onResume() {  
        super.onResume();  
        Log.i(TAG, "onResume called.");  
    }  
      
    //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后  
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
        super.onWindowFocusChanged(hasFocus); 
        Log.i(TAG, "onWindowFocusChanged called."); 
    }
      
    //Activity被覆盖到下面或者锁屏时被调用  
    @Override  
    protected void onPause() {  
        super.onPause();  
        Log.i(TAG, "onPause called.");  
        //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据  
    }  
      
    //退出当前Activity或者跳转到新Activity时被调用  
    @Override  
    protected void onStop() {  
        super.onStop();  
        Log.i(TAG, "onStop called.");     
    }  
      
    //退出当前Activity时被调用,调用之后Activity就结束了  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        Log.i(TAG, "onDestory called.");  
    }  
      
    /** 
     * Activity被系统杀死时被调用. 
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. 
     * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. 
     * 在onPause之前被调用. 
     */  
    @Override  
    protected void onSaveInstanceState(Bundle outState) {  
        outState.putInt("param", param);  
        Log.i(TAG, "onSaveInstanceState called. put param: " + param);  
        super.onSaveInstanceState(outState);  
    }  
      
    /** 
     * Activity被系统杀死后再重建时被调用. 
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. 
     * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后. 
     */  
    @Override  
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
        param = savedInstanceState.getInt("param");  
        Log.i(TAG, "onRestoreInstanceState called. get param: " + param);  
        super.onRestoreInstanceState(savedInstanceState);  
    }


Activity2的代码:

private static final String TAG = "Activity2";  
	  private Context context = this;  
	    private int param = 1; 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate called.");  

		Button button = (Button)findViewById(R.id.setting_network);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
			}
		});
	}

	//Activity创建或者从后台重新回到前台时被调用  
  @Override  
  protected void onStart() {  
      super.onStart();  
      Log.i(TAG, "onStart called.");  
  }  
    
  //Activity从后台重新回到前台时被调用  
  @Override  
  protected void onRestart() {  
      super.onRestart();  
      Log.i(TAG, "onRestart called.");  
  }  
    
  //Activity创建或者从被覆盖、后台重新回到前台时被调用  
  @Override  
  protected void onResume() {  
      super.onResume();  
      Log.i(TAG, "onResume called.");  
  }  
    
  //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后  
  @Override 
  public void onWindowFocusChanged(boolean hasFocus) { 
      super.onWindowFocusChanged(hasFocus); 
      Log.i(TAG, "onWindowFocusChanged called."); 
  } 
    
  //Activity被覆盖到下面或者锁屏时被调用  
  @Override  
  protected void onPause() {  
      super.onPause();  
      Log.i(TAG, "onPause called.");  
      //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据  
  }  
    
  //退出当前Activity或者跳转到新Activity时被调用  
  @Override  
  protected void onStop() {  
      super.onStop();  
      Log.i(TAG, "onStop called.");     
  }  
    
  //退出当前Activity时被调用,调用之后Activity就结束了  
  @Override  
  protected void onDestroy() {  
      super.onDestroy();  
      Log.i(TAG, "onDestory called.");  
  }  
    
  /** 
   * Activity被系统杀死时被调用. 
   * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. 
   * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. 
   * 在onPause之前被调用. 
   */  
  @Override  
  protected void onSaveInstanceState(Bundle outState) {  
      outState.putInt("param", param);  
      Log.i(TAG, "onSaveInstanceState called. put param: " + param);  
      super.onSaveInstanceState(outState);  
  }  
    
  /** 
   * Activity被系统杀死后再重建时被调用. 
   * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. 
   * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后. 
   */  
  @Override  
  protected void onRestoreInstanceState(Bundle savedInstanceState) {  
      param = savedInstanceState.getInt("param");  
      Log.i(TAG, "onRestoreInstanceState called. get param: " + param);  
      super.onRestoreInstanceState(savedInstanceState);  
  }


最后盗生命周期流程图一张

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: