像写Flutter一样开发Android原生应用
要问到Flutter和Android原生App,在开发是有何区别,编程方式是绕不开的话题。Flutter采用声明式编程,Android原生开发则采用命令式编程。
声明式编程 VS. 命令式编程
我们首先要明确的,是何为声明式编程,何为命令式编程。
何为声明式编程
摘录一段来自百度百科的定义:
声明式编程通常被定义为除命令式以外的编程范式。同时存在一些其他的定义,这些定义不是简单的将声明式编程和命令式编程做对比,例如:
- 声明式编程是告诉计算机需要计算“什么”而不是“如何”去计算;
- 任何没有副作用的编程语言,或者更确切一点,任何引用透明的编程语言;
- 任何有严格计算逻辑的编程语言。
这些定义有一些是重合的。
简单地理解:声明式编程就是告诉“机器”你想要的是什么,让机器想出如何去做。
何为命令式编程
依旧先看它的定义(来自百度百科):
命令式编程(英语:Imperative programming),是一种描述计算机所需作出的行为的编程典范。几乎所有计算机的硬件工作都是命令式的;几乎所有计算机的硬件都是设计来运行机器码,使用命令式的风格来写的。
简单地理解:命令式编程就是需要我们命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
举例说明
举个例子,看下面两种解决问题的方法:
方法一:
蔬菜.做成菜(蔬菜沙拉)
方法二:
洗干净(蔬菜)
混合(蔬菜, 沙拉)
放入盘中(混合物)
你能分清哪一种方法是何种编程方式吗?很明显,方法一是声明式,方法二是命令式。
但是,尽管上面两种方法看上去有所区别,但本质上做的事情仍然是一致的。
我们看到方法一虽然没有像方法二那样实实在在地“做事”,实际上是将方法二中的步骤整合在了“做成菜”的函数中。在实际编码时,我们在开发这部分功能时,就可以完全不用关心做菜的具体过程了。这样看上去更清晰,维护起来也更灵活。
Jetpack Compose
我们若想使用声明式编程来开发原生Android App,需要借助Jetpack Compose组件。该组件目前在测试版的Android Studio中支持。
必备的开发工具
如前文所述,我们需要安装测试版的Android Studio(Canary Build)。下载地址如下:
https://developer.android.google.cn/studio/preview
当然,测试版的Android Studio依然可以在Mac、Windows和Linux上运行,且可以和正式版本使用同一套SDK,本文采用Mac版配合模拟器进行演示。
创建带有Compose支持的工程
安装好Canary Build的测试版Android Studio后,新建一个项目,在新建项目向导中,选择Empty Compose Activity。

要注意的是,要使用Compose特性,需要至少API Level 21以上的SDK支持,且只能使用Kotlin语言。
探索代码
如上方法创建好Android工程后,打开MainActivity.kt,可以看到一个界面预览窗口。在之前的版本中,这样的预览窗口好像只在xml编辑器视图中出现过。
接下来我们阅读默认存在的代码,可以发现这其实是一个Hello World项目。
下面我们来尝试使用下面的代码片段修改原有代码:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
HelloComposeTheme {
Greeting();
}
}
}
}
@Composable
fun Greeting() {
MaterialTheme() {
Column {
Image(asset = imageResource(id = R.drawable.header))
Text(text = "第一行")
Text(text = "第二行")
Text(text = "第三行")
}
}
}
然后重新Build,观察右侧的预览界面(header为png或jpg格式图片)。

