Android之Activity,Fragment生命周期探知

来源:互联网 发布:淘宝外卖订餐网 编辑:程序博客网 时间:2024/06/18 18:30

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

Activity生命周期执行顺序图


Fragment生命周期执行顺序图


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

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

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

public class MainActivity extends Activity {private static String TAG = "chenjianjun";private static Button mybtnButton;@Overridepublic 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) */@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mybtnButton = (Button)findViewById(R.id.btn);mybtnButton.setOnClickListener(new View.OnClickListener() {@Overridepublic 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) */@Overrideprotected 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() */@Overrideprotected 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() */@Overrideprotected 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) */@Overrideprotected 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活动状态生存期结束时被调用 */@Overrideprotected void onPause(){Log.i(TAG, "onPause is call start.......");/** * 挂起UI更新,线程或者CPU密集的进程 */super.onPause();Log.i(TAG, "onPause is call end.......");}@Overrideprotected void onStop(){Log.i(TAG, "onStop is call start.......");/** * 挂起UI更新,线程或者处理 * 当Activity不可见时,保存所有的编辑或者状态改变 * 调用这个方法后,进程可能会被终止 */super.onStop();Log.i(TAG, "onStop is callv end.......");}@Overrideprotected void onDestroy(){Log.i(TAG, "onDestroy is call start.......");/** * 清理所有的资源,包括结束线程,关闭数据库连接等 */super.onDestroy();Log.i(TAG, "onDestroy is call end.......");}@Overrideprotected 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上 */@Overridepublic void onAttach(Activity activity){Log.i(TAG, "-----onAttach is call start.......");super.onAttach(activity);/** * 获取对父Activity的引用 */Log.i(TAG, "-----onAttach is call end.......");}/** * 调用该方法来进行Fragment的初始创建 */@Overridepublic void onCreate(Bundle savedInstanceState){Log.i(TAG, "-----onCreate is call start.......");super.onCreate(savedInstanceState);/** * 初期化Fragment */Log.i(TAG, "-----onCreate is call end.......");}/** * 一旦Fragment已被创建,要创建它自己的用户界面时调用该方法 */@Overridepublic 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已经被创建,则调用该方法 */@Overridepublic 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.......");}/** * 在可见生命周期的开始时被调用 */@Overridepublic void onStart(){Log.i(TAG, "-----onStart is call start.......");super.onStart();/** * 应用所有需要的UI变化,现在Fragment是可见的 */Log.i(TAG, "-----onStart is call end.......");}/** * 在活动生命周期开始时被调用 */@Overridepublic void onResume(){Log.i(TAG, "-----onResume is call start.......");super.onResume();/** * 恢复所有暂停的事物,如UI更新,线程或者进程等 */Log.i(TAG, "-----onResume is call end.......");}/** * 在活动生命周期结束时被调用 */@Overridepublic void onPause(){Log.i(TAG, "-----onPause is call start.......");/** * 需要暂停父Activity不是活动的前台Activity时,需要暂停的事物,如UI更新,线程或者进程等 */super.onPause();Log.i(TAG, "-----onPause is call end.......");}/** *  在活动生命周期结束时被调用,保存UI的状态变化 */@Overridepublic 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.......");}/** * 在可见生命周期结束时调用该方法 */@Overridepublic void onStop(){Log.i(TAG, "-----onStop is call start.......");/** * 当Fragment不可见时,暂停其余的事物,如UI更新,线程或者进程等 */super.onStop();Log.i(TAG, "-----onStop is call end.......");}/** * 当Fragment的view被分离时,调用该方法 */@Overridepublic void onDestroyView(){Log.i(TAG, "-----onDestroyView is call start.......");/** * 清除资源相关的view */super.onDestroyView();Log.i(TAG, "-----onDestroyView is call end.......");}/** * 在整个生命周期结束的时候调用 */@Overridepublic void onDestroy(){Log.i(TAG, "-----onDestroy is call start.......");/** * 清除所有的资源,包括线程和关闭数据库连接等 */super.onDestroy();Log.i(TAG, "-----onDestroy is call end.......");}/** * 当Fragment从它的父Activity上分离时调用 */@Overridepublic 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之间,

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

1 0
原创粉丝点击