美文网首页React Native学习
RN 安卓启动图告别白屏

RN 安卓启动图告别白屏

作者: 星星编程 | 来源:发表于2020-06-06 15:12 被阅读0次

    目录
    一、前言
    二、添加启动图
    三、启动图属性
    四、启动图布局
    五、核心代码
    六、 MainActivity
    七、结束语

    一、前言

    最近流行摆地摊,同事半开玩笑地说,疫情下IT行业不景气,咱们一起摆地摊卖编程葵花宝典去吧,肯定大赚一笔。说实在的现在各行各业都不太好,倒闭的公司好多,这个时候我们只有不断地提高自己的技术水平,让自己成为IT行业的佼佼者。闲话不多说了,接下来给安卓小白带来启动页的适配,ReactNative和安卓原生都适用。

    二、添加启动图

    在res->mipmap下添加适配各种手机的启动图,图片名字叫launch。

    三、启动图属性

    在res->values->styles.xml中添加如下代码。

    <resources>
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:textColor">#000000</item>
        </style>
     
        <style name="SplashScreen_SplashAnimation">
            <item name="android:windowExitAnimation">@android:anim/fade_out</item>
        </style>
    
        <style name="SplashScreen_SplashTheme" parent="Theme.AppCompat.NoActionBar">
            <item name="android:windowAnimationStyle">@style/SplashScreen_SplashAnimation</item>
        </style>
        <style name="SplashScreen_Fullscreen" parent="SplashScreen_SplashTheme">
            <item name="android:windowFullscreen">true</item>
        </style>
    </resources>
    

    四、启动图布局

    在res->layout->launch_screen.xml中添加如下代码。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/launch">
    </LinearLayout>
    

    五、核心代码

    由于RN默认启动的页面是MainActivity,如果修改启动Activity会出现无法启动的错误。这里利用Dialog在MainActivity弹出,5秒后再关闭实现的启动图效果。如果有更好的方法,欢迎留言,谢谢。

    package com.wisdomanyun;
    import android.app.Activity;
    import android.app.Dialog;
    import android.os.Build;
    import java.lang.ref.WeakReference;
     
    /**
     * 启动屏
     */
    public class SplashScreen {
        private static Dialog mSplashDialog;
        private static WeakReference<Activity> mActivity;
        /**
         * 打开启动屏
         */
        public static void show(final Activity activity, final int themeResId) {
            if (activity == null) return;
            mActivity = new WeakReference<Activity>(activity);
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (!activity.isFinishing()) {
                        mSplashDialog = new Dialog(activity, themeResId);
                        mSplashDialog.setContentView(R.layout.launch_screen);
                        mSplashDialog.setCancelable(false);
                        if (!mSplashDialog.isShowing()) {
                            mSplashDialog.show();
                        }
                    }
                }
            });
        }
    
        /**
         * 打开启动屏
         */
        public static void show(final Activity activity, final boolean fullScreen) {
            int resourceId = fullScreen ? R.style.SplashScreen_Fullscreen : R.style.SplashScreen_SplashTheme;
            show(activity, resourceId);
        }
    
        /**
         * 打开启动屏
         */
        public static void show(final Activity activity) {
            show(activity, false);
        }
    
        /**
         * 关闭启动屏
         */
        public static void hide(Activity activity) {
            if (activity == null) {
                if (mActivity == null) {
                    return;
                }
                activity = mActivity.get();
            }
    
            if (activity == null) return;
            final Activity _activity = activity;
            _activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (mSplashDialog != null && mSplashDialog.isShowing()) {
                        boolean isDestroyed = false;
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                            isDestroyed = _activity.isDestroyed();
                        }
                        if (!_activity.isFinishing() && !isDestroyed) {
                            mSplashDialog.dismiss();
                        }
                        mSplashDialog = null;
                    }
                }
            });
        }
    }
    
    

    六、 MainActivity

    package com.wisdomanyun;
    import android.app.Activity;
    import android.os.Bundle;
    import com.facebook.react.ReactActivity;
    
    public class MainActivity extends ReactActivity {
      /**
       * Returns the name of the main component registered from JavaScript. This is used to schedule
       * rendering of the component.
       */
      @Override
      protected String getMainComponentName() {
        return "WisdomAnYun";
      }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        SplashScreen.show(this);  // 打开启动图
        final Activity activity = this;
        Thread myThread = new Thread() {//创建子线程
          @Override
          public void run() {
            try {
              sleep(5000);//使程序休眠五秒
              SplashScreen.hide(activity);//关闭启动图
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        };
        myThread.start();//启动线程
        super.onCreate(savedInstanceState);
      }
    }
    
    

    七、 结束语

    做iOS开发已经快5年了,一直在小厂前线战斗,都是打一些局部战争,整体布局和架构什么的都是使用大厂的,一直困于业务逻辑的实现, 想挣脱出来,却越陷越深,我自己都没有想到自己学习RN开发后,竟然会搞起安卓来。建议大家还是去大厂比较好,可以搞一下架构,或者研究某一块东西,这样会比较深入,就不会一直停留在应用层面,出现个问题,除了百度还可以阅读源码,知道问题真正出现哪里,最终把bug都消灭掉,这才是我们技术员该追求的。

    关注公众号,查看更多内容.jpg

    相关文章

      网友评论

        本文标题:RN 安卓启动图告别白屏

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