当前位置: 代码迷 >> Android >> 初学者Android开发系列之:Active的生命周期
  详细解决方案

初学者Android开发系列之:Active的生命周期

热度:26   发布时间:2016-05-01 16:54:28.0
菜鸟Android开发系列之:Active的生命周期

?一.Activity的状态

Activity在任何时间下都处于以下四种状态之一:

1.?????? 活动: Activity由用户启动,正在运行,并且在前台;

2.?????? 暂停: Activity正在运行并且可见,但是被一个通知或者某个Activist覆盖了,用户可以看到,但不能与之交互;

3.?????? 停止:Activity正在运行,但被已启动的另一个Activity所隐藏,应用程序无法直接向用户呈现任何有意义的内容,但可以通过通知的形式与用户通信;

4.?????? 死亡: Activity从未启动或者被终止了。

二.Activity的生命周期

1.?????? onCreate()onDestroy():当Activity首次启动的时,将用一个空参数(null)来调用onCreate(),当Activity关闭时将调用onDestroy()

2.?????? onStart()onRestart()onStop()Activity在用户可见时调用onStart(),重启Activity时将调用onRestart(),停止Activity时调用onStop()

3.?????? onPause()onResume()Activity被暂停时调用onPause()Activity和用户交互时调用onResume()

?

?

示例:

第一个Activity的Code:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><TextView	android:id="@+id/txtActivity"	android:layout_width="fill_parent"	android:layout_height="wrap_content"	/><Button	android:id="@+id/second"	android:layout_width="wrap_content"	android:layout_height="wrap_content"	/></LinearLayout>

?

package com.ap;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class acttivityPeriodAndroid extends Activity {		private final static String TAG = "开始测试Active的生命周期!";    private TextView txt;    private Button btn;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.v(TAG, "onCreate");        setContentView(R.layout.main);        txt = (TextView)findViewById(R.id.txtActivity);        btn = (Button)findViewById(R.id.second);                txt.setText(R.string.txtAct);        btn.setText(R.string.btnSubmit);        btn.setOnClickListener(new ButtonListener());    }        class ButtonListener implements OnClickListener {		@Override		public void onClick(View v) {			Intent ten = new Intent();			ten.setClass(acttivityPeriodAndroid.this, SencondActivity.class);			startActivity(ten);			finish();		}    }	@Override	protected void onStart() {		super.onStart();		Log.v(TAG, "onStart");	}	@Override	protected void onResume() {		super.onResume();		Log.v(TAG, "onResume");	}	@Override	protected void onPause() {		super.onPause();		Log.v(TAG, "onPause");	}	@Override	protected void onStop() {		super.onStop();		Log.v(TAG, "onStop");	}		@Override	protected void onDestroy() {		super.onDestroy();		Log.v(TAG, "onDestroy");	}}

第二个Activity的Code:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><TextView	android:id="@+id/txtSecond"	android:layout_width="fill_parent"	android:layout_height="wrap_content"	/><Button	android:id="@+id/exit"	android:layout_width="wrap_content"	android:layout_height="wrap_content"	/></LinearLayout>

?

package com.ap;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class SencondActivity extends Activity {		private TextView txtSen;	private Button btnExit;	private final static String TAG = "第二个Activity生命周期开始测试";	@Override	protected void onCreate(Bundle savedInstanceState) {				super.onCreate(savedInstanceState);		Log.v(TAG, "onCreate");		setContentView(R.layout.second);				txtSen = (TextView)findViewById(R.id.txtSecond);		btnExit = (Button)findViewById(R.id.exit);				txtSen.setText(R.string.txtSen);		btnExit.setText(R.string.btnQuit);		btnExit.setOnClickListener(new ButtonListener());	}		class ButtonListener implements OnClickListener {		@Override		public void onClick(View v) {			finish();		}		}	@Override	protected void onStart() {		super.onStart();		Log.v(TAG, "onStart");	}	@Override	protected void onResume() {		super.onResume();		Log.v(TAG, "onResume");	}	@Override	protected void onPause() {		super.onPause();		Log.v(TAG, "onPause");	}	@Override	protected void onStop() {		super.onStop();		Log.v(TAG, "onStop");	}		@Override	protected void onDestroy() {		super.onDestroy();		Log.v(TAG, "onDestroy");	}}

?

?

运行后的日志:



?

在启动一个新的Activity阶段:会依次执行3个生命周期OnCreate(),OnStart()和OnResume()

在Activity失去焦点阶段:如果新的Activity完全遮挡住了原有的Activity,会调用OnPause()和OnStop();如果新的Activity只是部分遮挡,如对话框形式的Activity,只会调用OnPause()

在Activity重新获得焦点阶段:如果原Activity是被完全遮挡住的,将会调用OnRestart()、OnStart和OnResume().如果原Activity不是被完全遮挡住的,系统将只调用OnResume().

在关闭Activity阶段:会依次执行Onpause()、OnStop()、OnDestroy()

?

?Task运行机制

?

Task是一个存放很多activity的栈,所有的activity对象在Task栈中被组织成同一个单元。

?

(1)当应用程序启动后,将默认的第一个activity对象压入task栈中.
(2)当点击按钮后启动第二个activity,该Activity对象被压入栈中;手机显示Task栈中顶部的元素,之前的Activity对象还存放在Task栈中,没有被销毁。
(3)当按下back按钮后,处于Task栈顶部的Activity对象被弹出。

?

但如果在通过StartActivity(intent)启动新的activity后,再调用finish(),之前的Activity对象就会在Task栈中被销毁。

?

注意:Task栈中不允许重新排序。?

  相关解决方案