2015年5月20日星期三

用LogCat体验碎片生命周期

上次整理了下Activity的生命周期,今儿再把碎片(fragment)的生命周期整理下吧。

首先,上图,上大图,上爽图,



有没有清楚直观如狗的感觉?

左侧是碎片的生命周期,右侧是活动生命周期与碎片生命周期结合图,由此可见活动周期对碎片周期的影响。活动是碎片的宿主,在对前者周期理解的基础上,碎片生命周期自然也很好消化吸收了。两者的差异主要在onCreate()和onDestroy()上。

1.onAttach()
    当碎片和活动建立关联时调用
2.onCreateView()
    为碎片创建视图,即加载布局时调用
3.onActivityCreated()
    确保与碎片相关联的活动一定已经创建完毕时调用
4.onDestroyView()
    当与碎片关联的视图被移除的时候调用
5.o'n'Detach()
    当碎片和活动解除关联的时候调用.。

话归正题,为了更好地体验碎片生命周期,上代码,依旧参考《第一行代码》,

//坤坤喜欢小莹莹

package com.example.fragmenttest;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class RightFragment extends Fragment {
 
 public static final String TAG = "RightFragment";
 
 @Override
 public void onAttach(Activity activity) {
  super.onAttach(activity);
  Log.d(TAG, "onAttach");
 }
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.d(TAG, "onCreate");
 }
 
 @Override
 public View onCreateView (LayoutInflater inflater, ViewGroup container, 
   Bundle savedInstanceState) {
  Log.d(TAG, "onCreateView");
  View view = inflater.inflate(R.layout.right_fragment, container, false);
  return view;
 }
 
 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);
  Log.d(TAG, "onActivityCreated");
 }
 
 @Override
 public void onStart() {
  super.onStart();
  Log.d(TAG, "onStart");
 }
 
 @Override
 public void onResume() {
  super.onResume();
  Log.d(TAG, "onResume");
 }
 
 @Override 
 public void onPause() {
  super.onPause();
  Log.d(TAG, "onPause");
 }
 
 @Override
 public void onStop() {
  super.onStop();
  Log.d(TAG, "onStop");
 }
 
 @Override
 public void onDestroyView() {
  super.onDestroyView();
  Log.d(TAG, "onDestroyView");
 }
 
 @Override
 public void onDestroy() {
  super.onDestroy();
  Log.d(TAG, "onDestroy");
 }
 
 public void onDetach() {
  super.onDetach();
  Log.d(TAG, "onDetach");
 }

}

只给出了碎片的代码,这才是core,其他部分省略。

运行APP,在LogCat已经新建过滤规则by Application Name的过滤器。这时可见打印信息,如下,



可知,当RightFragment第一次被加载到屏幕上时,会依次执行onAttach(),onCreate(),onCreateView(),onActivityCreated(),onStart(),onResume()方法。此为启动过程。

通知栏来到了一条微信消息,点击查看,此时页面切换到了微信聊天窗口页面。那这个时候RightFragment在干嘛呢?RightFragment的宿主活动这时候被微信的Activity遮蔽住了,应该是执行onPause()和omStop()方法。那back返回RightFragment页面的时候呢?

看看LogCat是怎么输出的吧,如图


可知,跳转到微信的时候,RigtFragment进入了停止状态,依次执行onPause()和omStop()方法。但是其没有被销毁(为什么呢?因为活动只是暂时处于停止状态)。RigtFragment重新回来啦,依次执行了onStart()和onResume()方法。

退出,按返回键退出回到桌面。LogCat输出如下,


依次执行了onPause(),onStop(),onDestroyView(),onDestroy(),onDetach()方法,最终将活动和碎片一起销毁啦。

这就是碎片的生命周期,清晰明了。

注意一点,碎片中通过onSaveInsatanceState()方法来保存数据,处于停止状态的碎片被系统回收后,保存下来的数据可以在onCreate(),onCreateView()和onActivityCreated()中重新获得,它们都包含一个Bundle类型的savedInsatanceState参数。

LOL


没有评论:

发表评论