为什么很多 Android 应用程序中的闪屏在点击后退按钮时没有关闭?

Why the flash screen in many Android apps is not closed when the back button is clicked?

例如,当您打开 WhatsApp 时,在应用程序启动期间,启动画面 activity 会出现在屏幕上。如果用户改变主意并希望关闭该应用程序,则该应用程序不会关闭!他必须等到应用程序启动并且飞溅 activity 消失……这几乎是我使用过的所有 Google 的 Android 应用程序的情况……如何实现这种行为?

因为他们覆盖了 onBackPressed() 方法(在启动画面中 activity)

override fun onBackPressed() {
        //super.onBackPressed()
}

并评论 super.onBackPressed()

你可以在那里添加逻辑条件来决定 wheatear 是否返回

    override fun onBackPressed() {
        if(condtion is true)
            super.onBackPressed()
        else
           Log.e("","process pending")
    }

如果您的 MainActivity 需要 3 秒来加载启动 SplachScreenActivity.class 并在计时器到期后使用线程或计时器将其阻塞 3 秒调用 finish() 方法,这将返回到 MainActivity,您会发现 MainActivty 就绪

他们在耍花招。启动画面实际上只是虚拟 activity 上的一个主题,它允许他们在系统仍在创建应用程序时呈现静态背景可绘制。这意味着您实际上不能有任何逻辑 运行,也不能在初始屏幕上创建任何视图,它只是一个静态图像。

res/values/themes.xml

我相信 android:windowBackground 是启动画面可接受的唯一属性。

<resources>

  <style name="AppTheme_Splash" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_screen</item>
  </style>

</resources>

res/drawable/splash_screen.xml

在我的示例中,我在初始屏幕上显示了两个 .png 图像。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

  <item>
    <shape android:shape="rectangle">
      <solid android:color="@color/splash_screen_background" />
    </shape>
  </item>

  <item>
    <bitmap
        android:antialias="true"
        android:gravity="center"
        android:src="@drawable/splash_logo"
        android:tileMode="disabled" />
  </item>

  <item>
    <bitmap
        android:antialias="true"
        android:gravity="bottom|center_horizontal"
        android:src="@drawable/splash_logo_title"
        android:tileMode="disabled" />
  </item>

</layer-list>

AndroidManifest.xml

应用主题 @style/AppTheme_Splash,并添加 MAINLAUNCHER intent-filters。

<manifest>
  <application
      android:name=".BaseApplication"
      android:icon="@drawable/app_icon"
      android:label="@string/launcher_name"
      android:theme="@style/AppTheme_Light">

    <activity
        android:name=".ui.SplashActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme_Splash">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

    <activity
        android:name=".ui.HomeActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask" />

  </application>
</manifest>

SplashActivity.java

onCreate方法将在应用程序完全加载后执行。直到那时才执行任何逻辑,activity 的视图也不会在应用程序加载后呈现。

public class SplashActivity extends AppCompatActivity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent homeIntent = new Intent(this, HomeActivity.class);
    startActivity(homeIntent);
    finish();
  }
}

我想就是这样!