ManActivity + 启动时的片段差异

Posted

技术标签:

【中文标题】ManActivity + 启动时的片段差异【英文标题】:ManActivity + fragment difference at launch 【发布时间】:2021-07-29 14:58:29 【问题描述】:

我正在构建一个 android 应用,其功能模块与我的 app 应用程序模块处于同一级别,为了获得灵感,我正在查看一些在线存储库。

复制其中一个,我注意到我的应用启动的生命周期略有不同。 我们都有一个只有MainActivity 的清单,我们都有一个由BottomNavigationView 和一个fragment 字段组成的MainActivity 布局,其中包含一个引用相同navGraph 的NavHostFragment。 然后我们都在导航 xml 文件中引用了片段 (StartFragment),其布局包含一个简单的文本字段。

所有基本上看起来都一样,但在我的情况下,StartFragment 会在活动到达setContentView 时通过其onViewCreated,而在项目中,当活动完成其@时,我会从中获得灵感987654330@

我正在比较 StartFragment.onViewCreated 上转储的两个堆栈跟踪,它们看起来不同,但我不知道是什么原因造成的。

MY STACKTRACE

java.lang.Throwable: stack dump
 at java.lang.Thread.dumpStack(Thread.java:490)
 at com.mypetproject.StartFragment.onViewCreated(StartFragment.kt:19)
 at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
 at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
 at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
 at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
 at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3126)
 at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3063)
 at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
 at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392)
 at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:281)
 at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:140)
 at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
 at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:319)
 at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:298)
 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
 at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
 at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
 at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
 at com.mypetproject.MainActivity.onCreate(MainActivity.kt:18)
 at android.app.Activity.performCreate(Activity.java:5937)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
 at android.app.ActivityThread.access$800(ActivityThread.java:144)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:135)
 at android.app.ActivityThread.main(ActivityThread.java:5221)
 at java.lang.reflect.Method.invoke(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:372)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

OTHER PROJECT STACKTRACE

java.lang.Throwable: stack dump
 at java.lang.Thread.dumpStack(Thread.java:490)
 at bg.dihanov.commonui.StartFragment.onViewCreated(StartFragment.kt:19)
 at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:332)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
 at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
 at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
 at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
 at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
 at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1188)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
 at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
 at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
 at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
 at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
 at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
 at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
 at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
 at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
 at android.app.Activity.performStart(Activity.java:5953)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
 at android.app.ActivityThread.access$800(ActivityThread.java:144)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:135)
 at android.app.ActivityThread.main(ActivityThread.java:5221)
 at java.lang.reflect.Method.invoke(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:372)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

附:这两个应用程序都是在运行 Android 21 的模拟器上启动的,并且两个项目的依赖项、插件、gradle 包装器等具有相同的版本。

【问题讨论】:

【参考方案1】:

在花费数小时调查此问题后,我发现这是由于我的项目中存在依赖项,而我从中获得灵感的项目中不存在该依赖项。

implementation 'androidx.fragment:fragment-ktx:1.3.3'

所以要小心,因为显然这种额外的依赖会修改 Activity/Fragment 对的生命周期/行为

【讨论】:

以上是关于ManActivity + 启动时的片段差异的主要内容,如果未能解决你的问题,请参考以下文章

将捆绑数据传递到以viewPager开头的片段

从后台堆栈恢复片段时的 savedInstanceState

ACT宣布启动针对10年级学生的PreACT考试!

使用导航抽屉旋转时的片段更改

activiti 表——介绍

官方模考?!ACT宣布启动PreACT考试