React Native Android入门实战及深入源码分析系列(1)——Hello world

超详细 React Native 入坑使用指南,我在元宇宙等你 前言 大家好,我是虚竹,今天给大家分享一下我是如何快速通关打怪搭建 React Native 跨端开发环境,并使用大家非常熟悉的开发工具 VSCode 来编写丝滑般的代码。编写丝滑般代码会再下一篇输出,包括项目实战经验总结和踩坑,如目录架构、函数式编程、React Hook 灵活运用、常见场景、开发调试、发布部署、踩坑、性能优化等等。 之前因为在我的技术群,收到群友@我,问能否出一个保姆级 React Native 搭建开发环境的教程,我说照着官方文档步骤操作即可。可惜事与愿违没那么顺利,流程上繁琐不够清晰 阅读详情

转载需注明出处:http://blog.youkuaiyun.com/minimicall?viewmode=contents

从今天起,我要分析React Native for Android的源码。

本系列主要是从使用和源码分析的角度来一步步的剖析React Native Android。当然,因为我对IOS不了解,所以,我只能分析安卓了。


首先来一个Hello world。

对于Rn 安卓的开发环境,本着不重复造轮子的思想,我就不再这里介绍了。

1、 创建一个工程

首先,我们需要创建一个Rn工程,通过如下命令:

react-native init AweSomeProject

然后我们进入到该工程目录下。选择android目录:




确认里面有build.gradle文件。我们可以通过react-native run-android 来运行安卓程序。但,为了后续开发,我们选择使用AndroidStudio来打开。

在import project的时候,选择该android目录。然后就导入了工程。等待漫长的gradle更新过程吧,这个时候貌似在天朝需要vpn吧。


等待完了之后,点击run,运行程序,我们假设你已经有创建一个虚拟手机了,在电脑上。因为真机的话,我们后面再讲。因为它有点复杂。


这个时候你可以看到其实手机上已经有了效果。


2、MainActivity分析

这个时候,项目已经默认创建了一个MainActivity。我们来分析一下它的源码:

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 "AwesomeProject";
    }

    /**
     * Returns whether dev mode should be enabled.
     * This enables e.g. the dev menu.
     */
    @Override
    protected boolean getUseDeveloperSupport() {
        return BuildConfig.DEBUG;
    }

   /**
   * A list of packages used by the app. If the app uses additional views
   * or modules besides the default ones, add more packages here.
   */
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
              new ToastReactPackage()
      );
    }
}
英文注释已经解释的非常明白了。其实,我们定制模块最重要的是在getPackages()方法加上自己需要注册的模块。例如,我这里就注册了ToastReactPackage。这个等会说。


3、 index.android.js 文件


我们回过头来说js文件。打开这个文件,已经有了默认的。但我并不满足于它,我做一个简单的相册吧。

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 */
'use strict';
import React, {
  AppRegistry,
  Component,
  StyleSheet,
  Text,
  View,
  Image
} from 'react-native';

import KankanToast from './androidview/ToastAndroid';

var imgs = [
  'http://www.ituring.com.cn/bookcover/1442.796.jpg',
  'http://www.ituring.com.cn/bookcover/1668.553.jpg',
  'http://www.ituring.com.cn/bookcover/1521.260.jpg'
];


var MyImage = React.createClass({
  getInitialState:function(){
    return {imgs:imgs,count:0};
  },
  goNext:function(){
    var count = this.state.count;
    count ++ ;
    if(count < imgs.length){
      this.setState({
        count:count
      });
    }
  },
  goPreview:function(){
    var count = this.state.count;
    count --;
    if(count >= 0){
      this.setState({count:count});
    }
  },
  render:function(){
    return (
    <View style={styles.flex}>
      <View style={styles.image}>
        <Image style = {styles.img}
            source = {{uri:this.state.imgs[this.state.count]}}
            resizeMode="contain"
        />
      </View>
      <View style={styles.btns}>
        <TouchableOpacity onPress={this.goPreview}>
          <View style={styles.btn}>
            <Text>Prev</Text>
          </View>
        </TouchableOpacity>
          <TouchableOpacity onPress={this.goNext}>
          <View style={styles.btn}>
            <Text>Next</Text>
          </View>
        </TouchableOpacity>
      </View>
    </View>
      );
    

  }
});

