美文网首页Android开发
app的启动白屏解决

app的启动白屏解决

作者: licue | 来源:发表于2016-12-08 17:50 被阅读0次

在网上搜索了许多关于app启动白屏的文章大致分为两类

第一种是在style的app的theme 里设置

<item name="android:windowIsTranslucent">true</item> 

这种设置在点击桌面点击app时给人一种很迟钝的感觉 反正我不会用这种方式

第二种方法是在app的theme里设置

<item name="android:windowBackground">@mipmap/ic_launcher_bg</item> 

然后把这个theme设置给application

接下来修正一下网上的一问题

假设app 有 A->B->C这三个简单的层级 A是启动页(打开app的第一个activity)

1.有人说把这个theme设置给A界面的activity 如果这样设置 假如你的app 在B或者C界面 你把app切换到后台开几个站内存的app 让自己的app被回收后再切换回来 你会发现app会白屏或者黑屏一会(颜色取决于你的主题)

2.有人说吧这个theme设置给 application 如果这样设置会引起activity的背景错乱 如actionbar出现launch_bg这张图片和别的奇怪的问题 应为actionbar等系统控件也引用了默认的theme 所以会出现那些奇怪的图片

3.有人为了解决二中出现的问题说在activity的setcontenview前从新设置window的背景 至少我那样试没有成功 还说通过流的方式设置window来解决 图片不能释放的问题 我是真没找到这种方法(如果有人知道请告诉我下)

下说说我的解决办法吧

首先是APP的正常theme

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <!-- Customize your theme here. -->

        <item name="colorPrimary">@color/colorPrimary</item>

        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>

        <item name="colorAccent">@color/colorAccent</item>

    </style>

首次加载activity的theme

<style name="LauncherTheme" parent="@style/AppTheme">

        <item name="android:windowBackground">@mipmap/ic_launcher_bg</item>

        <item name="android:windowFullscreen">true</item>

    </style>

新建一个BaseActivity类

public class BaseActivity extends AppCompatActivity{

    public Context context;

    protected void onCreate(@Nullable Bundle savedInstanceState,int layoutResID) {

        setTheme(R.style.AppTheme);

        super.onCreate(savedInstanceState);

        setContentView(layoutResID);

        ButterKnife.bind(this);

        context = this;

    }

}

新建的Activity都继承至这个BaseActivity就行

<application

        android:name=".myapp.TApplication"

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:supportsRtl="true"

        android:theme="@style/LauncherTheme">

        <activity android:name=".view.LauncherActivity">

            <intent-filter>

                <action android:name="android.intent.action.MAIN"/>

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

            </intent-filter>

        </activity>

        <activity

            android:name=".view.MainActivity">

        </activity>

        <activity android:name=".view.PushCamreaActivity">

        </activity>

    </application>

下面来说说为什么会出现白屏的情况吧 (这是网上查找的说法)

当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果没有任何反应的话,如果程序初始化的时间很长,用户可能还以为没有点到相应的位置。但此时所启动的程序还没初始化完,既无法显示程序,又不能停在原处不做任何动作,怎么办?这就有了Starting Window的概念,也可以称之为Preview Window。

Starting Window就是一个用于在应用程序进程创建并初始化成功前显示的临时窗口,拥有的Window Type是TYPE_APPLICATION_STARTING。在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并做出了响应,当程序初始化完成后显示用户UI并移除这个窗口。

这个Starting Window我们都见过,不过可能没留意过,其实就是开启程序时黑屏的那个窗口,够丑的。不过也没办法,每个程序的界面都不是同的,系统只有默认显示一个很简单的窗口了。

如果所谓的Starting Window只是一个黑屏的窗口的话,那这个功能未免也太鸡肋了。其实系统是可以根据每个程序的Theme显示不同的样子的。

