Android Fragment实践(二) - Fragment的生命周期
一,Fragment简介:
Fragment,即碎片、片段。是google在Android 3.0系统中引入的概念,它和Activity的功能差不多,Fragment可以让AndroidUI变得更加灵活。Fragment有自己的生命周期,它需要由Actitity来承载,即Fragment的生命周期由Activity来管理。
二,Fragment的生命周期:
Activity有自己的生命周期,Fragment也有自己的生命周期,而且,Fragment的生命周期由Activity来管理。
Fragment的生命周期如下图所示:
其中,fragment是添加在Activity中的。
Fragment的生命代码演示:
TopFragment.java:
package com.test.mydemofrag1.ui;import android.app.Fragment;import android.content.Context;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import com.test.mydemofrag1.MainActivity;import com.test.mydemofrag1.R;public class TopFragment extends Fragment { private static final String TAG = "TopFragment"; private View convertView; private TextView mTextview; private Button mButton; @Override public void onAttach(Context context) { super.onAttach(context); Log.i(TAG, "onAttach==========="); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate==========="); } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i(TAG, "onCreateView==========="); if (convertView == null) { convertView = inflater.inflate(R.layout.fragment_top, container, false); initView(); initClient(); } return convertView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { Log.i(TAG, "onActivityCreated==========="); super.onActivityCreated(savedInstanceState); MainActivity activity = (MainActivity) getActivity(); activity.putFragment(this); } @Override public void onResume() { super.onResume(); Log.i(TAG, "onResume==========="); } @Override public void onPause() { super.onPause(); Log.i(TAG, "onPause==========="); } @Override public void onStop() { super.onStop(); Log.i(TAG, "onStop==========="); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy==========="); } @Override public void onDestroyView() { super.onDestroyView(); Log.i(TAG, "onDestroyView==========="); } @Override public void onDetach() { super.onDetach(); Log.i(TAG, "onDetach==========="); } @Override public void onStart() { super.onStart(); Log.i(TAG, "onStart==========="); } private void initView() { mTextview = convertView.findViewById(R.id.text_top); mButton = convertView.findViewById(R.id.button_top); Log.i(TAG, "[initView]===" + mTextview.getText()); } public void updateView(String data) { mTextview.setText(data); } private void initClient() { mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity activity = (MainActivity) getActivity(); BottomFragment bottomFragment =(BottomFragment) activity.getFragment(1);// BottomFragment bottomFragment = (BottomFragment) FragmentFactory.getFragment((MainActivity) getActivity(),"BottomFragment"); bottomFragment.updateView("被topFragment更新"); } }); }}
MainActivity:
package com.test.mydemofrag1;import android.app.Activity;import android.os.Bundle;import android.app.Fragment;import android.util.Log;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "[onCreate]======="); setContentView(R.layout.activity_main); } @Override public void onAttachFragment(Fragment fragment) { super.onAttachFragment(fragment); Log.i(TAG, "onAttachFragment=====" + fragment); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume====="); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause====="); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart====="); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart====="); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop====="); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy====="); }}
运行结果(生命周期演示):
com.test.mydemofrag1 I/MainActivity: [onCreate]=======
com.test.mydemofrag1 W/ResourceType: Attempt to retrieve bag 0x7f0f01cd which is invalid or in a cycle.
com.test.mydemofrag1 I/TopFragment: onAttach===========
com.test.mydemofrag1 I/MainActivity: onAttachFragment=====TopFragment{aaa19a0 #0 id=0x7f080161}
com.test.mydemofrag1 I/TopFragment: onCreate===========
com.test.mydemofrag1 I/TopFragment: onCreateView===========
com.test.mydemofrag1 I/TopFragment: [initView]===top
com.test.mydemofrag1 I/TopFragment: onActivityCreated===========
com.test.mydemofrag1 I/MainActivity: onStart=====
com.test.mydemofrag1 I/TopFragment: onStart===========
com.test.mydemofrag1 I/MainActivity: onResume=====
com.test.mydemofrag1 I/TopFragment: onResume===========
退出时的运行结果(生命周期演示):
com.test.mydemofrag1 I/TopFragment: onStop===========
com.test.mydemofrag1 I/MainActivity: onStop=====
com.test.mydemofrag1 I/TopFragment: onDestroyView===========
com.test.mydemofrag1 I/TopFragment: onDestroy===========
com.test.mydemofrag1 I/TopFragment: onDetach===========
com.test.mydemofrag1 I/MainActivity: onDestroy=====
Fragment生命周期说明:
其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:
onCreate
系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。
onCreateView
用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。
onPause
当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。
自从引入Fragment后,由于其扩展性,灵活性,易用性的特点,这个组件几乎风靡AndroidApp中。