【问题标题】:What gets called before oncreate()在 oncreate() 之前调用了什么
【发布时间】:2020-12-11 16:15:52
【问题描述】:

我有以下代码,想知道在onCreate() 之前调用了什么,因为它在调用活动(选项卡式活动)之前显示空白屏幕。有什么办法可以避免出现黑屏?

我什至不能使用 onAttach,因为我的类正在扩展 AppCompatActivity 并实现 OnMapReadyCallback,PlaceSelectionListener

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_tabbed);
  TabHost tab = (TabHost) findViewById(R.id.tabHost);
  tab.setup();

  TabHost.TabSpec spec1 = tab.newTabSpec("Search");
  spec1.setIndicator("Search");
  spec1.setContent(R.id.layout1);
  tab.addTab(spec1);

  TabHost.TabSpec spec2 = tab.newTabSpec("Settings");
  spec2.setIndicator("Settings");
  spec2.setContent(R.id.layout2);
  tab.addTab(spec2);

  SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
  mapFragment.getMapAsync(this);
  locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  provider = locationManager.getBestProvider(new Criteria(), false);

  if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
  }
}

【问题讨论】:

  • 如果片段 onAttach()onCreate() 之前被调用。 refer this
  • 我的班级正在扩展 AppCompatActivity 并实现 OnMapReadyCallback、PlaceSelectionListener。所以我不能使用 OnAttach()
  • 可能是Application类?
  • 在调用任何 Manifest.xml 之前
  • 那么这可能是由于您的应用程序实例的实例化。为避免这种情况,请尝试在其他线程中进行更繁重的工作。

标签: java android android-studio


【解决方案1】:

如果创建了活动,则调用以下函数:

onCreate()

onStart()   

onResume()

onPause()

onStop()

onDestroy()

onRestart()

当在活动中制作片段时:

onAttach()

onCreate() 

onCreateView() 

onActivityCreated()

 onCreateView() 

onStart()

onResume()

onPause() 

onStop()

onDestroyView()

onDestroy()

【讨论】:

    【解决方案2】:

    为避免出现空白屏幕,您可以使用以下代码。有效!!

    <style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
    and use it with your activity in AndroidManifest as:
    
    <activity android:name=".ActivitySplash" android:theme="@style/Theme.Transparent">
    

    【讨论】:

      【解决方案3】:

      要调查加载缓慢和白屏,您应该使用 Android 的 TraceView 功能:MethodTracing

      如果您的项目中有一个扩展Application 的类,则在其onCreate 方法中添加Debug.startMethodTracing() 作为第一行,如果您没有Application 类,请将此行添加为第一行你的ActivityonCreate

      稍后,在您的活动的 onResume 中,或者如果您愿意,您可以在以后调用 Debug.stopMethodTracing() 停止跟踪。

      您可以查看在 Studio 中创建的 Trace 文件,以了解哪些方法耗时以及原因。

      在此处查看文档: https://developer.android.com/studio/profile/traceview.html

      Android 的其他分析工具: https://developer.android.com/studio/profile/android-monitor.html#monitors

      【讨论】:

        【解决方案4】:

        Activity 中,attachBaseContextonCreate 之前被调用。您可以创建一个Log 来测试它。

        AppCompatActivity阅读更多内容。

        或者你可以看到所有方法都按AppCompatActivity.java中的顺序调用

        【讨论】:

          【解决方案5】:

          在onCreate之前没有调用activity,看下图

          但是在创建任何活动之前,都会实例化一个应用程序实例:

          https://developer.android.com/reference/android/app/Application.html

          【讨论】:

            【解决方案6】:

            正如ΦXocę 웃 Пepeúpa ツ 所说,在onCreate() 之前没有调用任何方法。可以看下图取自Complete Android Fragment & Activity Lifecycle

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-15
              • 1970-01-01
              • 2012-12-15
              • 2011-10-12
              相关资源
              最近更新 更多