无论您是准备面试还是要在应用程序中实现片段,您都应该了解片段的生命周期。
我们大多数人都非常了解android活动生命周期,但还不了解片段生命周期。
片段生命周期如何与活动生命周期相互作用? 添加片段与替换片段有什么区别?
我们将在下面查看所有这些问题。
Android片段生命周期
android中的片段生命周期主要由以下8种方法组成:
- onCreate :用于初始化非图形组件。
- onCreateView :用于扩大片段的xml布局。
- onStart
- onResume
- 暂停
- onStop
- onDestroyView
- onDestroy
这些构成了Android中的片段生命周期。 为了研究他们的通话顺序,我创建了一个示例项目。
创建一个示例应用
我们将以两种方式分析片段的生命周期。 首先通过动态添加片段,然后静态添加。
在Android Studio中创建一个新项目。 这将是一个基础项目,我们将在所有生命周期方法中添加基本日志语句。
在该项目中,添加一个名为LifecycleFragment的片段并覆盖生命周期方法。 如果尚未创建,请创建一个简单的布局xml。
class LifecycleFragment : Fragment() {
var LOG_TAG = "Androidville"
companion object {
@JvmStatic
fun newInstance() = LifecycleFragment()
}
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
Log.d(LOG_TAG, "LifecycleFragment: onCreate() called" )
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.d(LOG_TAG, "LifecycleFragment: onCreateView() called" )
return inflater.inflate(R.layout.fragment_lifecycle, container, false )
}
override fun onStart() {
Log.d(LOG_TAG, "LifecycleFragment: onStart() called" )
super .onStart()
}
override fun onResume() {
Log.d(LOG_TAG, "LifecycleFragment: onResume() called" )
super .onResume()
}
override fun onPause() {
Log.d(LOG_TAG, "LifecycleFragment: onPause() called" )
super .onPause()
}
override fun onStop() {
Log.d(LOG_TAG, "LifecycleFragment: onStop() called" )
super .onStop()
}
override fun onDestroy() {
Log.d(LOG_TAG, "LifecycleFragment: onDestroy() called" )
super .onDestroy()
}
override fun onDestroyView() {
Log.d(LOG_TAG, "LifecycleFragment: onDestroyView() called" )
super .onDestroyView()
}
}
您会注意到我在所有这些方法中都添加了log语句,这将有助于我识别调用顺序。
这是布局文件:
<?xml version= "1.0" encoding= "utf-8" ?>
<RelativeLayout xmlns:android= " http://schemas.android.com/apk/res/android "
xmlns:tools= " http://schemas.android.com/tools "
android:layout_width= "match_parent"
android:layout_height= "match_parent"
tools:context= ".LifecycleFragment" >
<TextView
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_centerInParent= "true"
android:text= "Hello from Fragment!" />
</RelativeLayout>
动态添加片段
以下是MainActivity.kt可以动态添加片段的代码:
MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
var TAG: String = "ANDROIDVILLE"
var LOG_TAG = "Androidville"
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(LOG_TAG, "MainActivity: onCreate() called" )
setupFragment()
}
private fun setupFragment() {
supportFragmentManager.beginTransaction()
.add(R.id.contentFrame, LifecycleFragment.newInstance(), TAG)
.commit()
}
override fun onRestart() {
Log.d(LOG_TAG, "MainActivity: onRestart() called" )
super .onRestart()
}
override fun onStart() {
Log.d(LOG_TAG, "MainActivity: onStart() called" )
super .onStart()
}
override fun onResume() {
Log.d(LOG_TAG, "MainActivity: onResume() called" )
super .onResume()
}
override fun onPause() {
Log.d(LOG_TAG, "MainActivity: onPause() called" )
super .onPause()
}
override fun onStop() {
Log.d(LOG_TAG, "MainActivity: onStop() called" )
super .onStop()
}
override fun onDestroy() {
Log.d(LOG_TAG, "MainActivity: onDestroy() called" )
super .onDestroy()
}
}
这是布局activity_main.xml :
<?xml version= "1.0" encoding= "utf-8" ?>
<RelativeLayout xmlns:android= " http://schemas.android.com/apk/res/android "
xmlns:app= " http://schemas.android.com/apk/res-auto "
xmlns:tools= " http://schemas.android.com/tools "
android:layout_width= "match_parent"
android:layout_height= "match_parent"
tools:context= ".MainActivity" >
<FrameLayout
android:id= "@+id/contentFrame"
android:layout_width= "match_parent"
android:layout_height= "wrap_content" />
</RelativeLayout>
静态添加片段
要静态添加片段,我们只需在activity_main.xml文件中添加<fragment>元素,并将其名称设置为kotlin类。布局:
<?xml version= "1.0" encoding= "utf-8" ?>
<RelativeLayout xmlns:android= " http://schemas.android.com/apk/res/android "
xmlns:tools= " http://schemas.android.com/tools "
android:layout_width= "match_parent"
android:layout_height= "match_parent"
tools:context= ".MainActivity" >
<fragment
android:id= "@+id/lifecycle_fragment"
android:name= "com.example.androidfragmentlifecycleexample.LifecycleFragment"
android:layout_width= "match_parent"
android:layout_height= "match_parent" />
</RelativeLayout>
MainActivity.kt文件:
MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
var TAG: String = "ANDROIDVILLE"
var LOG_TAG = "Androidville"
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(LOG_TAG, "MainActivity: onCreate() called" )
}
override fun onRestart() {
Log.d(LOG_TAG, "MainActivity: onRestart() called" )
super .onRestart()
}
override fun onStart() {
Log.d(LOG_TAG, "MainActivity: onStart() called" )
super .onStart()
}
override fun onResume() {
Log.d(LOG_TAG, "MainActivity: onResume() called" )
super .onResume()
}
override fun onPause() {
Log.d(LOG_TAG, "MainActivity: onPause() called" )
super .onPause()
}
override fun onStop() {
Log.d(LOG_TAG, "MainActivity: onStop() called" )
super .onStop()
}
override fun onDestroy() {
Log.d(LOG_TAG, "MainActivity: onDestroy() called" )
super .onDestroy()
}
}
Android Fragment Lifecycle回调序列
最后,让我们看看运行应用程序时片段中的生命周期回调序列是什么。
动态添加
当我们动态添加片段时,将发生以下回调序列。
您可以在此处看到该活动已创建。 首先调用Activity的onCreate,onStart 。
然后调用片段的onCreate,onCreateView和onStart。 最后,分别调用Activity和Fragment的onResume。
退出应用程序时:
在这里,活动先被破坏,然后是片段。 因此,活动的onPause,onStop和onDestroy分别在片段之前被首先调用。
静态添加
当我看到这个生命周期回调序列时,我也感到惊讶。 将片段静态添加到活动中后,便会急切创建片段。
退出应用程序时:
与静态加法相同。 活动首先被破坏,然后被破坏。
添加或替换片段
顾名思义,当您添加一个片段时,它会被添加到容器中已有片段的顶部。 但是,如果您调用replace,则容器中的片段将被新片段替换。
这意味着,如果您尝试在活动中按TAG检索片段,则替换片段而不是添加片段就不会找到它。
翻译自: https://www.javacodegeeks.com/2020/09/android-fragment-lifecycle-explained.html