KankanToast.show('这是一个Toast',KankanToast.SHORT);

class AwesomeProject extends Component {
  render() {
    return (
      <View style={styles.container}>
        <MyImage></MyImage>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
  image:{
    borderWidth:1,
    width:300,
    height:200,
    borderRadius:5,
    borderColor:'#ccc',
    justifyContent:'center',
    alignItems:'center'
  },
  img:{
    height:150,
    width:200
  },
  btns:{
    flexDirection:'row',
    justifyContent:'center',
    marginTop:20
  },
  btn:{
    width:60,
    height:30,
    borderColor:'#0089FF',
    borderWidth:1,
    justifyContent:'center',
    alignItems:'center',
    borderRadius:3,
    marginRight:20
  }

});

AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

迫不及待的我们先来看一看效果:


弹了个Toast,你看,是不是和安卓原生态的一个墨阳。哎呀,模样。其实,墨阳这个名字真好听。



然后,就出来了我们期待的相册。是不是丑了点,将就着看吧,你行你上,不行别逼逼。




我们来分析一下这个源码的意思。

这段代码就是js的全部代码。我们来说明一下代码的含义。

1)导入:

import React, {
  AppRegistry,
  Component,
  StyleSheet,
  Text,
  View,
  Image
} from 'react-native';
上面是从react-native库里面导入对应的模块

import KankanToast from './androidview/ToastAndroid';


这个有意思了,这个是从当前目录下的androidview子目录下导入ToastAndroid模块。其实就是./androidview/ToastAndroid.js文件。它的内容我们后面再说

2、定义个数组


var imgs = [
  'http://www.ituring.com.cn/bookcover/1442.796.jpg',
  'http://www.ituring.com.cn/bookcover/1668.553.jpg',
  'http://www.ituring.com.cn/bookcover/1521.260.jpg'
];

这个数组用来存储图片路径。

3、定义一个UI控件

var MyImage = React.createClass({...});

这个就是我们威名远扬的相册控件。

4、弹出一个Toast

KankanToast.show('这是一个Toast',KankanToast.SHORT);

看清楚,我用的是KankanToast,这个是我自己定义的一个组件。至于为什么要叫KankanToast,主要是曾老师是迅雷看看的一名资深开发屌丝。

当然,我们改名了,改成响巢看看,响巢看看,响巢看看。重要的事情说三遍,要是没记住,我就送你一张爱奇艺的会员卡了,对是爱奇艺的。

5、程序的入口组件

class AwesomeProject extends Component

这个里面有个render函数,注意它的根节点只能有一个<View>

6、定义css样式

const styles = StyleSheet.create

这个就不用多说了。


7、注册程序入口组件



AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);


到这里我们把js的代码说完了。回过头,我们得说说我们的KankanToast是怎么个回事。


当然,你最好把它注释掉。因为,我下篇再讲,今天太晚了,要睡觉了。不要问为什么,我工资低,比较任性。

晚安。下一篇,自定义控件。




程序员职业成长手记:从.NET实践看技术人的三层修炼 程序员成长的本质,不是技术栈的堆叠,而是思维范式与工程心智的持续进化。在.NET这一兼具历史纵深与现代演进的典型技术生态中,开发者得以系统性地经历‘做人→做技术人员→做程序员’的三层递进:从协作边界与认知共情,到技术选型背后的组织适配与风险权衡,再到语法特性在真实Code Review与生产环境中的落地校验。这种以问题为起点、以源码为依据、以人因变量为标尺的反思路径,超越了框架教程与API文档,直指软件工程的核心矛盾——如何让代码既正确,又可持续、可协作、可传承。本文即基于十年持续更新的.NET技术博客实践 阅读详情

相关推荐

深入探究React Native:从基础到实战

本文还有配套的精品资源,点击获取 简介:React Native是一个由Facebook推出的开源框架,用于构建跨平台的原生移动应用程序。本项目《MeizhiReactNative——初探React Native世界》将带领初学者入门React Native,涵盖框架基础、项目结构、环境搭建、基本组件使用、样式系统、网络请求与数据管理、生命周期方法以及调试工具。通过实例操作...

