废话不说,直接上内容:
首先创建一个android项目,创建四个文件:
JAVA文件:
MainActivity.java
package com.godlovesoccer.testactivityfragmentlifecycle;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("avtivity", "onCreate before fragment ");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragment = new TestFragment();
getFragmentManager().beginTransaction().add(android.R.id.content,fragment).commit();
Log.d("avtivity", "onCreate after fragment ");
}
protected void onStart(){
super.onStart();
Log.d("avtivity", "onStart");
}
protected void onRestart() {
super.onRestart();
Log.d("avtivity", "onRestart");
}
protected void onResume() {
super.onResume();
Log.d("avtivity", "onResume");
}
protected void onPause() {
super.onPause();
Log.d("avtivity", "onPause");
}
protected void onStop() {
super.onStop();
Log.d("avtivity", "onStop");
}
protected void onDestroy() {
super.onDestroy();
Log.d("avtivity", "onDestroy");
}
}
TestFragment.java
package com.godlovesoccer.testactivityfragmentlifecycle;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.app.Activity;
public class TestFragment extends Fragment {
public void onAttach(Activity activity){
super.onAttach(activity);
Log.d("fragmet", "onAttach");
}
public void onCreate(Bundle savedInstanceState) {
Log.d("fragmet", "onCreate");
super.onCreate(savedInstanceState);
}
//onCreateView函数必须要inflater填充
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d("fragmet", "onCreateView");
return inflater.inflate(R.layout.fragment,container,false);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("fragmet", "onActivityCreated");
}
public void onStart() {
super.onStart();
Log.d("fragmet", "onStart");
}
public void onResume(){
super.onResume();
Log.d("fragmet", "onResume");
}
public void onPause(){
super.onPause();
Log.d("fragmet", "onPause");
}
public void onStop() {
super.onStop();
Log.d("fragmet", "onStop");
}
public void onDestroyView() {
super.onDestroyView();
Log.d("fragmet", "onDestroyView");
}
public void onDestroy() {
super.onDestroy();
Log.d("fragmet", "onDestroy");
}
public void onDetach() {
super.onDetach();
Log.d("fragmet", "onDetach");
}
}
xml文件:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.godlovesoccer.testactivityfragmentlifecycle.MainActivity" >
<fragment
android:id="@+id/fragment1"
android:name="com.godlovesoccer.testactivityfragmentlifecycle.TestFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
fragment.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#00FF00">
<TextView
android:id="@+id/lblFragment1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="this is a fragment #1"
android:textColor="#000000"
android:textSize="25sp"/>
</LinearLayout>
第一种情况:
正常启动应用时日志:
<span style="color:#ff0000;">11-05 06:19:44.150: D/avtivity(1768): onCreate before fragment </span>
11-05 06:19:44.170: D/fragmet(1768): onAttach
11-05 06:19:44.170: D/fragmet(1768): onCreate
11-05 06:19:44.170: D/fragmet(1768): onCreateView
<span style="color:#ff0000;">11-05 06:19:44.170: D/avtivity(1768): onCreate after fragment </span>
11-05 06:19:44.170: D/fragmet(1768): onActivityCreated
11-05 06:19:44.170: D/fragmet(1768): onAttach
11-05 06:19:44.170: D/fragmet(1768): onCreate
11-05 06:19:44.170: D/fragmet(1768): onCreateView
11-05 06:19:44.170: D/fragmet(1768): onActivityCreated
<span style="color:#ff0000;">11-05 06:19:44.170: D/avtivity(1768): onStart</span>
11-05 06:19:44.170: D/fragmet(1768): onStart
11-05 06:19:44.170: D/fragmet(1768): onStart
<span style="color:#ff0000;">11-05 06:19:44.170: D/avtivity(1768): onPostCreate
11-05 06:19:44.170: D/avtivity(1768): onResume</span>
11-05 06:19:44.170: D/fragmet(1768): onResume
11-05 06:19:44.170: D/fragmet(1768): onResume
第二种情况:
当按下home键:
11-05 06:26:25.301: D/fragmet(1829): onPause
11-05 06:26:25.301: D/fragmet(1829): onPause
<span style="color:#ff0000;">11-05 06:26:25.301: D/avtivity(1829): onPause</span>
11-05 06:26:25.961: D/fragmet(1829): onStop
11-05 06:26:25.961: D/fragmet(1829): onStop
<span style="color:#ff0000;">11-05 06:26:25.961: D/avtivity(1829): onStop</span>
长按home键后,选择程序进行启动:
<span style="color:#ff0000;">11-05 06:29:38.594: D/avtivity(1829): onRestart
11-05 06:29:38.594: D/avtivity(1829): onStart</span><span style="color:#330000;">
11-05 06:29:38.594: D/fragmet(1829): onStart
11-05 06:29:38.594: D/fragmet(1829): onStart</span><span style="color:#ff0000;">
11-05 06:29:38.594: D/avtivity(1829): onResume</span><span style="color:#330000;">
11-05 06:29:38.594: D/fragmet(1829): onResume
11-05 06:29:38.594: D/fragmet(1829): onResume</span>
第三种情况:
当按下back键:
11-05 06:33:21.798: D/fragmet(1829): onStop
11-05 06:33:21.798: D/fragmet(1829): onStop
<span style="color:#ff0000;">11-05 06:33:21.798: D/avtivity(1829): onStop</span>
11-05 06:33:21.798: D/fragmet(1829): onDestroyView
11-05 06:33:21.798: D/fragmet(1829): onDestroy
11-05 06:33:21.798: D/fragmet(1829): onDetach
11-05 06:33:21.798: D/fragmet(1829): onDestroyView
11-05 06:33:21.808: D/fragmet(1829): onDestroy
11-05 06:33:21.808: D/fragmet(1829): onDetach
<span style="color:#ff0000;">11-05 06:33:21.808: D/avtivity(1829): onDestroy</span>
长按home键,选择程序进行启动:
<span style="color:#ff0000;">11-05 06:35:01.179: D/avtivity(1829): onCreate before fragment </span>
11-05 06:35:01.189: D/fragmet(1829): onAttach
11-05 06:35:01.189: D/fragmet(1829): onCreate
11-05 06:35:01.189: D/fragmet(1829): onCreateView
<span style="color:#ff0000;">11-05 06:35:01.189: D/avtivity(1829): onCreate after fragment </span>
11-05 06:35:01.189: D/fragmet(1829): onActivityCreated
11-05 06:35:01.189: D/fragmet(1829): onAttach
11-05 06:35:01.189: D/fragmet(1829): onCreate
11-05 06:35:01.189: D/fragmet(1829): onCreateView
11-05 06:35:01.189: D/fragmet(1829): onActivityCreated
<span style="color:#ff0000;">11-05 06:35:01.189: D/avtivity(1829): onStart</span>
11-05 06:35:01.189: D/fragmet(1829): onStart
11-05 06:35:01.189: D/fragmet(1829): onStart<span style="background-color: rgb(255, 0, 0);">
</span><span style="color:#ff0000;">11-05 06:35:01.189: D/avtivity(1829): onResume</span>
11-05 06:35:01.189: D/fragmet(1829): onResume
11-05 06:35:01.189: D/fragmet(1829): onResume
第四种情况:
启动新的应用程序将越来的程序进行覆盖,焦点被新的应程序夺走
11-05 06:39:55.684: D/fragmet(1829): onPause
11-05 06:39:55.684: D/fragmet(1829): onPause
<span style="color:#ff0000;">11-05 06:39:55.684: D/avtivity(1829): onPause</span>
11-05 06:39:56.831: D/fragmet(1829): onStop
11-05 06:39:56.831: D/fragmet(1829): onStop
<span style="color:#ff0000;">11-05 06:39:56.831: D/avtivity(1829): onStop</span>
按back键,将覆盖的应用程序退掉
<span style="color:#ff0000;">11-05 06:42:02.775: D/avtivity(1829): onRestart
11-05 06:42:02.775: D/avtivity(1829): onStart</span>
11-05 06:42:02.775: D/fragmet(1829): onStart
11-05 06:42:02.775: D/fragmet(1829): onStart
<span style="color:#ff0000;">11-05 06:42:02.775: D/avtivity(1829): onResume</span>
11-05 06:42:02.775: D/fragmet(1829): onResume
11-05 06:42:02.775: D/fragmet(1829): onResume
第五种情况,改变屏幕的横竖方向:
<pre name="code" class="plain">11-05 06:43:43.037: D/fragmet(1829): onPause
11-05 06:43:43.037: D/fragmet(1829): onPause
11-05 06:43:43.037: D/fragmet(1829): onPause
11-05 06:43:43.037: D/fragmet(1829): onPause
<span style="color:#ff0000;">11-05 06:43:43.037: D/avtivity(1829): onPause</span>
11-05 06:43:43.037: D/fragmet(1829): onStop
11-05 06:43:43.037: D/fragmet(1829): onStop
11-05 06:43:43.037: D/fragmet(1829): onStop
11-05 06:43:43.037: D/fragmet(1829): onStop
<span style="color:#ff0000;">11-05 06:43:43.037: D/avtivity(1829): onStop</span>
11-05 06:43:43.037: D/fragmet(1829): onDestroyView
11-05 06:43:43.037: D/fragmet(1829): onDestroy
11-05 06:43:43.037: D/fragmet(1829): onDetach
11-05 06:43:43.037: D/fragmet(1829): onDestroyView
11-05 06:43:43.037: D/fragmet(1829): onDestroy
11-05 06:43:43.037: D/fragmet(1829): onDetach
11-05 06:43:43.037: D/fragmet(1829): onDestroyView
11-05 06:43:43.037: D/fragmet(1829): onDestroy
11-05 06:43:43.037: D/fragmet(1829): onDetach
11-05 06:43:43.037: D/fragmet(1829): onDestroyView
11-05 06:43:43.037: D/fragmet(1829): onDestroy
11-05 06:43:43.037: D/fragmet(1829): onDetach
<span style="color:#ff0000;">11-05 06:43:43.037: D/avtivity(1829): onDestroy</span>
11-05 06:43:43.037: W/Trace(1209): Unexpected value from nativeGetEnabledTags: 0
11-05 06:43:43.037: W/Trace(1209): Unexpected value from nativeGetEnabledTags: 0
<span style="color:#ff0000;">11-05 06:43:43.037: D/avtivity(1829): onCreate before fragment </span>
11-05 06:43:43.037: D/fragmet(1829): onAttach
11-05 06:43:43.037: D/fragmet(1829): onCreate
11-05 06:43:43.037: D/fragmet(1829): onAttach
11-05 06:43:43.037: D/fragmet(1829): onCreate
11-05 06:43:43.037: D/fragmet(1829): onAttach
11-05 06:43:43.037: D/fragmet(1829): onCreate
11-05 06:43:43.047: D/fragmet(1829): onAttach
11-05 06:43:43.047: D/fragmet(1829): onCreate
11-05 06:43:43.047: D/fragmet(1829): onCreateView
<span style="color:#ff0000;">11-05 06:43:43.047: D/avtivity(1829): onCreate after fragment </span>
11-05 06:43:43.047: D/fragmet(1829): onActivityCreated
11-05 06:43:43.047: D/fragmet(1829): onCreateView
11-05 06:43:43.047: D/fragmet(1829): onActivityCreated
11-05 06:43:43.047: D/fragmet(1829): onCreateView
11-05 06:43:43.047: D/fragmet(1829): onActivityCreated
11-05 06:43:43.047: D/fragmet(1829): onCreateView
11-05 06:43:43.047: D/fragmet(1829): onActivityCreated
11-05 06:43:43.047: D/fragmet(1829): onAttach
11-05 06:43:43.047: D/fragmet(1829): onCreate
11-05 06:43:43.047: D/fragmet(1829): onCreateView
11-05 06:43:43.047: D/fragmet(1829): onActivityCreated
<span style="color:#ff0000;">11-05 06:43:43.047: D/avtivity(1829): onStart</span>
11-05 06:43:43.047: D/fragmet(1829): onStart
11-05 06:43:43.047: D/fragmet(1829): onStart
11-05 06:43:43.047: D/fragmet(1829): onStart
11-05 06:43:43.047: D/fragmet(1829): onStart
11-05 06:43:43.047: D/fragmet(1829): onStart
<span style="color:#ff0000;">11-05 06:43:43.047: D/avtivity(1829): onResume</span>
11-05 06:43:43.047: D/fragmet(1829): onResume
11-05 06:43:43.047: D/fragmet(1829): onResume
11-05 06:43:43.047: D/fragmet(1829): onResume
11-05 06:43:43.047: D/fragmet(1829): onResume
11-05 06:43:43.047: D/fragmet(1829): onResume
1.首先activity的create函数进行布局。
2.fragment的前三个函数(onAttach onCreate onCreateview )都再activity完全创建之前调用。
3.对于其他函数,启动相关的(onStart onResume)都是activity先执行,结束相关的(onPause onStop onDestroy)
都是fragment先执行。
4.第一次启动,back键后启动,翻转屏幕时,才会调用onCreate
5.onPause和onStop关系还有点糊涂
心得:
2014年11月5日:
fragment的添加方式有两种
第一种是直接在activity的布局xml种添加,然后在创建布局时,<fragment>的内容会被fragment.xml替代
第二种是通过代码进行创建,上面的代码是我理解错误造成的,一下造了两个fragment,一个是activity的xml
生成的,一个是代码创建的。