首先,上图,上大图,上爽图,
有没有清楚直观如狗的感觉?
左侧是碎片的生命周期,右侧是活动生命周期与碎片生命周期结合图,由此可见活动周期对碎片周期的影响。活动是碎片的宿主,在对前者周期理解的基础上,碎片生命周期自然也很好消化吸收了。两者的差异主要在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
没有评论:
发表评论