为什么很多 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
,并添加 MAIN
和 LAUNCHER
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();
}
}
我想就是这样!
例如,当您打开 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
,并添加 MAIN
和 LAUNCHER
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();
}
}
我想就是这样!