Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 885|回复: 0

React Native Android启动白屏的一种解决方案下

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-5 14:11:27 | 显示全部楼层 |阅读模式

    实现思路

    思路大流程:

    1.APP启动的时候控制ReactActivity从而显示启动屏。
    2.编写原生模块,提供一个关闭启动屏的公共接口。
    3.在js的适当位置(一般是程序初始化工作完成后)调用上述公共接口关闭启动屏。

    目录结构

    SplashScreen:创建Diaolg,当白屏的时候显示用。
    SplashScreenModule、SplashScreenReactPackage:Dialog关闭的桥接,需要在MainApplication中注册。
    lanuch_screen.png:Dialog布局文件显示的图片
    splash.xml:Dialog加载的布局配置文件

    开始动手

    1.在android/app/src/main/java/com/splashScreen下创建一个文件SplashScreen.java

    package com.splashScreen;
    
    import android.app.Activity;
    import android.app.Dialog;
    
    import com.nativetest.R;
    
    import java.lang.ref.WeakReference;
    
    public class SplashScreen {
    
        private static int NULL_ID = 0;
        private static Dialog mSplashDialog;
        private static WeakReference<Activity> mActivity;
    
        /**
         * 打开启动屏
         */
        public static void show(final Activity activity, final boolean fullScreen, 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 !=NULL_ID ? themeResId
                                        : fullScreen ? R.style.SplashScreen_Fullscreen
                                        : R.style.SplashScreen_SplashTheme
    
                        );
                        mSplashDialog.setContentView(R.layout.splash);
                        mSplashDialog.setCancelable(false);
                        if (!mSplashDialog.isShowing()) {
                            mSplashDialog.show();
                        }
                    }
                }
            });
        }
    
        /**
         * 打开启动屏
         */
        public static void show(final Activity activity, final boolean fullScreen) {
            show(activity, fullScreen, 0);
        }
    
        /**
         * 打开启动屏
         */
        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;
    
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (mSplashDialog != null && mSplashDialog.isShowing()) {
                        mSplashDialog.dismiss();
                        mSplashDialog = null;
                    }
                }
            });
        }
    
    }
    
    

    2.在android/app/src/main/java/com/splashScreen下创建一个文件SplashScreenModule.java

    package com.splashScreen;
    
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.bridge.ReactContextBaseJavaModule;
    import com.facebook.react.bridge.ReactMethod;
    import com.splashScreen.SplashScreen;
    
    public class SplashScreenModule extends ReactContextBaseJavaModule {
        public SplashScreenModule(ReactApplicationContext reactContext) {
            super(reactContext);
        }
    
        @Override
        public String getName() {
            return "SplashScreen";
        }
    
        /**
         * 打开启动屏
         */
        @ReactMethod
        public void show() {
            SplashScreen.show(getCurrentActivity());
        }
    
        /**
         * 关闭启动屏
         */
        @ReactMethod
        public void hide() {
            SplashScreen.hide(getCurrentActivity());
        }
    
        /**
         * 退出程序
         */
        @ReactMethod
        public void exit() {
            if (getCurrentActivity() != null)
                getCurrentActivity().finish();
            System.exit(0);
        }
    
    }
    
    

    3.在android/app/src/main/java/com/splashScreen下创建一个文件SplashScreenReactPackage.java

    package com.splashScreen;
    
    import com.facebook.react.ReactPackage;
    import com.facebook.react.bridge.JavaScriptModule;
    import com.facebook.react.bridge.NativeModule;
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.uimanager.ViewManager;
    import com.splashScreen.SplashScreenModule;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class SplashScreenReactPackage implements ReactPackage {
    
        // Deprecated RN 0.47
        public List<Class<? extends JavaScriptModule>> createJSModules() {
            return Collections.emptyList();
        }
    
        @Override
        public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
            return Collections.emptyList();
        }
    
        @Override
        public List<NativeModule> createNativeModules(
                ReactApplicationContext reactContext) {
            List<NativeModule> modules = new ArrayList<>();
            modules.add(new SplashScreenModule(reactContext));
            return modules;
        }
    }
    

    4.在MainActivity.java中添加如下代码

    package com.nativetest;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    
    import com.facebook.react.ReactActivity;
    import com.splashScreen.SplashScreen;
    
    
    // import com.splashScreen.SplashScreen;
    
    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 "NativeTest";
        }
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            SplashScreen.show(this,true);//显示Dialog
            super.onCreate(savedInstanceState);
            //解决应用程序多次重启问题
            if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
                finish();
                return;
            }
        }
    }
    
    

    5.在android/app/src/main/res下新建一个drawable文件夹,该文件夹下放置一个启动屏图片命名为launch_screen.png

    6.在android/app/src/main/res下新建一个layout文件夹,该文件夹下新建一个layout.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="@drawable/launch_screen"
        >
    </LinearLayout>
    
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-25 03:23 , Processed in 0.064410 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表