Android之Activity,Fragment生命周期探知
来源:互联网 发布:淘宝外卖订餐网 编辑:程序博客网 时间:2024/06/18 18:30
根据官方文档,本人手画了一下Activity和Fragment的整个生命周期执行顺序图:
Activity生命周期执行顺序图:
Fragment生命周期执行顺序图:
一个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
- Android之Activity,Fragment生命周期探知
- Android Activity Fragment 生命周期
- Android Activity Fragment 生命周期
- android 生命周期 Activity/Fragment lifecycle
- android - activity和fragment生命周期
- android activity fragment 完整生命周期
- Android Activity和Fragment生命周期
- Android Activity和Fragment生命周期
- Android开发之Activity和Fragment生命周期对比图
- android面试之Activity跟Fragment的生命周期
- Android 开发之 fragment 与 activity的生命周期
- Android复习之旅--Activity/Service/Fragment 生命周期
- Android activity 生命周期 和Fragment 生命周期结合
- Android--Activity生命周期和Fragment生命周期
- android之Fragment生命周期
- Android之fragment生命周期
- Android 之 Activity 生命周期
- android之activity生命周期
- linux mail发邮件
- Gray Code
- 递归求1!+2!+3!+...+n!
- Redhat 5.9下不识别命令ifconfig
- Service以及AIDL学习
- Android之Activity,Fragment生命周期探知
- 安装JDK8
- shiro 简介 (三)
- JAVA字符串格式化-String.format()和MessageFormat的使用
- 表格table
- POJ 1287 Networking
- shiro 简介 (四)
- ruby中的 Proc、block说明
- Android init.c简析