基于 AndroLua 开发的项目如何接入远程更新 & 公告功能
瞎扯
大家应该知道最近站长在维护他的两个儿子:『QzSharer』 和『疾客刷步』。
这两个软件功能其实很简单,但是对于伪大佬的站长来说可谓是难于上青天,但是收获总是有的,至少随着能力的提升,我越来越能完善(抄)代码了。
这次给站长收获最大的就是抛弃了以往使用别人程序进行远程更新/公告的方式,自己写了一个,功能还不比别人写的差,虽然还是抄了一点,但是我觉得值!
正文
注意看标题,我们今天讨论的是基于 AndroLua 开发软件的教程,站长平时用的是 @nirenr 开发的 AndroLua+,若你并不涉入相关开发,请划走~
开始讲代码
需要导入的库
这个视个人情况而定,但是这个必须给我加上(请先新建工程后在 main.lua
里编辑,最好放在文件头 require "import"
之后):
import "cjson"
import "android.app.AlertDialog"
import "android.app.ProgressDialog"
检查网络
首先我们检查一下用户的联网情况(一定要先到工程的权限编辑处给工程添加查看网络连接情况、查看 WLAN 连接、拥有完全的网络访问权限权限):
if(activity.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo() == nil) then
AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("你未连接至互联网 或 当前连接的网络不可用,请检查你的网络设置")
.setNeutralButton("确定",nil)
.setNegativeButton("打开 数据连接",{onClick=function()
intent = Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)
this.startActivity(intent)
end})
.setPositiveButton("连接 Wi-Fi",{onClick=function()
intent = Intent(Settings.ACTION_WIFI_SETTINGS)
this.startActivity(intent)
end})
.show();
return false -- 就此中断,不再继续执行下面代码
end
获取内部版本号和版本名
接下来我们需要获取内部版本号和版本名,它们将分别用于比较大小和显示。
--获取内部版本号和版本名
local packinfo = this.getPackageManager().getPackageInfo(this.getPackageName(),((32552732/2/2-8183)/10000-6-231)/9)
local appinfo = this.getPackageManager().getApplicationInfo(this.getPackageName(),0)
local versionName = tostring(packinfo.versionName)-- 版本名(祭神版)
local versionCode = tonumber(packinfo.versionCode)-- 版本号(3)
『特效』添加一个加载对话框
--圆形旋转样式
check_update_dialog = ProgressDialog(this)
check_update_dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER)
check_update_dialog.setTitle("提示")
--设置进度条的形式为圆形转动的进度条
check_update_dialog.setMessage("正在检查更新中,请稍等片刻……\n\n小提示,如果检查更新长时间无反应,按手机「返回键」可以取消检查更新")
check_update_dialog.setCancelable(true)--设置是否可以通过点击Back键取消
check_update_dialog.setCanceledOnTouchOutside(false)--设置在点击Dialog外是否取消Dialog进度条
check_update_dialog.setOnCancelListener{
onCancel=function(l)
print("您取消了「检查更新」操作")
return false --不再执行下面的代码
end}--取消对话框监听事件
check_update_dialog.show()
这串代码是抄的。
接下来一个比较重要的事:
创建一个 config.json
文件
我们需要创建一个 JavaScript Object Nation 文件,命名随便,将其上传到服务器、虚拟主机、云储、Gitee、GitHub 等网络文件托管方式,得到文件的访问直链(直接访问不会自动下载)。(不建议用云笔记、网盘等,至少这些方式更麻烦,还得提取字符串)。
这里我创建了一个 shuabu_update.json
并上传到 Gitee 开源仓库,得到原始数据链接为:https://gitee.com/gkcoll/mydiys/raw/master/shuabu_update.json
。如果是 GitHub 请点 『raw』,但是按这访问稳定性,并不建议用 GitHub。
接着我们要发起一个 get 请求获取网页内容,并交由 cjson
转化为 lua 可识别的数组(他table,相当于 Python 中的字典,dict)。
Http.get("https://gitee.com/gkcoll/mydiys/raw/master/shuabu_update.json",function(code,resp)
info=cjson.decode(resp)
check_update_dialog.hide() --获取到内容后关闭加载框
--此处待补
end
如上,我们获取到了数据并储存在变量 info
里,在进行下一步之前,我有必要先列出我在云端放置的一些必要变量的参数名和值类型。
变量名 | 值类型 | 介绍 |
---|---|---|
internalVersion | int | 最新版本的内部版本号 |
title | str | 需要显示为标题的内容 |
versionName | str | 版本名 |
time | str | 发布时间 |
message | str | 更新日志 |
must | bool | 是否开启强制更新 |
notice_switch | bool | 远程公告开关 |
notice | str | 远程公告内容 |
大家可以仿照上面修改一下自己的 config 文件。
正式的更新 & 公告代码
接着在上面代码的『此处待补』处输入下面代码:
--此处为原创,请保留作者版权信息:
--@灰尘疾客, Blog:www.gkcoll.xyz
--activity.finish()方法为退出软件/页面,达到强制更新的效果
if versionCode < info["internalVersion"] then
AlertDialog.Builder(this)
.setTitle(info['title'])
.setMessage("版本名:【"..info['versionName'].."】(已安装【"..versionName.."】)".."\n发布时间:"..info['time'].."\n更新日志:\n"..info['message'])
.setPositiveButton("发布地址",function()
--其它自定义事件
activity.finish()
end)
.setNeutralButton("网盘更新",function()
--其它自定义事件
activity.finish()
end)
.setNegativeButton("取消",function()
if info['must'] == true then
print("此为重要的更新版本,开发者已设置强制更新,请进行更新!")
--其它自定义事件
--建议搞一个延迟退出,或者隐藏页面中主要功能的控件
end
end)
.show() -- 显示对话框
if info['must'] == true then --此处防止有人通过点击空白或back键关闭对话框后继续正常使用
print("此为重要的更新版本,开发者已设置强制更新,请进行更新!")
--其它自定义事件
--建议搞一个延迟退出,或者隐藏页面中主要功能的控件
end)
end
else
if info["notice_switch"] then
notice = info["notice"]
--获取到的公告内容在变量 notice 里
--其它自定义事件
end
end
特殊说明
-
源码可自改,当必须留版权(开发者网名、博客等信息)
-
如要类似『疾客刷步』的贴顶栏单条滚动轮播公告,请关注即将开源的 GKModStep。
-
一般用 AndroLua 开发的软件都有启动图(没有自定义的就用预存的),打开还在启动图页后面代码就已经在运行了,为了展示完整的加载效果和让用户有更多时间阅读更新内容和公告内容,你可以将以上从 检查网络 开始的所有代码拼接完后封包到一个函数里,然后在你的
main.lua
文件最后加入下面代码(第五行开始)以延迟执行:
function update()
--上面那些代码拼凑至此
end
task(1500, function()
--1500指延迟1500ms(1s),可自定义
update() --执行的函数
end)
- 最后,为了代码可读性,请记住一定要格式化(formatting)代码!!!
END
废话至此,望可祝您开发顺利!
完整代码有需者评论区提出,且莫纯英评论!
共有 0 条评论