如上图所示,在下一版本的Android Studio中,结合Compose特性使用,可以实现更加便利的界面预览。
接下来我们观察Greeting()方法中的代码,是不是感觉似曾相识?
如果你有了解过Flutter,不难发现,这样的写法其实和Flutter中的UI编程方法是一致的。
总结
好了,干货部分到此结束,最后提醒大家,由于该特性目前尚未作为正式版发布,所以不建议大家在生产环境中大量使用。
祝各位工作顺利,产品没Bug,写代码一次过。
像写Flutter一样开发Android原生应用的更多相关文章
- RN开发-Android原生交互
在使用RN开发过程中,难免有些原生功能需要要自己来实现,下面总结一下在使用RN与原生开发交互. 1.在原生代码中定义实现类 1.1 首先继承 ReactContextBaseJaveModule抽象 ...
- Flutter学习(9)——Flutter插件实现(Flutter调用Android原生
原文地址: Flutter学习(9)--Flutter插件实现(Flutter调用Android原生) | Stars-One的杂货小窝 最近需要给一个Flutter项目加个apk完整性检测,需要去拿 ...
- React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块
尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...
- Android原生(Native)C开发之四:SDL移植笔记
http://www.apkbus.com/forum.php?mod=viewthread&tid=1989 SDL(Simple DirectMedia Layer)是一套开放源码的跨平台 ...
- React-Native开发之原生模块封装(Android)升级版
本文主题:如何实现原生代码的复用,即如何将原生模块封装. (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/52862 ...
- 【Flutter 混合开发】嵌入原生View-Android
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-IOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- 【Flutter 混合开发】嵌入原生View-iOS
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- 【Flutter 混合开发】与原生通信-MethodChannel
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
随机推荐
- 说说TCP的三次握手和四次挥手
一.传输控制协议TCP简介 1.1 简介 TCP(Transmission Control Protocol) 传输控制协议,是一种 面向连接的.可靠的.基于字节流的传输层 通信协议. TCP是一种面 ...
- robot framework使用小结(四)
robot framework可以采用读excel表这种形式实现数据分离,本文没有实现批量读取excel表内容(还不会),后续有必要就学习哈再更新~~~ 新建测试案例baidu05, 右键项目名rob ...
- 基于Docker Compose的.NET Core微服务持续发布
是不是现在每个团队都需要上K8s才够潮流,不用K8s是不是就落伍了.今天,我就通过这篇文章来回答一下. 一.先给出我的看法和建议 我想说的是,对于很多的微小团队来说,可能都不是一定要上K8s,毕竟上K ...
- python利用列表文件遍历
关键词:文件遍历/列表 思路:先制作目标文件列表(txt/csv...均可),再逐行读取列表文件 1. 制作列表 linux 终端输入:# find ./abc -type f > list.t ...
- nginx 注释配置及详解
前言 DMZ(Demilitarized Zone) 非军事区,生产环境 WEB 服务部署的区域,公司的架构为一台nginx 充当 load balance 服务,负载到两台 nginx 上面,反向代 ...
- 从别人的代码中学习golang系列--01
自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...
- Windows常用注册表文件
内容转载自我的博客 目录 1. 删除Visual Studio的右键菜单 2. 恢复Visual Studio的右键菜单 3. 右键菜单添加功能 4. USB3.0连接安卓手机刷机出现问题 1. 删除 ...
- Vue 项目推荐,Github 过万 Star
电鸭社区-远程工作-自由职业-兼职外包-自由从这开始 嗨,我是 Martin,也叫老王.不少小伙伴,说自己是转行.自学,没有项目,今天推荐一个 Vue 实战项目 还记得 Martin 仿写过在线 Ma ...
- 脱壳实践之寻找OEP——堆栈平衡法
0x00 前言 上一篇介绍了壳程序的加载过程以及通过两次内存断点法寻找OEP,这篇我们将利用新的的方法——堆栈平衡法来寻找OEP. 0x01 堆栈平衡法原理 堆栈平衡原理就是利用壳程序在运行前后需要 ...
- 央行数字货币(CBDCs)的互操作性至关重要
CBDCs(央行数字货币)将在我们的有生之年产生重大的金融转变.然而,除非这些工具吸取了法定货币的教训,否则创新将毫无意义.互操作性一直是影响CBDC采用和功能的最重要障碍之一.因此,各国央行在这一理 ...