微信小程序和Android开发对比(上篇)

黑洞算法
• 阅读 8386

这篇文章将围绕下面几个方面:

  1. 从开发模式(过程)上对比Android和小程序,比较两种”模式”的异同

  2. 从实现功能上对比,主要是看看微信小程序的局限

  3. 自己的一些看法,微信的优势

开发过程上的对比

在我看来,开发一款app,需要做的主要是界面布局以及交互处理,然后是后面的业务逻辑处理。虽然平台不同,但是任务都是趋同的。下面从这两个大的方面进行对比一下。

小程序

微信把这个小程序框架称为“MINA”,并声称:

MINA(MINA IS NOT APP) 是在微信中开发小程序的框架。

MINA的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生APP体验的服务。

MINA提供了自己的视图层描述语言WXML和WXSS,以及基于JavaScript的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,可以让开发者可以方便的聚焦于数据与逻辑上。
个人觉得第三点说得特别好。大概说清楚了开发者要干什么。大概就是以写Web的方式写好前端,然后通过双向数据绑定技术和业务端交互,业务端通过javascript代码实现业务处理,必要时调用微信接口完成一些处理。

一些生命周期函数

这里所说的生命周期函数是指的整个应用以及每个页面的声明周期函数,在Android中,对应着App、Activity类,而在小程序中,对应着App和Page两个函数对象(注意,javascript是基于原型和构造器的,而java是基于类的,所以这里就造成了一些写法的不同)。以App为例,下面是一个代码实例:

App({
  onLaunch: function () {
    console.log('App Launch')
  },
  onShow: function () {
    console.log('App Show')
  },
  onHide: function () {
    console.log('App Hide')
  }
})

每个小程序起起来时就会有一个App实例,同理每个页面打开也会有一个Page实例(这个链接打开往下滑还有生命周期函数的图解),我们只需要在这个实例中添加自己的逻辑即可,唯一不同的是这是在javascript这种语言上写的(java和javascript的区别就像是雷锋和雷峰塔,所以这里形式上的不同还是蛮大的)。

视图层代码

前面说了,写视图层的体验有点像Web前端,主要是写多了Android,习惯性地会把界面的样式以及交互放在一块儿写(事实上就是你在xml上做的工作),而在Web端,需要html和css文件来共同完成。在小程序里面,对应的是WXML(WeiXin Markup Language)和WXSS(WeiXin Style Sheets),注意虽然模式和web很像,但是在形式上算是微信自己开发的一套(所以你需要使用他们自己的标签)。具体来讲,你需要做两件事:

在WXML中通过组件(微信所提供的标签)构建页面结构,并且在其中完成数据绑定和事件绑定

在WXSS中完成样式的定义,用以控制WXML中组件的样式。WXSS具有CSS大部分特性,同时也有部分扩充。

基本上,视图层很像在写Web端。不过你也看到了,和Android比起来,限制因素在于微信给你提供了组件,然后你最多改改样式,更多的像自定义组件什么的就不可能了。

逻辑层代码

不同于Android有一堆的组件(Activity、Service..)来支撑逻辑层,小程序就一个Page()函数(类似与App()函数,在框架里面填逻辑),所以显得很简单。基本上,数据通过双向绑定进行传递和刷新的,然后在page内可以完成一些交互处理,更多的能力(访问网络、存储)是通过微信的API完成的,这些api以wx.开头,目前来看,不是太多,所以可以很快看完,当然也意味着其实可以完成的工作还着实有限,这个后面说。

工程组织

整体来说,小程序的工程组织还是蛮清晰的,MINA程序包含一个描述整体程序的app和多个描述各自页面的page,一个MINA程序主体部分由三个文件组成,必须放在项目的根目录,是app.js,app.json,app.wxss,分别用作生命周期函数、配置文件和样式文件,一个MINA页面由四个文件组成,是.js,.wxml,.json,.wxss,分别用作生命周期函数、布局文件、配置文件和样式文件,他们需要通过同名且放在同名文件夹下(方便框架通过名字路由)。比起Android来,套路应该是固定而简单得多。

Android

再回头看看Android开发,突然觉得可以玩的简直是太多了…下面简单描述一下,肯定是不全的。

一些生命周期函数

App、Activity是肯定的,其实套路和小程序还是差不多的。只不过组织形式是类而不是函数对象。之前说了,这是因为Js和Java语言特性造成的。

视图层代码

通常来讲,Android的界面在.xml文件中定义,其实仔细想想就会发现,在文件中,我们是同时定义了布局,和交互逻辑的,这是因为本质上这些.xml声明都是View类的子类,我们通过重写View的声明周期方法来完成了对齐的样式(onDraw以及LaoutParams)、以及交互的定义(各种on..listener)。所以在.xml中更像是对这些对象进行一系列实例化。至于双向数据绑定,Android也开始支持了

逻辑层代码

这一层还是要复杂得多..放到后面对比来说吧。

工程组织

…..不想说了,一方面写法多,一方面相对于小程序也蛮复杂的。

下篇内容(待续

  1. 从实现功能上对比,主要是看看微信小程序的局限

  2. 自己的一些看法,微信的优势

「H5程序俱乐部」是一个专注微信小程序学习交流的微信公众号
每天发布微信小程序设计/开发/运维知识,小程序最新资讯

「H5程序俱乐部」微信号:wxappclub 或者 微信扫一扫关注
微信小程序和Android开发对比(上篇)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Easter79 Easter79
3年前
Taro小程序自定义顶部导航栏
微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(