weixin_30248619的博客 3619

React Native Android 源码分析之启动过程

前言 阅读之前请先查看准备工作 这篇开始将分析 React Native 0.56-stable 分支 在 Android 端的启动过程是怎么样。 用过 React Native 的小伙伴都知道,React Native 是可以使用 JS 来编写一份代码,并可以同时跑在 Android 和 iOS 两个平台上。那其实核心思想就是 JS 跟 Android 之间建立起一种通信机制。 对于 Andro...

weixin_33727510的博客 458

进芯AVP28335烧录避坑全记录:CCS、Uniflash、C2Prog、SDFlash四大工具配置详解

本文详细解析了进芯AVP28335芯片在烧录过程中遇到的常见问题及解决方案,涵盖CCS、Uniflash、C2Prog和SDFlash四大工具的配置要点。针对国产器件AVP28335的特殊需求,提供了从开发环境准备到烧录验证的全流程指南,帮助开发者高效完成程序烧录,避免常见陷阱。

weixin_30836759的博客 591

React-Native-源码分析

用React-Native也有1个月了,好多疑惑一直挂在心头,没有得到很好的答案,有道是: 纸上得来终觉浅,绝知此事要躬行 今天来源码中一探究竟,博主使用的环境是 “react”: “15.3.1”, “react-native”: “^0.33.0”, 先看第一个问题一切的开始-startReactApplication想要搞清楚这个问题,那首先要知道在start一个React

让创意的火花散落到屏幕的每一个dp 2754

cocos2dx中DrawNode画线锯齿和非凸多边形填充

记录一下在cocos2dx中使用DrawNode所遇到的2个问题 1.画线锯齿问题 ios版本下,在AppController.mm中设置CCEAGLView的multiSampling和numberOfSamples。如下图 CCEAGLView *eaglView = [CCEAGLView viewWithFrame: [window bounds]

hello-world 5415

硬件压力测试工具使用方法

B, --bind host# 绑定到主机的多个地址中的一个。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口),反向连接至客户端。-c, --client host#如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。-C, --compatibility# 与低版本的Iperf使用时,可以使用兼容模式。-b, --bandwidth #[KM] UDP模式使用的带宽,单位bits/sec。

weixin_53303772的博客 8219

ReactNative 学习总结 个人梳理

ReactNative官方文档:React Native 中文网 · 使用React来编写原生应用的框架ReactNative适用于APP的一套多开,适合大型项目的开发,安装环境时注意版本对应。 2、ReactNative的布局默认为flex布局,View标签不能直接写入文字,样式不会被继承, 单位不能加px,vh,vw等可以是百分比。 3、快速获取屏幕尺寸,Dimensions flex布局见我的博客:Flex布局总结_Dragon Wu的博客-优快云博客_flex布局总结案例代码:同样使用Re

qq_50909707的博客 9573

E4A蓝牙APP开发实战:从零到一构建简易物联网控制终端

本文详细介绍了使用E4A(易安卓)开发蓝牙APP的实战教程,从零开始构建简易物联网控制终端。通过E4A的中文编程环境和内置蓝牙组件,开发者可以快速实现智能家居控制、创客项目遥控等功能。文章涵盖硬件准备、开发环境搭建、核心代码解析及典型应用场景,特别适合零Java基础的电子爱好者入门蓝牙APP开发。

weixin_42715608的博客 476

React Native到底要不要用?劣势优势全面剖析

摘要: 目前流行的两个智能手机操作系统 iOS 和 Android,各自为营,互不相通。一般情况下,开发一款APP需要两支队伍,分别针对 iOS 和 Android 平台进行开发。为了节约人力成本,有人就想到了跨平台开发解决方案。最近几年有多种跨平台开发方案相继出现,其中由 Facebook 推出的 React Native 框架是目前最完善、最受欢迎的一个。本文主要从React Native 的实现原理、优缺点剖析、技术选型的思考这三个方面进行阐述。 一、 React Native简介 ...

Ethan_LG的专栏 1万+

SQL面试题——最大连续登陆问题

最大连续登陆是我们计算比较常用的指标,我们可以将其当成一个经典的SQL模型,后面我们也会陆续总结出其他的模型,你还知道其他的比较经典的SQL 吗?欢迎分享,或者你还知道其他的关于计算连续的指标?最大连续登陆重要的是计算思想,最大连续才是关键,登陆只是一个场景,要学会举一反三。

9013

《备考系统架构设计师》 - 专栏介绍和目录

本专栏包括所有历年真题及详解、章节知识核心总结、精选高分论文、补充知识、专题总结等。欢迎订阅专栏。

数据知道的博客 4万+

React Native的概述,React Native的优缺点,React Native开发/运行环境的搭建

React Native概述 React是一个构建用户界面的JS框架,实现了数据的响应式和组件化开发,本身既可以用于Web网站项目,也可以用于创建移动端App项目. 相较于Vue.js在移动端只能构建WebApp,React生态系统中有一个可以构建"真正原生App"的扩展----React Native,可以说:“RN是React生态圈可以傲视其它对手的绝对功臣”. RN可将JS编译成Java/OC语言 目前最新版本是0.67 React Native的优缺点 优点 1.RN可将标记元素转化为真实的原生UI

人间真的不值得的博客 2万+

GEE APP:时间序列影像批处理工具:按月筛选与智能导出解决方案出工具

本文介绍了一个基于Google Earth Engine(GEE)开发的智能时序影像处理工具,可高效处理遥感影像时间序列数据。该工具采用三栏式交互布局,包含控制面板、地图显示和缩略图预览区域。核心功能包括:1)灵活的时间筛选机制,支持年度范围选择和月份批量选择;2)智能影像筛选算法,基于云量、空间覆盖等条件自动选择最佳影像;3)交互式缩略图预览,支持点击加载完整影像;4)自动化批量导出系统,实现标准化命名和统一存储。工具可广泛应用于农业监测、城市扩张研究、生态环境评估等领域,显著提高遥感数据预处理效率,确保

