Fragment(四)Fragment生命周期分析(转)
Fragment(四)Fragment生命周期分析
转载请注明:http://blog.csdn.net/liaoqianchuan00/article/details/24271607
例子一 从Layout中加载Fragment:
假设我们有一个Activity的Layout中有两个Fragment:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.androidtest.MainActivity"
android:orientation="horizontal"
tools:ignore="MergeRootFrame" >
<fragmentandroid:name="com.example.androidtest.FragmentA"
android:id="@+id/fragmentA"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.example.androidtest.FragmentB"
android:id="@+id/fragmentB"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
而我们的Fragment很简单:
public class MainActivity extends FragmentActivity {
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("==========","MainActivity onCreate");
setContentView(R.layout.activity_main);
Log.d("==========","MainActivity onCreate finish");
}
@Override
protectedvoid onDestroy() {
Log.d("==========","MainActivity onDestroy");
super.onDestroy();
Log.d("==========","MainActivity onDestroy finish");
}
@Override
protectedvoid onPause() {
Log.d("==========","MainActivity onPause");
super.onPause();
Log.d("==========","MainActivity onPause finish");
}
@Override
protectedvoid onResume() {
Log.d("==========","MainActivity onResume");
super.onResume();
Log.d("==========","MainActivity onResume finish");
}
@Override
protectedvoid onStart() {
Log.d("==========","MainActivity onStart");
super.onStart();
Log.d("==========","MainActivity onStart finish");
}
@Override
protectedvoid onStop() {
Log.d("==========","MainActivity onStop");
super.onStop();
Log.d("==========","MainActivity onStop finish");
}
}
接下来是我们的FragmentA:
public class FragmentA extends Fragment {
@Override
publicvoid onAttach(Activity activity) {
super.onAttach(activity);
Log.d("==========","FragmentA onAttach");
}
@Override
publicvoid onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("==========","FragmentA onActivityCreated");
}
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("==========","FragmentA onCreate");
}
@Override
publicView onCreateView(LayoutInflater inflater, ViewGroup container,
BundlesavedInstanceState) {
Log.d("==========","FragmentA onCreateView");
returninflater.inflate(R.layout.fragment_main, container, false);
}
@Override
publicvoid onDestroy() {
super.onDestroy();
Log.d("==========","FragmentA onDestroy");
}
@Override
publicvoid onDestroyView() {
super.onDestroyView();
Log.d("==========","FragmentA onDestroyView");
}
@Override
publicvoid onDetach() {
super.onDetach();
Log.d("==========","FragmentA onDetach");
}
@Override
publicvoid onPause() {
super.onPause();
Log.d("==========","FragmentA onPause");
}
@Override
publicvoid onResume() {
super.onResume();
Log.d("==========","FragmentA onResume");
}
@Override
publicvoid onStart() {
super.onStart();
Log.d("==========","FragmentA onStart");
}
@Override
publicvoid onStop() {
super.onStop();
Log.d("==========","FragmentA onStop");
}
}
Fragment B和A类似,只是log不同。
开始测试。运行程序,当出现界面之后,关闭屏幕电源,然后再点亮屏幕,出现屏幕之后再旋转屏幕,最后按back退出程序。
查看Log:
======运行程序
04-21 16:54:05.689: D/==========(31589):MainActivity onCreate
04-21 16:54:05.699: D/==========(31589):FragmentA onAttach
04-21 16:54:05.699: D/==========(31589):FragmentA onCreate
04-21 16:54:05.709: D/==========(31589):FragmentA onCreateView
04-21 16:54:05.709: D/==========(31589):FragmentB onAttach
04-21 16:54:05.709: D/==========(31589):FragmentB onCreate
04-21 16:54:05.709: D/==========(31589):FragmentB onCreateView
04-21 16:54:05.709: D/==========(31589):MainActivity onCreate finish
04-21 16:54:05.709: D/==========(31589):MainActivity onStart
04-21 16:54:05.709: D/==========(31589):FragmentA onActivityCreated
04-21 16:54:05.709: D/==========(31589):FragmentB onActivityCreated
04-21 16:54:05.709: D/==========(31589):FragmentA onStart
04-21 16:54:05.709: D/==========(31589):FragmentB onStart
04-21 16:54:05.709: D/==========(31589):MainActivity onStart finish
04-21 16:54:05.709: D/==========(31589):MainActivity onResume
04-21 16:54:05.709: D/==========(31589):MainActivity onResume finish
04-21 16:54:05.709: D/==========(31589):FragmentA onResume
04-21 16:54:05.709: D/==========(31589):FragmentB onResume
======关闭屏幕
04-21 16:54:09.929: D/==========(31589):MainActivity onPause
04-21 16:54:09.989: D/==========(31589):FragmentA onPause
04-21 16:54:09.989: D/==========(31589):FragmentB onPause
04-21 16:54:09.989: D/==========(31589):MainActivity onPause finish
04-21 16:54:09.999: D/==========(31589):MainActivity onStop
04-21 16:54:09.999: D/==========(31589):FragmentA onStop
04-21 16:54:09.999: D/==========(31589):FragmentB onStop
04-21 16:54:09.999: D/==========(31589):MainActivity onStop finish
======再次点亮屏幕
04-21 16:54:22.099: D/==========(31589):MainActivity onStart
04-21 16:54:22.099: D/==========(31589):FragmentA onStart
04-21 16:54:22.099: D/==========(31589):FragmentB onStart
04-21 16:54:22.099: D/==========(31589):MainActivity onStart finish
04-21 16:54:22.109: D/==========(31589):MainActivity onResume
04-21 16:54:22.109: D/==========(31589):MainActivity onResume finish
04-21 16:54:22.109: D/==========(31589):FragmentA onResume
04-21 16:54:22.109: D/==========(31589):FragmentB onResume
======旋转屏幕(导致重新创建Activity和Fragment)
04-21 16:54:26.729: D/==========(31589):MainActivity onPause
04-21 16:54:26.729: D/==========(31589):FragmentA onPause
04-21 16:54:26.729: D/==========(31589):FragmentB onPause
04-21 16:54:26.729: D/==========(31589):MainActivity onPause finish
04-21 16:54:26.729: D/==========(31589):MainActivity onStop
04-21 16:54:26.729: D/==========(31589):FragmentA onStop
04-21 16:54:26.729: D/==========(31589):FragmentB onStop
04-21 16:54:26.729: D/==========(31589):MainActivity onStop finish
04-21 16:54:26.729: D/==========(31589):MainActivity onDestroy
04-21 16:54:26.729: D/==========(31589):FragmentA onDestroyView
04-21 16:54:26.729: D/==========(31589):FragmentA onDestroy
04-21 16:54:26.729: D/==========(31589):FragmentA onDetach
04-21 16:54:26.729: D/==========(31589):FragmentB onDestroyView
04-21 16:54:26.729: D/==========(31589):FragmentB onDestroy
04-21 16:54:26.729: D/==========(31589):FragmentB onDetach
04-21 16:54:26.729: D/==========(31589):MainActivity onDestroy finish
04-21 16:54:26.739: D/==========(31589):MainActivity onCreate
04-21 16:54:26.749: D/==========(31589):FragmentA onAttach
04-21 16:54:26.749: D/==========(31589):FragmentA onCreate
04-21 16:54:26.749: D/==========(31589):FragmentA onCreateView
04-21 16:54:26.749: D/==========(31589):FragmentB onAttach
04-21 16:54:26.749: D/==========(31589):FragmentB onCreate
04-21 16:54:26.749: D/==========(31589):FragmentB onCreateView
04-21 16:54:26.749: D/==========(31589):MainActivity onCreate finish
04-21 16:54:26.749: D/==========(31589):MainActivity onStart
04-21 16:54:26.749: D/==========(31589):FragmentA onActivityCreated
04-21 16:54:26.749: D/==========(31589):FragmentB onActivityCreated
04-21 16:54:26.749: D/==========(31589):FragmentA onStart
04-21 16:54:26.749: D/==========(31589):FragmentB onStart
04-21 16:54:26.749: D/==========(31589):MainActivity onStart finish
04-21 16:54:26.749: D/==========(31589):MainActivity onResume
04-21 16:54:26.749: D/==========(31589):MainActivity onResume finish
04-21 16:54:26.749: D/==========(31589):FragmentA onResume
04-21 16:54:26.749: D/==========(31589):FragmentB onResume
04-21 16:54:26.759: E/ViewRootImpl(31589):sendUserActionEvent() mView == null
======按Back退出程序
04-21 16:54:33.249: D/==========(31589):MainActivity onPause
04-21 16:54:33.249: D/==========(31589):FragmentA onPause
04-21 16:54:33.249: D/==========(31589):FragmentB onPause
04-21 16:54:33.249: D/==========(31589):MainActivity onPause finish
04-21 16:54:33.439:W/IInputConnectionWrapper(31589): showStatusIcon on inactive InputConnection
04-21 16:54:33.469: D/==========(31589):MainActivity onStop
04-21 16:54:33.469: D/==========(31589):FragmentA onStop
04-21 16:54:33.469: D/==========(31589):FragmentB onStop
04-21 16:54:33.469: D/==========(31589):MainActivity onStop finish
04-21 16:54:33.469: D/==========(31589):MainActivity onDestroy
04-21 16:54:33.469: D/==========(31589):FragmentA onDestroyView
04-21 16:54:33.469: D/==========(31589):FragmentA onDestroy
04-21 16:54:33.469: D/==========(31589):FragmentA onDetach
04-21 16:54:33.469: D/==========(31589):FragmentB onDestroyView
04-21 16:54:33.469: D/==========(31589):FragmentB onDestroy
04-21 16:54:33.469: D/==========(31589):FragmentB onDetach
04-21 16:54:33.469: D/==========(31589):MainActivity onDestroy finish
例子二 从代码中加载Fragment
接下来我们将上面的例子改一下,在点击Activity界面一个Button的时候添加两个Fragment。
我们将Activity的layout文件改成如下所示:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.androidtest.MainActivity"
tools:ignore="MergeRootFrame" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</Button>
</LinearLayout>
将MainActivity的onCreate函数改成如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("==========","MainActivity onCreate");
setContentView(R.layout.activity_main);
Buttonbtn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(newOnClickListener() {
@Override
publicvoid onClick(View arg0) {
Fragmenta = new FragmentA();
FragmentTransactionft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.container,a);
ft.commit();
}
});
Log.d("==========","MainActivity onCreate finish");
}
开始测试。运行程序,当出现界面之后,点击按钮,出现新的界面的之后,关闭屏幕电源,然后再点亮屏幕,出现屏幕之后再旋转屏幕,最后按back退出程序。
查看Log:
======运行程序
04-21 17:08:39.869: D/==========(2830):MainActivity onCreate
04-21 17:08:39.889: D/==========(2830):MainActivity onCreate finish
04-21 17:08:39.889: D/==========(2830):MainActivity onStart
04-21 17:08:39.889: D/==========(2830):MainActivity onStart finish
04-21 17:08:39.889: D/==========(2830):MainActivity onResume
04-21 17:08:39.889: D/==========(2830):MainActivity onResume finish
======点击按钮
04-21 17:08:46.039: D/==========(2830):FragmentA onAttach
04-21 17:08:46.039: D/==========(2830):FragmentA onCreate
04-21 17:08:46.039: D/==========(2830):FragmentA onCreateView
04-21 17:08:46.039: D/==========(2830): FragmentAonActivityCreated
04-21 17:08:46.039: D/==========(2830):FragmentA onStart
04-21 17:08:46.039: D/==========(2830):FragmentA onResume
======关闭屏幕
04-21 17:09:23.239: D/==========(2830):MainActivity onPause
04-21 17:09:23.329: D/==========(2830): FragmentAonPause
04-21 17:09:23.329: D/==========(2830):MainActivity onPause finish
04-21 17:09:23.429: D/==========(2830):MainActivity onStop
04-21 17:09:23.429: D/==========(2830):FragmentA onStop
04-21 17:09:23.429: D/==========(2830):MainActivity onStop finish
======再次点亮屏幕
04-21 17:09:46.779: D/==========(2830):MainActivity onStart
04-21 17:09:46.779: D/==========(2830):FragmentA onStart
04-21 17:09:46.779: D/==========(2830):MainActivity onStart finish
04-21 17:09:46.789: D/==========(2830): MainActivityonResume
04-21 17:09:46.789: D/==========(2830):MainActivity onResume finish
04-21 17:09:46.789: D/==========(2830):FragmentA onResume
======旋转屏幕
04-21 17:09:53.339: D/==========(2830):MainActivity onPause
04-21 17:09:53.339: D/==========(2830):FragmentA onPause
04-21 17:09:53.349: D/==========(2830):MainActivity onPause finish
04-21 17:09:53.349: D/==========(2830):MainActivity onStop
04-21 17:09:53.349: D/==========(2830):FragmentA onStop
04-21 17:09:53.349: D/==========(2830):MainActivity onStop finish
04-21 17:09:53.349: D/==========(2830):MainActivity onDestroy
04-21 17:09:53.349: D/==========(2830):FragmentA onDestroyView
04-21 17:09:53.349: D/==========(2830):FragmentA onDestroy
04-21 17:09:53.349: D/==========(2830):FragmentA onDetach
04-21 17:09:53.349: D/==========(2830):MainActivity onDestroy finish
04-21 17:09:53.359: D/==========(2830):FragmentA onAttach
04-21 17:09:53.359: D/==========(2830):FragmentA onCreate
04-21 17:09:53.359: D/==========(2830):MainActivity onCreate
04-21 17:09:53.379: D/==========(2830):MainActivity onCreate finish
04-21 17:09:53.379: D/==========(2830):MainActivity onStart
04-21 17:09:53.379: D/==========(2830):FragmentA onCreateView
04-21 17:09:53.379: D/==========(2830):FragmentA onActivityCreated
04-21 17:09:53.379: D/==========(2830):FragmentA onStart
04-21 17:09:53.379: D/==========(2830):MainActivity onStart finish
04-21 17:09:53.379: D/==========(2830):MainActivity onResume
04-21 17:09:53.379: D/==========(2830):MainActivity onResume finish
04-21 17:09:53.379: D/==========(2830):FragmentA onResume
04-21 17:09:53.399: E/ViewRootImpl(2830):sendUserActionEvent() mView == null
======按back退出程序
04-21 17:10:14.069: D/==========(2830):MainActivity onPause
04-21 17:10:14.069: D/==========(2830):FragmentA onPause
04-21 17:10:14.079: D/==========(2830):MainActivity onPause finish
04-21 17:10:14.249:W/IInputConnectionWrapper(2830): showStatusIcon on inactive InputConnection
04-21 17:10:14.269: D/==========(2830):MainActivity onStop
04-21 17:10:14.269: D/==========(2830):FragmentA onStop
04-21 17:10:14.269: D/==========(2830):MainActivity onStop finish
04-21 17:10:14.269: D/==========(2830):MainActivity onDestroy
04-21 17:10:14.269: D/==========(2830):FragmentA onDestroyView
04-21 17:10:14.269: D/==========(2830):FragmentA onDestroy
04-21 17:10:14.269: D/==========(2830):FragmentA onDetach
04-21 17:10:14.269: D/==========(2830):MainActivity onDestroy finish
例子三 Hide Fragment之后的生命周期
我们在main activity中添加两个按钮,一个add fragment,一个hidefragment
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.androidtest.MainActivity"
tools:ignore="MergeRootFrame" >
<Button
android:id="@+id/btn1"
android:text="add Fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</Button>
<Button
android:id="@+id/btn2"
android:text="hide Fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</Button>
</LinearLayout>
修改MainActivity的onCreate函数
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("==========","MainActivity onCreate");
setContentView(R.layout.activity_main);
Buttonbtn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(newOnClickListener() {
@Override
publicvoid onClick(View arg0) {
Log.d("==========","Add Fragment");
Fragmenta = new FragmentA();
FragmentTransactionft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.container,a,"Fragment A");
ft.commit();
}
});
Buttonbtn2 = (Button) findViewById(R.id.btn2);
btn2.setOnClickListener(newOnClickListener() {
@Override
publicvoid onClick(View arg0) {
Log.d("==========","Hide Fragment");
FragmentTransactionft = getSupportFragmentManager().beginTransaction();
ft.hide(getSupportFragmentManager().findFragmentByTag("FragmentA"));
ft.commit();
}
});
Log.d("==========","MainActivity onCreate finish");
}
开始测试。运行程序,当出现界面之后,点击add Fragment,出现新的界面的之后,再点击hide Fragment,然后关闭屏幕,接着点亮屏幕。
查看Log:
======运行程序
04-21 17:18:53.069: D/==========(3974):MainActivity onCreate
04-21 17:18:53.079: D/==========(3974):MainActivity onCreate finish
04-21 17:18:53.079: D/==========(3974):MainActivity onStart
04-21 17:18:53.079: D/==========(3974):MainActivity onStart finish
04-21 17:18:53.079: D/==========(3974):MainActivity onResume
04-21 17:18:53.079: D/==========(3974):MainActivity onResume finish
======点击add Fragment
04-21 17:18:55.729: D/==========(3974): AddFragment
04-21 17:18:55.729: D/==========(3974):FragmentA onAttach
04-21 17:18:55.729: D/==========(3974):FragmentA onCreate
04-21 17:18:55.729: D/==========(3974):FragmentA onCreateView
04-21 17:18:55.729: D/==========(3974):FragmentA onActivityCreated
04-21 17:18:55.729: D/==========(3974):FragmentA onStart
04-21 17:18:55.729: D/==========(3974):FragmentA onResume
======点击hide Fragment
04-21 17:19:03.409: D/==========(3974):Hide Fragment
======关闭屏幕
04-21 17:19:20.349: D/==========(3974):MainActivity onPause
04-21 17:19:20.369: D/==========(3974):FragmentA onPause
04-21 17:19:20.369: D/==========(3974):MainActivity onPause finish
04-21 17:19:20.379: D/==========(3974):MainActivity onStop
04-21 17:19:20.379: D/==========(3974):FragmentA onStop
04-21 17:19:20.379: D/==========(3974):MainActivity onStop finish
======点亮屏幕
04-21 17:19:35.079: D/==========(3974):MainActivity onStart
04-21 17:19:35.079: D/==========(3974):FragmentA onStart
04-21 17:19:35.079: D/==========(3974):MainActivity onStart finish
04-21 17:19:35.089: D/==========(3974):MainActivity onResume
04-21 17:19:35.089: D/==========(3974):MainActivity onResume finish
04-21 17:19:35.089: D/==========(3974):FragmentA onResume
我们发现虽然我们的Fragment被hide起来了,但是因为他没有被移除掉,所以他的生命周期还是会被宿主Activity影响。
Fragment(四)Fragment生命周期分析(转)的更多相关文章
- 12、Cocos2dx 3.0游戏开发找小三之3.0中的生命周期分析
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303 生命周期分析 在前面文章中我们执行了第 ...
- Django(35)Django请求生命周期分析(超详细)
Django请求生命周期分析 1.客户端发送请求 在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都 ...
- Django(47)drf请求生命周期分析
前言 一般我们写完序列化以后,我们就会开始写视图了,drf中我们一般使用CBV的方式,也就是类视图的方式,最基础的我们会使用from rest_framework.views import API ...
- Android Fragment详解(二):Fragment创建及其生命周期
Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...
- Android开发 - Fragment与Activity生命周期比较
1. Fragment的生命周期 见下图 2. 与Activity生命周期的对比 见下图 3. 代码场景演示实例 切换到该Fragment: AppListFragment(7649): onAtta ...
- Activity ViewPager Fragment框架的生命周期
1.Fragment的生命周期函数 onAttach.onCreate.onCreateView.onViewCreated.onActivityCreated.onStart.onResume.on ...
- *Fragment与Activity生命周期的协调
本文出处:http://blog.csdn.net/think_soft/article/details/7272869 拥有Fragment的Activity的生命周期直接影响了其中的Fragmen ...
- fragment hide/show 生命周期
Fragment的使用越来越普遍了,掌握它的生命周期以及注意事项时非常有必要的,首先 All subclasses of Fragment must include a public empty co ...
- Android 中Activity生命周期分析(二):从AActivity 到BActivity过程分析
如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码: package com.king.review.base; import android.app. ...
随机推荐
- 其他应用和技巧-用JS实现的抽奖程序
-------------------------------- <script type="text/javascript"> var data ...
- Lotto
Lotto Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- 遭遇mediumint上限
Mediumint:The signed range is -8388608 to 8388607. The unsigned range is 0 to 16777215. home_notific ...
- [科普]DNS相关的攻击介绍
一 什么是DNS DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不 ...
- 去掉input text后面的叉
如题 input[type=text]::-ms-clear{ display: none; } input::-webkit-search-cancel-button{ display: none; ...
- POJ 3597 种类数 数学+递推
http://poj.org/problem?id=3597 题目大意:把一个正多边形分成数个三角形或者四边形,问有多少种方案. 思路:http://www.cnblogs.com/Ritchie/p ...
- TOMCAT-publishing to tomcat v7.0 server at
因为tomcat的work文件没有清空,导致MyEclipse部署在server.xml文件中的项目路径是错误的. 解决办法:清空work文件夹 下面这个勾勾是MyEclipse自动发布项目路径的选项
- 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null
如题,“扩展方法where方法查询不到数据,不会抛异常,也不是返回的null”,示例代码如下: Product类: public class Product { private string name ...
- 使用POI生成Excel文件,可以自动调整excel列宽
//autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...
- IIS访问PHP文件时,弹出用户名和密码提示框的解决方法
找了一圈,以下的方法解决了IIS访问PHP弹用户名和密码提示框问题. 解决方法:给PHP安装目录everyone读取权限 这样不知道会不会出现安全问题,请大家谨慎.