Android之Activity,Fragment生命周期探知

本文详细解析了Android中Activity和Fragment的生命周期,包括它们的状态划分、执行顺序及具体回调方法的作用。通过示例代码和日志输出,展示了不同场景下两者生命周期的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据官方文档,本人手画了一下Activity和Fragment的整个生命周期执行顺序图:

Activity生命周期执行顺序图


Fragment生命周期执行顺序图


 一个Activity在它的整个生命周期里面分三个状态,分别是活动周期,可见周期,以及生命周期。 

一个Fragment是依附于Activity之上,它的整个生命周期里面也分三个状态,分别是活动周期,可见周期,以及生命周期。

现在我们来分析一下这些状态的实际执行顺序,我们通过日志的方式来打印每个函数的执行过程,新建一个android工程,Activity代码和Fragment代码如下:

public class MainActivity extends Activity {

	private static String TAG = "chenjianjun";
	
	private static Button mybtnButton;
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	/** 
	 * 在完整生存期开始时调用
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mybtnButton = (Button)findViewById(R.id.btn);
		mybtnButton.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent bintent = new Intent(MainActivity.this, SecondActivity.class);
				startActivity(bintent);
			}
		});
		
		Log.i(TAG, "onCreate is call.......");
	}

	/**
	 * 在onCreate方法后调用,用于恢复UI状态
	 * @see android.app.Activity#onRestoreInstanceState(android.os.Bundle)
	 */
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState)
	{
		Log.i(TAG, "onRestoreInstanceState is call start.......");
		super.onRestoreInstanceState(savedInstanceState);
		/**
		 * 从savedInstanceState恢复UI状态
		 * 这个savedInstanceState也被传递给了onCreate
		 * 自Activity上次可见之后,只有当系统终止了该Activity时,才会被调用
		 * 在随后的Activity进程的可见生存期之前被调用
		 */
		Log.i(TAG, "onRestoreInstanceState is call end.......");
	}
	
	/**
	 * 在可见生存期开始时调用
	 * @see android.app.Activity#onStart()
	 */
	@Override
	protected void onStart()
	{
		Log.i(TAG, "onStart is call start.......");
		super.onStart();
		/**
		 * 既然Activity可见,就应用任何要求的UI变化
		 */
		Log.i(TAG, "onStart is call end.......");
	}
	
	/**
	 * 在Activity活动状态生存期开始时调用
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume()
	{
		Log.i(TAG, "onResume is call start.......");
		super.onResume();
		/**
		 * 恢复Activity处于不活动状态时被挂起的,暂停的UI更新,线程,进程
		 */
		Log.i(TAG, "onResume is call end.......");
	}
	
	/*
	 * 把UI状态保存到outState中
	 * @see android.app.Activity#onSaveInstanceState(android.os.Bundle)
	 */
	@Override
	protected void onSaveInstanceState(Bundle savedInstanceState)
	{
		Log.i(TAG, "onSaveInstanceState is call start.......");
		/**
		 * 保存UI的状态
		 * 如果进程被运行时终止并重启,那么这个Bundle会被传递给onCreate和onRestoreInstanceState
		 */
		super.onSaveInstanceState(savedInstanceState);
		Log.i(TAG, "onSaveInstanceState is call end.......");
	}
	
	/**
	 * 在Activity活动状态生存期结束时被调用
	 */
	@Override
	protected void onPause()
	{
		Log.i(TAG, "onPause is call start.......");
		/**
		 * 挂起UI更新,线程或者CPU密集的进程
		 */
		super.onPause();
		Log.i(TAG, "onPause is call end.......");
	}
	
	@Override
	protected void onStop()
	{
		Log.i(TAG, "onStop is call start.......");
		/**
		 * 挂起UI更新,线程或者处理
		 * 当Activity不可见时,保存所有的编辑或者状态改变
		 * 调用这个方法后,进程可能会被终止
		 */
		super.onStop();
		
		Log.i(TAG, "onStop is callv end.......");
	}
	
	@Override
	protected void onDestroy()
	{
		Log.i(TAG, "onDestroy is call start.......");
		/**
		 * 清理所有的资源,包括结束线程,关闭数据库连接等
		 */
		super.onDestroy();
		
		Log.i(TAG, "onDestroy is call end.......");
	}
	
	@Override
	protected void onRestart()
	{
		Log.i(TAG, "onRestart is call start.......");
		super.onRestart();
		/**
		 * 加装载改变,知道Activity在此进程中已经可见
		 */
		Log.i(TAG, "onRestart is call end.......");
	}
}

public class MyStateFragment extends Fragment {

	private static String TAG = "chenjianjun";
	/**
	 * 调用该方法时,Fragment会被连接到它的父Activity上
	 */
	@Override
	public void onAttach(Activity activity)
	{
		Log.i(TAG, "-----onAttach is call start.......");
		super.onAttach(activity);
		/**
		 * 获取对父Activity的引用
		 */
		Log.i(TAG, "-----onAttach is call end.......");
	}
	