此星光明博客 113

React Native 从入门到实战:开启跨端开发之旅

通过这篇教程,我们系统地学习了 React Native 的开发知识,从基础概念到深入应用,再到实战项目的演练,相信大家已经对 React Native 有了较为全面的认识。我们了解了 React Native 是什么以及为什么选择它,掌握了搭建开发环境、创建项目、使用组件和语法的方法,学会了进行网络请求、处理数据、使用第三方库,还通过实战项目将所学知识运用到实际开发中,最后总结了常见问题及解决方案。React Native 的学习是一个不断积累和实践的过程。

大雨淅淅的博客 3412

【图像去噪】基于偏微分方程(PDE)实现图像去噪附matlab代码

在工程应用中,图像信息通过数字图像系统进行处理、存储和传输等加工变换时,由于不可避免地受到噪声干扰,使得原始图像信息产生偏差和失真,给图像的后续处理带来不便,进而影响人们对图像视觉特性的认知程度。因此,为了改善图像的质量效果,提高人们对图像视觉特性的认知度,对图像噪声进行有效去除,降低噪声对图像信息的干扰是很有必要的。近年来,基于偏微分方程( partial differential equation,PDE) ​的图像去噪方法在计算机视觉和图像处理等技术领域得到了广泛的重视,因为它在平滑噪声的同时,能够很

qq_59747472的博客 855

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

10分钟快速入门React Native:从基础到实战

React Native是由Facebook开发的一款开源框架,它允许开发者使用JavaScript语言结合React的声明式UI原理来开发跨平台的移动应用。该框架的出现,极大地降低了前端开发者涉足移动开发的门槛,同时保留了原生应用的性能和体验。高效的开发周期:通过React Native,开发者能够同时为Android和iOS两个平台编写代码,这意味着可以快速发布应用,极大地缩短了产品上市时间。原生体验:React Native直接使用原生模块,因此它能够提供接近原生应用的交互和性能体验。共享代码库。

2501_91133270的博客 2751

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

React Native 介绍

文章目录一丶React-native是什么二丶React Native引进原因三丶React学习需要的知识四丶React三个特点五丶React-native的优缺点六丶React-native的机制特性七丶React-native的工作原理八丶React Native开发流程九丶对React-native的看法十丶React-native学习资料 首先要声明一下,这篇文章是借用下面两位优秀的博主博客制作,这里要像两位优秀的博主表示真挚的感谢! 小水滴2014 Joan_Vivian 一丶React-nati

