Android12 新启动页到底该怎么做

一、启动页用在哪里?

  • 问题:启动页是不是直接在 MainActivity 用?
  • 答案:是的,入口 Activity(一般是 MainActivity)就行。
  • 说明
    • 不用也不建议单独建 SplashActivity
    • 系统会在 Activity 创建前自动显示启动页
    • Activity 本身不用管启动页 UI

二、Android 12 的启动页和以前有什么不同?

  • 问题:Android 12 启动页有什么变化?
  • 答案:由系统统一绘制,不再靠 App 自己写。
  • 说明
    • 可以消除白屏或黑屏
    • 启动体验更统一、更稳定
    • 不允许插广告或网络 Loading
    • 审核更容易通过

三、PNG 能不能作为启动 Logo?

  • 问题:Logo 是 PNG 可以吗?
  • 答案:可以,官方支持 PNG。
  • 说明
    • 必须正方形
    • 背景透明
    • 内容居中并留白
    • 不建议直接用 Launcher Icon

四、官方推荐的启动 Logo 怎么样?

  • 问题:官方 Logo 长啥样?

  • 答案:简单的图标,不要文字,透明背景,居中显示

  • 说明:启动页只是告诉用户“App 正在启动”,不是用来宣传品牌

  • 问题:和我的品牌 Logo 有关系吗?

  • 答案:有关系,但不用完全一样

  • 说明

    • 可以只用品牌 Logo 的图形部分
    • 工具类 App 可以用抽象符号
    • 启动页 Logo ≠ 品牌 Logo

五、240dp / 160dp 是啥?是不是多层图片?

  • 问题:示意图看不懂,好像是几层一样
  • 答案:不是多层图片,也不用切多张图
  • 说明
    • 系统内部裁剪/缩放安全区的说明
    • 开发者只需要提供一张图片就够

六、Logo 的显示大小有没有要求?

  • 问题:一张大图片和一张小图片,显示效果一样吗?
  • 答案:基本一样
  • 说明
    • 系统会统一缩放到固定 dp
    • 像素大小不影响最终显示尺寸

七、为什么有的 Logo 看起来大,有的看起来小?

  • 答案:主要看图片内部内容占比
  • 说明
    • 内容占画布 80% → 看起来偏大
    • 内容占画布 50% → 看起来适中
    • 和分辨率没关系

八、是否有最大显示限制?

  • 问题:Logo 最大能显示多大?
  • 答案:有上限,系统限制,不能突破
  • 说明
    • 系统有固定显示盒子
    • 图片再大也会缩放进盒子
    • 不能通过代码或更大图片突破

九、能不能让 Logo 显示更大?

  • 答案:不能
  • 说明
    • 图片变大没用
    • 动画也没用
    • 代码控制也不行
    • 这是系统设计的规则

十、官方隐含的设计原则

  • 启动页越简单越好
  • 不承载任何信息
  • 不强化品牌
  • 不拖慢启动
  • 不引导用户操作

十一、一句话总结

  • 系统负责绘制启动页
  • 显示大小由系统决定
  • 只要保证 Logo 简单、居中、有留白
  • 简单就是正确

十二、最佳实践

12.1 添加依赖

implementation "androidx.core:core-splashscreen:1.0.1"

12.2 准备 Logo 图片

  • PNG / VectorDrawable 格式
  • 尺寸建议 512×512
  • 背景透明
  • 内容居中,留白约 33%
  • 内容占比 50%~66%,避免被裁剪

12.3 配置 Theme

<style name="Theme.App.Splash" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">#FFFFFF</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_logo</item>
    <item name="postSplashScreenTheme">@style/Theme.App</item>
</style>

12.4 在 Manifest 中绑定 Theme

<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.App.Splash"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

12.5、MainActivity 初始化代码(含隐私协议 & SDK 初始化)

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        // 安装 Splash Screen(必须在 super.onCreate 之前)
        installSplashScreen()
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 检查用户是否已经同意隐私协议
        val prefs = getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
        val isAgreed = prefs.getBoolean("isAgreedPrivacy", false)

        if (!isAgreed) {
            // 用户没同意,弹出隐私协议
            showPrivacyDialog(prefs)
        } else {
            // 用户已同意,初始化 SDK
            initSdk()
        }
    }

    // 弹出隐私协议 & 服务协议
    private fun showPrivacyDialog(prefs: SharedPreferences) {
        AlertDialog.Builder(this)
            .setTitle("隐私协议 & 服务协议")
            .setMessage("请先阅读并同意隐私协议和服务协议才能使用 App。")
            .setCancelable(false)
            .setPositiveButton("同意") { dialog, _ ->
                // 用户同意,保存标记
                prefs.edit().putBoolean("isAgreedPrivacy", true).apply()
                dialog.dismiss()
                // 同意后初始化 SDK
                initSdk()
            }
            .setNegativeButton("拒绝") { dialog, _ ->
                // 用户拒绝,直接退出 App
                dialog.dismiss()
                finish()
            }
            .show()
    }

    // SDK 初始化
    private fun initSdk() {
        // 在这里初始化所有第三方 SDK
        SomeSDK.init(this, "API_KEY")
    }
}

13.6 可选调试:保持 Splash 显示

installSplashScreen().setKeepOnScreenCondition { true }

仅用于调试,正式版本必须移除

13.7 注意事项

  • 不延长 Splash 显示时间
  • 不插入广告或网络 Loading
  • 保证 Logo 内容在安全区域内(内容占比 50%~66%)
  • 四周留白,避免被裁剪
  • 背景色通过 Theme 控制,不要在图片里加背景
  • SDK 必须在用户同意隐私协议后初始化,否则存在合规风险
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值