Android 启动APP时黑屏白屏的三个解决方案

你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下。这里先了解一下为什么会出现这样的现象,其实很简单,简历一个简单的例子就可以理解了。

其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景。代码如下,可以自己写个小demo就理解了。

1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void onCreate(Bundle savedInstanceState) {
     super .onCreate(savedInstanceState);
     // 注意:添加3秒睡眠,以确保黑屏一会儿的效果明显,在项目应用要去掉这3秒睡眠
     try {
         Thread.sleep( 3000 );
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
     // 在这里之前,黑屏或者白屏都是window的背景颜色,是窗口背景,还没到界面的布局呢,要执行setContentView后才显示布局
     setContentView(R.layout.activity_launcher);
}

那window窗口背景在那里提供呢?在提供theme里面,如下提供的是白色背景,那就是启动时白屏一会儿的颜色设置。

1
2
3
4
5
6
<!-- Application theme. -->
<style name= "AppTheme" parent= "AppBaseTheme" >
     <item name= "android:windowNoTitle" > true </item>
     <item name= "android:windowBackground" > @color /white</item>
     <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

所以,在theme设置windowBackground就可以解决启动时白屏黑屏一会儿了,下面提供三种解决方案:

一、提供.png背景图

提供背景图是解决的一个方法,但是要适配各种屏幕,提供很多张图片。除非图片非常复杂只能用背景图了就用这种方法吧,否则个人不建议。

二、提供.9.png(NinePatch)背景图片

如果图片不是很复杂,可以做成NinePatch图片,那就直接制作NinePatch图片,提供一张就可以适配任何手机,何乐而不为呢。

三、使用Layout-list制作背景图片

如果可以使用这种方式,推荐使用这种Layout-list制作背景图片。前2种都是使用图片占用内存啊,使用Layout-list比较省内存,做出app也不会说因为图片多体积变大吧。

 下面给出代码。

LaunchActivity为启动界面停留3秒后跳转到主页面MainActivity,为了达到显示黑屏白屏的效果更明显,在setContentView之前线程睡眠3秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class LauncherActivity extends Activity {
     public final int MSG_FINISH_LAUNCHERACTIVITY = 500 ;
     
     public Handler mHandler = new Handler(){
         public void handleMessage(Message msg) {
             switch (msg.what) {
             case MSG_FINISH_LAUNCHERACTIVITY:
                 //跳转到MainActivity,并结束当前的LauncherActivity
                 Intent intent = new Intent(LauncherActivity. this , MainActivity. class );
                 startActivity(intent);
                 finish();
                 break ;
 
             default :
                 break ;
             }
         };
     };
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         // 不显示系统的标题栏,保证windowBackground和界面activity_main的大小一样,显示在屏幕不会有错位(去掉这一行试试就知道效果了)
         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
         
         // 注意:添加3秒睡眠,以确保黑屏一会儿的效果明显,在项目应用要去掉这3秒睡眠
         try {
             Thread.sleep( 3000 );
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         
         setContentView(R.layout.activity_launcher);
         
         // 停留3秒后发送消息,跳转到MainActivity
         mHandler.sendEmptyMessageDelayed(MSG_FINISH_LAUNCHERACTIVITY, 3000 );
     }
 
}

activity_launcher.xml布局文件,很简单,要记住这里的LinearLayout使用的背景是layout_list_start_pic,跟主题theme使用一样的背景,这样就消除了背景不一样的效果。这里要自己试试才知道这样做的好处和效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     xmlns:tools= "http://schemas.android.com/tools"
     android:layout_width= "fill_parent"
     android:layout_height= "fill_parent"
     android:background= "@drawable/layout_list_start_pic" >
 
     <TextView
         android:layout_width= "wrap_content"
         android:layout_height= "wrap_content"
         android:textColor= "#ffffff"
         android:text= "@string/hello_world" />
 
</LinearLayout>

AndroidManifest.xml,这里注意application使用的theme是AppTheme,而 LauncherActivity使用的主题是StartAppTheme。这样做的效果是只要LauncherActivity使用 StartAppTheme主题,其他Activity都是用AppTheme主题哦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version= "1.0" encoding= "utf-8" ?>
<manifest xmlns:android= "http://schemas.android.com/apk/res/android"
     package = "com.example.launcheractivity"
     android:versionCode= "1"
     android:versionName= "1.0" >
 
     <uses-sdk
         android:minSdkVersion= "8"
         android:targetSdkVersion= "18" />
 
     <application
         android:allowBackup= "true"
         android:icon= "@drawable/ic_launcher"
         android:label= "@string/app_name"
         android:theme= "@style/AppTheme" >
         <activity
             android:name= ".LauncherActivity"
             android:label= "@string/app_name"
             android:theme= "@style/StartAppTheme" >
             <intent-filter>
                 <action android:name= "android.intent.action.MAIN" />
 
                 <category android:name= "android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
         
         <activity android:name= ".MainActivity" ></activity>
     </application>
 
</manifest>

styles.xml,2个主题设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<resources xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <!--
         Base application theme, dependent on API level. This theme is replaced
         by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
     -->
     <style name= "AppBaseTheme" parent= "android:Theme.Light.NoTitleBar" >
         <!--
             Theme customizations available in newer API levels can go in
             res/values-vXX/styles.xml, while customizations related to
             backward-compatibility can go here.
         -->
     </style>
 
     <!-- Application theme. -->
     <style name= "AppTheme" parent= "AppBaseTheme" >
         <item name= "android:windowNoTitle" > true </item>
         <item name= "android:windowBackground" > @color /white</item>
         <!-- All customizations that are NOT specific to a particular API-level can go here. -->
     </style>
     <style name= "StartAppTheme" parent= "AppBaseTheme" >
         <item name= "android:windowNoTitle" > true </item>
         <item name= "android:windowBackground" > @drawable /layout_list_start_pic</item>
         <!-- All customizations that are NOT specific to a particular API-level can go here. -->
     </style>
</resources>

layout_list_start_pic.xml 启动页面使用这个作为背景图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version= "1.0" encoding= "utf-8" ?>
<layer-list xmlns:android= "http://schemas.android.com/apk/res/android" >
     <!-- 设置整个屏幕背景为白色 -->
     <item >
         <color android:color= "@color/white" />
     </item>
 
     <!-- 中间logo -->
     <item >
         <bitmap
             android:gravity= "center"
             android:src= "@drawable/ic_launcher" />
     </item>
     <!-- 底部图表 -->
     <item android:bottom= "10dp" >
         <bitmap
             android:gravity= "bottom|center_horizontal"
             android:src= "@drawable/copyright" />
     </item>
 
</layer-list>

还有一张图片copyright.png

好了现在提供下效果图吧

启动时,黑屏白屏改造成这图片样子,哈哈~

启动完成后加装的LauncherActivity界面

调整到MainActivity界面

 就这样了,本来想给gif动画的,用微信拍下来,澳澳不知道怎么发到电脑呜呜~~~后来才知道可以发到网页微信。。。

 下载链接迟点发上来,哎呀妈的,要睡觉了~~·~~

本文链接:http://www.cnblogs.com/liqw/p/4263418.html

转载于:https://www.cnblogs.com/lonng226/articles/4263776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值