【Android】进入应用和切换界面时闪屏的问题

时间:2023-01-11 17:44:31
【关键词】

闪屏 切换界面

【问题】
  • 从 launcher 中进入应用的时候,开始有一瞬间的空白,而不是直接展示背景;
【分析】
  • 在绘制界面的时候,Android会先画背景,接着绘制其他区域(这个背景和 theme 有关);
【解决方案】
  • 直接修改 theme 中的背景为 activity 的背景;
  • 在主题中,将android:windowBackground属性直接指定为自己想要的背景色或背景图;

【代码】

在styles.xml中添加

 
<style name="MyTheme" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/holo_purple</item>
</style>

修改Manifest

 
<activity
android:theme="@style/MyTheme"
android:name=".FirstActivity"
android:label="@string/app_name1" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
 
<activity
android:theme="@style/MyTheme"
android:name=".SecondActivity" >
</activity>
【扩展】

如果是设置只包含一张图片的欢迎界面,那就更简单了

  • 在 Mainfest 中指定欢迎界面 activity的时候设置 theme为一个包含此图片的style,引用此 theme 即可:

     
      
    <style name="MyTheme" parent="AppTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@drawable/bg</item>
    </style>
  • 接着,欢迎界面的 activity 只需要处理跳转到主界面的逻辑即可,而不需要处理视图(即不用设置setContentView(););

     
      
    public class WelcomeActivity extends Activity {
     
    private Handler mHandler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // 2秒后跳转到主界面
    mHandler.postDelayed(toMainActivityRunnable(), 2000);
    super.onCreate(savedInstanceState);
    }
     
    private Runnable toMainActivityRunnable() {
    return new Runnable() {
    @Override
    public void run() {
    Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
    // 退出程序的时候不在经过欢迎界面
    startActivityForResult(intent, 0);
    }
    };
    }
     
    // 展示欢迎界面的时候,不允许其他操作(例如按返回键退出)
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    return false;
    }
     
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == 0){
    finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
    }
    }