【问题标题】:Fragment.onstart is being called before Activity.onstartFragment.onstart 在 Activity.onstart 之前被调用
【发布时间】:2016-10-24 00:28:50
【问题描述】:
MMuzammil: MainActivity:in onCreate
MMuzammil: FirstFragment:in onAttach
MMuzammil: FirstFragment:in onCreate
MMuzammil: FirstFragment:in onCreateView
MMuzammil: FirstFragment:in onActivityCreated
MMuzammil: FirstFragment:in onStart <----
MMuzammil: MainActivity:in onStart <----
MMuzammil: MainActivity:in onResume
MMuzammil: FirstFragment:in onResume

我们可以看到我的 Fragment.onStart 在 Activity.onStart 之前被调用。任何人都知道这种行为的原因是什么?因为当Activity移动到前台时,Activity的回调方法应该总是先调用

活动:

public class MainActivity extends AppCompatActivity {

public static final String TAG = "MMuzammil";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "MainActivity:in onCreate");
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FirstFragment()).commit();
}

@Override
protected void onStart() {
    super.onStart();
    Log.d(TAG, "MainActivity:in onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.d(TAG, "MainActivity:in onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.d(TAG, "MainActivity:in onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.d(TAG, "MainActivity:in onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "MainActivity:in onDestroy");
}

@Override
protected void onRestart() {
    super.onRestart();
    Log.d(TAG, "MainActivity:in onRestart");
}
}

【问题讨论】:

  • 显示更多代码。打印日志的代码
  • @VladMatvienko 请立即查看

标签: android android-fragments fragment android-fragmentactivity android-lifecycle


【解决方案1】:

这只是因为,您正在调用 super.onStart(),然后在您的活动中打印日志。所以基本上你的活动的 onStart() 是首先运行的。

我猜:)

【讨论】:

  • 我也在 Activity 中调用 super.onResume() 。为什么我的活动的 onResume() 日志会先运行?
  • 有些时间日志的方式不一样。而且它也有所不同,因为系统(手机操作系统)可能在 Activity 的 onResume 和 Fragment 的 onResume 之间做更多的工作。它会因手机、操作系统和操作系统而异,但顺序将保持不变,这是毫无疑问的。
【解决方案2】:

这是正常行为。如果你需要在开始之前在片段中做一些事情,最好重写并使用 onAttach(Context context) 方法。

【讨论】:

  • 没有意义。为什么在 onStart 之前调用的 onCreate 或在 onStart 之后调用的 onResume 不是这种情况?
【解决方案3】:

我也有同样的问题。 我将此添加到我的Fragment.onStart()

override fun onStart() {
    super.onStart()
    launch {
        requireActivity().lifecycle.withStarted {
            // do work
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多