启动应用的时候,虽然我们的程序还没初始化,但程序内的组件可是在程序安装的时候就被系统分析注册了的。我们可以针对每个Application和Activity设置不同的Theme,系统就是根据这个Theme初始化Starting Window的。Window布局的顶层是DecorView,Starting Window就是显示一个空的但是应用了Activity指定的Theme(如果Activity没有指定就用Application的)的DecorView。

在Theme中可以指定很多东西,如ActionBar的样式,窗口的背景,Activity的图标等,通过给Activity指定Theme,系统就可以在我们的应用初始化完成之前将这个Theme应用到Starting Window,这样看起来就像我们的应用已经启动起来了,只是数据内容还没有初始化好。

所以,如果你的Activity的背景只是简单的纯色的话,最好直接通过Theme把它应用到Activity的Background,而不是设置为顶层Layout的背景,如果真的需要给顶层Layout设置背景,也可以给android:windowBackground设置一个和Activity UI相似的背景,为了防止Overdraw,在Activity的onCreate中通过setWindowBackground()再把窗口的背景设置为null。

系统在显示Activity前显示一个Starting Window仅发生在需要为启动这个Activity创建进程时,一般情况下是一个应用的入口Activity(包含Lanuncher中显示的图标进入的Activity及被其他应用调用的Activity)。

还有一种情况就是应用内有多个进程的情况(通过android:process),比如你的程序需要用单独的进程查看图片,当从你的应用的主进程进入图片浏览的Activity时,系统就会创建图片浏览的进程,如果图片浏览的Activity的需要使用的图标和Application指定的图标不一样的话就要注意了,系统显示图片进程中的Activity的Starting Window时不会使用这个Activity在Manifest中通过android:icon指定的图标,而只会使用Theme中指定的图标,如果没为这个Activity指定一个Theme或所指定的Theme中没有指定android:icon的话,系统会使用Application标签指定的android:icon,结果就是会看到Starting Window中显示一个图标,当Activity加载完后图标会变为Activity在Manifest中指定的android:icon,有一个变化的过程。

所以说 那个白屏是 系统创建了一个启动窗口 这里有一个连接说明启动窗口在什么情况下创建


相关文章

  • ionic2常见问题及解决方案

    ionic2常见问题及解决方案 一、app启动白屏的问题 ​ app启动后大概有几秒的白屏,才会显...

  • Android项目优化-冷启动优化

    APP启动优化主要解决app启动缓慢,白屏半天的问题。 app启动方式主要为:冷启动和热启动 冷启动:当进程关掉,...

  • Android性能优化-App启动优化

    一、App启动优化 问题如下:1、App启动白屏、或者黑屏2、App启动时间长 二、解决方法1 通常的解决办法都是...

  • Android 启动优化

    一、 启动白屏优化 解决启动白屏问题再启动app时展示一张静态图 ,实现方法是 给splash页面设置theme...

  • 解决启动app白屏

    原理就设置一个和启动页一样的背景

  • app的启动白屏解决

    在网上搜索了许多关于app启动白屏的文章大致分为两类 第一种是在style的app的theme 里设置 true ...

  • 一. Android 启动时间优化

    1)启动页白屏及黑屏解决?2)启动太慢怎么解决?3)怎么保证应用启动不卡顿?4)App启动崩溃异常捕捉5)统计启动...

  • android冷启动白屏问题

    今天把玩公司App发现了一个有趣的现象。启动app白屏。之前没太留意过;在参照大厂App解决白屏的方案后。简单汇总...

  • Android解决APP启动白屏

    目录 前言 当APP第一次启动会有一段时间的白屏,而当代码变多白屏的时间会更长,这对用户体验来说非常差,因此我们需...

  • Android屏幕适配之解决白屏启动的正确姿势

    文章目录 APP启动页的需求APP启动页的需求的尝试定义正确的Theme定义背景图解决白屏启动的正确姿势参考And...

网友评论

    本文标题:app的启动白屏解决

    本文链接:https://www.haomeiwen.com/subject/qwysmttx.html