安卓 APP
之前的项目一直是使用 hbuilder 基于 HTML5 来开发 android 和 ios 应用。但是在考虑做一款个人 app 的时候,三方打包的扩展性很低 ,原生程序基本属于暗箱操作。kotlin 又是 google 官方开发语言,所以打算使用 kotlin 开发 app 的壳子,同时也方便今后的封装。
编辑器
可以使用两种比较流行的编辑器编辑安卓项目。
sdk
sdk 是 android 开发工具包,同时包含了虚拟机方便开发调试。sdk 通常是可以通过编辑器自动下载,如果下载失败,需要手动配置。我通过 android-studio 下载了 sdk ,查看 sdk 配置信息:
TIP
android sdk location should not contain whitespace,sdk 的安装目录不能包含空格。
谷歌开发者推荐使用 android studio。
start a project
打开 ide 后会下载 gradle(一个打包工具) ,若下载失败,可以在 C:\Users\Administrator\.gradle\wrapper\dists
中手动放置。
如何运行
首先需要安装 android sdk,我通过在线完成安装。点击图标,查看 sdk 。
查看安装的 api 版本,然后运行。
- 1: 使用 usb 调试,这是最方便最直接的方式。
- 2: 使用已有的虚拟机调试,这种方式需要搭建环境。
- 3:创建新的虚拟机。
如果是为了快速创建项目,虚拟机会耽误很多时间,并且可能会该下载的都下载完成了,还需要更改 BIOS 虚拟机控制,比较坑。
查看页面
手机 usb 调试,需要开启开发者模式,允许 usb 调试,本文对此就不再赘述了。
TIP
出现 Error Installing APKs,打开 file/settings/build,execution,deployment/instant run/首项 enable 选框去掉勾选
创建一个 webview
接下来就是需要做的核心内容了,现在的思路是,在 activity 中创建 webview,通过 webview 加载服务器端(为了提速也可以放在项目中)的代码, 显示在页面上,我整理了一下加载 webview 的步骤:
在 activity 中创建 webview
// 目前先不考虑属性设置,只考虑目标
<WebView
android:id="@+id/webView1"
android:layout_below="@+id/text_endLoading"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp" />
将网页插入 webview
// 引入 webview 对象,实例化并赋值为 activity 中的 webview,前端同学可以理解为 `findByID` 。
import android.webkit.WebView
class MainActivity : AppCompatActivity() {
// 定义 webview
private var webView: WebView? = null
// 默认生成,把 activity 展示出来
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 执行新增的初始化方法
init()
}
// 我新增的初始化方法
private fun init() {
// 将 webview 和 页面中的 webview 组件绑定
webView = findViewById(R.id.webView1)
// 加载链接
webView!!.loadUrl("http://www.baidu.com/")
}
}
TIP
这里的 kotlin 语法相信熟悉 typescript 的同学都能发现,语法太相近了。相信之后上手也会提高很多效率。从而也可以看出,如今的“端”实在太多, android,ios,webapp,微信小程序,pc,桌面端,快应用... 我想会有一门语言或者一个规范来限制约定 api,让多端统一更容易。
允许网络访问
此时运行项目,会发现 net::ERR_CLEARTEXT_NOT_PERMITTED
。从Android 9.0(API级别28)开始,默认情况下禁用明文支持。因此http的url均无法在webview中加载。
因此需要配置访问权限。
// 在mainfest 中加入
<uses-permission android:name="android.permission.INTERNET"/>
// application 中加入属性
android:usesCleartextTraffic="true"
现在可以正常访问页面了,但是页面是弹出到系统自带浏览器,想要的效果是在 webview 中直接显示。
使用 app 内浏览器访问
// 在 init 中执行
// This inspection reports calls to Java get and set methods that can be replaced with the use of Kotlin synthetic properties.
webView!!.setWebViewClient(webClient)
private val webClient = object : WebViewClient() {
// 此处 shouldOverrideUrlLoading 被删除线, 不推荐重写,是否还有其他方案?
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
return false
}
}
TIP
android-studio 中 java 代码可以自动转换为 kotlin 。此处有些类似 ts 和 js 的关系,语法检查会抛出警告或异常,但是不会阻止运行,因为最终 仍然是 java 代码运行在 java 虚拟机上。
优化代码警告
// 改为 kotlin 推荐的方式调用 webViewClient 的 get set 方法
webView!!.webViewClient = webClient
调试开发环境
首先开启自己的前端项目,确保手机和 pc 处于同一局域网,然后修改 webview 访问地址。