Android中MVP设计模式在无特殊行为闪屏页的应用建议
Great question! This is a common dilemma when applying MVP to simple screens like splash pages—let’s break it down based on your actual needs:
1. If Your Splash Screen Has No Business Logic (Pure Display)
Skip MVP entirely. There’s no need to overengineer a screen that only serves as a visual transition (e.g., showing a logo for 2 seconds before navigating to the main screen).
MVP’s core value is separating UI (View) from business logic (Presenter). When there’s no logic to separate, adding MVP layers just creates unnecessary boilerplate code and increases maintenance overhead.
Example: Simple Splash Screen Implementation
class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) // Delay navigation after 2 seconds Handler(Looper.getMainLooper()).postDelayed({ startActivity(Intent(this, MainActivity::class.java)) finish() }, 2000) } }
For Android 12+, you can even use the official SplashScreen API for a more system-compliant, low-code implementation.
2. If Your Splash Screen Has Light Business Logic
If your splash screen needs to handle tasks like:
- Initializing third-party SDKs (e.g., analytics, crash reporting)
- Checking for app updates
- Loading local user preferences or configs
Then a simplified MVP (or even a ViewModel-based approach) makes sense. The goal here is to keep UI code clean by moving logic out of the Activity.
Example: Simplified MVP for a Logic-Enabled Splash Screen
// Presenter: Handles business logic class SplashPresenter(private val view: SplashView) { fun performAppInitialization() { // Simulate SDK initialization or update check initAnalyticsSDK() checkForUpdates() // Notify view when done view.onInitializationComplete() } private fun initAnalyticsSDK() { // Your SDK init code here } private fun checkForUpdates() { // Your update check logic here } } // View Interface: Defines UI actions the Presenter can trigger interface SplashView { fun onInitializationComplete() } // Activity: Implements View, handles UI only class SplashActivity : AppCompatActivity(), SplashView { private lateinit var presenter: SplashPresenter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) presenter = SplashPresenter(this) presenter.performAppInitialization() } override fun onInitializationComplete() { startActivity(Intent(this, MainActivity::class.java)) finish() } }
Key Takeaway
Don’t force MVP onto every screen just to follow a pattern. Architecture should serve your code, not the other way around:
- Use a plain Activity for pure display splash screens.
- Use simplified MVP/ViewModel only when there’s logic worth separating.
内容的提问来源于stack exchange,提问作者MinYoung Lee

