根据官方文档,本人手画了一下Activity和Fragment的整个生命周期执行顺序图:
Activity生命周期执行顺序图:
Fragment生命周期执行顺序图:
一个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之间,
书中的文字表述也是这样来说的,不知道为什么图是这样来画的!