AndroLua 项目接入远程更新 & 公告功能

Requirement

AndroLua+ or Fusion App or other develop toolkit based on AndroLua.

Import

Open and edit the main.lua, copy and paste the following code after the require "import" statement.

import "cjson"
import "android.app.AlertDialog"
import "android.app.ProgressDialog"

Check Network

We have to check the status of user's network connection (required permissions: Check Network Connection Status, View WLAN Connection, Full Network Access)

if(activity.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo() == nil) then
  AlertDialog.Builder(this)
  .setTitle("Alert")
  .setMessage("Your device didn't connect to the Internet or the network you've using now didn't work. Please check your network settings.")
  .setNeutralButton("Confirm", 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。

2023.08.05 补充:现在不建议用 Gitee 作静态文件托管,因为其对所有原始数据链接都有防盗链(包括图片和文本),而且平台有较严重的文字狱现象。

如有必要可以参考用 GitHub 存放,然后利用非大陆服务器反代 raw.githubusercontent.com 或 cdn.jsdelivr.net 域名。

接着我们要发起一个 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

特殊说明

  1. 源码可自改,当必须留版权(开发者网名、博客等信息)

  2. 如要类似『疾客刷步』的贴顶栏单条滚动轮播公告,请关注即将开源的 GKModStep

  3. 一般用 AndroLua 开发的软件都有启动图(没有自定义的就用预存的),打开还在启动图页后面代码就已经在运行了,为了展示完整的加载效果和让用户有更多时间阅读更新内容和公告内容,你可以将以上从 检查网络 开始的所有代码拼接完后封包到一个函数里,然后在你的 main.lua 文件最后加入下面代码(第五行开始)以延迟执行:

function update()
  --上面那些代码拼凑至此
end

task(1500, function()
  --1500指延迟1500ms(1s),可自定义
  update()  --执行的函数
end)
  1. 最后,为了代码可读性,请记住一定要格式化(formatting)代码!!!

END

废话至此,望可祝您开发顺利!

完整代码有需者评论区提出,且莫纯英评论!

阅读剩余
THE END