Fragment.onstart 在 Activity.onstart 之前被调用

Posted

技术标签:

【中文标题】Fragment.onstart 在 Activity.onstart 之前被调用【英文标题】:Fragment.onstart is being called before 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 请立即查看 【参考方案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
        
    

【讨论】:

以上是关于Fragment.onstart 在 Activity.onstart 之前被调用的主要内容,如果未能解决你的问题,请参考以下文章

Activiti 流程部署方式 activi 动态部署(高级源代码篇)

android logcat中不显示log.d我的程序代码中包含Log.d(TAG,"activi

Ambiguous method call. Both findViewById (int) in AppCompatActivity and findViewById (int) in Activi

Andoid内存泄露

尝试呈现 UIActivityViewController 时崩溃

android内存泄漏