	/**
	 * 调用该方法来进行Fragment的初始创建
	 */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		Log.i(TAG, "-----onCreate is call start.......");
		super.onCreate(savedInstanceState);
		/**
		 * 初期化Fragment
		 */
		Log.i(TAG, "-----onCreate is call end.......");
	}
	
	/**
	 * 一旦Fragment已被创建,要创建它自己的用户界面时调用该方法
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		Log.i(TAG, "-----onCreateView is call start.......");
		/**
		 * 创建,或者填充Fragment的UI,并返回它
		 * 如果这个Fragment没有UI,那么返回null
		 */
		View view = inflater.inflate(R.layout.my_state_fragment, container, false);
		
		Log.i(TAG, "-----onCreateView is call end.......");
		return view;
	}
	
	/**
	 * 一旦父Activity和Fragment的UI已经被创建,则调用该方法
	 */
	@Override
	public void onActivityCreated(Bundle savedInstanceState)
	{
		Log.i(TAG, "-----onActivityCreated is call start.......");
		super.onActivityCreated(savedInstanceState);
		/**
		 * 完成Fragment的初期化----那些父Activity和Fragment的View被完全填充后才能做的事情
		 */
		Log.i(TAG, "-----onActivityCreated is call end.......");
	}
	
	/**
	 * 在可见生命周期的开始时被调用
	 */
	@Override
	public void onStart()
	{
		Log.i(TAG, "-----onStart is call start.......");
		super.onStart();
		/**
		 * 应用所有需要的UI变化,现在Fragment是可见的
		 */
		Log.i(TAG, "-----onStart is call end.......");
	}
	
	/**
	 * 在活动生命周期开始时被调用
	 */
	@Override
	public void onResume()
	{
		Log.i(TAG, "-----onResume is call start.......");
		super.onResume();
		/**
		 * 恢复所有暂停的事物,如UI更新,线程或者进程等
		 */
		Log.i(TAG, "-----onResume is call end.......");
	}
	
	/**
	 * 在活动生命周期结束时被调用
	 */
	@Override
	public void onPause()
	{
		Log.i(TAG, "-----onPause is call start.......");
		/**
		 * 需要暂停父Activity不是活动的前台Activity时,需要暂停的事物,如UI更新,线程或者进程等
		 */
		super.onPause();
		Log.i(TAG, "-----onPause is call end.......");
	}
	
	/**
	 *  在活动生命周期结束时被调用,保存UI的状态变化
	 */
	@Override
	public void onSaveInstanceState(Bundle savedInstanceState)
	{
		Log.i(TAG, "-----onSaveInstanceState is call start.......");
		/**
		 * 将UI的变化信息保存到savedInstanceState中
		 * 这个savedInstanceState会被传递到onCreate,onCreateView和onActivityCreated(如果它的父Activity被终止并且重新启动)方法中
		 */
		super.onSaveInstanceState(savedInstanceState);
		Log.i(TAG, "-----onSaveInstanceState is call end.......");
	}
	
	/**
	 * 在可见生命周期结束时调用该方法
	 */
	@Override
	public void onStop()
	{
		Log.i(TAG, "-----onStop is call start.......");
		/**
		 * 当Fragment不可见时,暂停其余的事物,如UI更新,线程或者进程等
		 */
		super.onStop();
		Log.i(TAG, "-----onStop is call end.......");
	}
	
	/**
	 * 当Fragment的view被分离时,调用该方法
	 */
	@Override
	public void onDestroyView()
	{
		Log.i(TAG, "-----onDestroyView is call start.......");
		/**
		 * 清除资源相关的view
		 */
		super.onDestroyView();
		Log.i(TAG, "-----onDestroyView is call end.......");
	}
	
	/**
	 * 在整个生命周期结束的时候调用
	 */
	@Override
	public void onDestroy()
	{
		Log.i(TAG, "-----onDestroy is call start.......");
		/**
		 * 清除所有的资源,包括线程和关闭数据库连接等
		 */
		super.onDestroy();
		Log.i(TAG, "-----onDestroy is call end.......");
	}
	
	/**
	 * 当Fragment从它的父Activity上分离时调用
	 */
	@Override
	public void onDetach()
	{
		Log.i(TAG, "-----onDetach is call start.......");
		super.onDetach();
		Log.i(TAG, "-----onDetach is call end.......");
	}
}
activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <fragment 
        android:name="com.xuexi.mystateactivity.fragment.MyStateFragment"
        android:id="@+id/ToDoListFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" 
        />
    
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/ToDoListFragment"
        android:layout_below="@+id/ToDoListFragment"
        android:layout_marginTop="44dp"
        android:text="@string/btn_name" />

</RelativeLayout>

编译运行,启动程序打印日志如下:


切换到后台,日志如下:

从后台切换到前台,日志如下:

切换到其他的activity,日志如下:

从其他的activity切换回来,日志如下:

按home键退出,日志如下:

综上,大家对照代码查看日志的,我们展现了在每种情况下,Activity和Fragment的周期处于那种状态。理解好Activity和Fragment的生命周期,对于我们开发好一个app程序

有很大的帮助。

这里有个问题,跟文档上面有一点不相符的,就是Activity的onSaveInstanceState调用,在切换到后台和切换到其他Activity的时候有调用,但是都是在onPause和onStop之间,

书中的文字表述也是这样来说的,不知道为什么图是这样来画的!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值