安卓SplashActivity闪屏页面开发 kotlin

1,988 阅读2分钟

项目背景:近日在项目组代码review中,了解了一个小细节,就是SplashActivity页面我们通常都是使用一个hander.postDelayed,3秒后执行runnable,有没有考虑一下,当进入闪屏页面,按下home键的操作呢?实验发现在某些机型下,当我们进入闪屏页面,按下home健,手机进入到home页面进行其他操作,但是过了一会儿,我们的程序会被拉起进入主页面,这样会使用户的体验不太好。好了废话有点多,下面上代码解决一下这个问题。

xml中的代码就不写了,就是给父布局设置一个背景图就ok了

SplashActivity

class SplashActivity : AppCompatActivity() {
    companion object {
        private const val TAG = "SplashActivity"
    }
    private  val  handler:Handler=Handler()
    private lateinit var  runnable: Runnable
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        runnable= Runnable {
            val intent=Intent(this,MainActivity::class.java)
            startActivity(intent)
            finish()
        }
    }

    override fun onPause() {
        super.onPause()
        Log.d(TAG, "onPause: ")
        handler.removeCallbacks(runnable)//handler移除线程

    }

    override fun onResume() {
        super.onResume()
        Log.d(TAG, "onResume: ")
        handler.postDelayed(runnable,3000)
    }
    
}

这里我需要在啰嗦一下,程序启动会执行activity生命周期,onCreate()->onResume()方法,当按下home键回到主界面,activity执行onPause(),当我们再次进入程序再次会执行onResume()。 程序启动我们在onResume方法中执行 handler.postDelayed(runnable,3000)这个延时执行的任务,我们不进行操作,程序就会理所当然的等待3秒钟进入主页面了,这里我们当我们进入SplashActivity时迅速按下home键(不要超过延时执行的时间,代码中也就是3秒)程序执行onPause()方法,这里我们使用handler.removeCallbacks(runnable)就会删除回调,所以就不会在执行runable里面的代码,也就不会出现程序又被拉起进入MianActivity了 SplashActivity通常都是全屏显示的我们需要给SplashActivity添加一个Theme

	<style name="Fullscreen" parent="Theme.WeatherMvvm">
        <item name="android:windowFullscreen">true</item>
    </style>

在AndroidManifest.xml中设置一下Theme

<activity android:name=".SplashActivity"
            android:theme="@style/Fullscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>