qq_27494201的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

React Native开发从入门到精通

【代码】React Native 开发从入门到精通学习大纲。

YunWisdom 9202

前端宝典九:React Native从入门到精通实战

本文主要介绍 1. React Native新旧框架对比 2. React与React Native区别 3. React Native性能优化 其中第3点React Native性能优化的拆包分包,是项目实战中使用过的,在这里整理分享,如果没有用过的小伙伴会觉得晦涩难懂,建议按照在实际项目中需要去实践,纸上得来终觉浅,绝知此事要躬行。

franktaoge的博客 2657

react-native基本介绍

什么是RNRN特点谁在使用RNRNRN英文全称,是Facebook于2015年4月开源的跨平台移动应用开发框架,也是Facebook早先所开源的JavaScript框架React在原生移动应用平台的衍生产物,目前支持iOS和安卓两大平台。RN使用Javascript和React中类似于html的JSX,以及css来开发移动应用,因此熟悉Web前端开发的技术人员只需很少的学习就可以快速进入移动应用开发领域。

wejdsjja的博客 3994

维护积极的react native,为什么会有人造谣react native不维护了,停止维护。

其实近几年我一直关注react -native,他一直更新频繁,0.60大重构,升级了js执行引擎Hermes,当前已经0.70.4版本了。性能越来越提高,但是总感觉到有人在刷百度关键词,只要输入react-native后面就自动提示热搜关键词“react-native 停止维护”,这误导很多人以为真的不维护了,似乎是有人蓄意破坏技术舆论氛围,严重影响技术发展。

qq996150938的专栏 1万+

什么是React Native?

React Native (RN) 是一个由 Facebook 开发的开源框架,用于构建跨平台的移动应用程序。它允许开发者使用 JavaScript 和 React 来创建原生 iOS 和 Android 应用。RN 的出现极大地简化了移动应用的开发过程,使得开发者可以更快速、更高效地构建高质量的应用。在本文中,我们将深入探讨 RN 的各个方面,包括其核心概念、组件、样式、状态管理、导航、网络请求、存储、性能优化等。我们还将通过实际的例子来演示如何使用 RN 开发一个简单的应用。

Front end development engineer 2万+

React-native是什么?

开发React-native,需要的技术栈,真的不少。你需要了解,react-native是什么?react-native开发所需的基础技术是什么?react-native是什么?我们知道,传统的开发分为前端开发(web开发),ios开发以及android开发。不同的开发你需要懂得不同的相关技术,如:开发android你就要懂java语言,开发ios你需要懂object-c,开发web网页你需要懂J

程序员老李|前阿里技术专家,10 年前端。 做免费办公工具:图片压缩、PDF、Markdown、在线简历,全在浏览器本地处理。 文件不上传,不用注册。技术栈 Canvas、WebAssembly、Web Worker。 4036

React和React Native区别

React 和 React Native 在语法上有许多相似之处,但它们的差异主要体现在渲染机制、布局方式、事件处理、访问原生功能等方面。React Native 侧重于跨平台的原生开发,因此它有一些与 React 不同的 API 和组件设计,确保可以访问和操作移动设备的特性。

m0_48143251的博客 3434

React-Native 宝藏库大揭秘:精选开源项目与实战代码解析

React-Native Elements 是一个高度可定制的 UI 工具包,它为 React-Native 开发者提供了丰富的 UI 组件,如按钮、卡片、表单等。这些组件不仅外观现代,而且易于集成和使用,大大简化了 UI 开发过程。React-Native Elements 的设计理念是提供一个统一的 UI 层,让开发者能够快速构建出美观且功能丰富的应用界面。下面是一个简单的代码示例,展示如何使用 React-Native Elements 的自定义主题和组件。// 自定义主题Button: {

实践是检验真理的唯一标准 2890

2024年给所有开发者的React Native详细入门指南,2024年最新面试一轮就发offer

小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

2401_84435555的博客 1063
上一篇: ListViev加载不同布局项
下一篇: React Native Android入门实战及深入源码分析系列(2)——React Native源码编译
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值