热更新介绍

  • 什么是热更新?

客户端启动时,主动请求服务端检查版本号,并更新资源到本地。

  • 应用场景:
  • 情况一:客户端已经发布了,但突然发现有个比较严重的bug需要修复。这时需要更新客户端的代码(Lua代码)。
  • 情况二:情人节到了,需要搞个活动,在客户端中营造一个节日氛围。这时,需要更新客户端资源或增加一些功能。
  • 好处:

不需要重新打包和提交应用到市场等待审核。

Android与Lua相互通信

参考资料:

  • Lua 5.1 在线参考手册
  • 开源项目LuaJava

1. 在Android项目中使用Lua,需要两个步骤:

  1. 加载Lua脚本解析引擎
  2. 以Native API方式调用引擎接口

直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua C实现函数的Java接口。

2. 需注意的地方:

  • .lua文件可存放在assets、raw文件夹;
  • 提供给lua的回调必须是public,否则lua调不到;
  • “.”是用来调用类的方法或变量(静态方法),而“:”是用来调用对象的方法。

3. 在Lua中调用Java类:

  • newInstance(className, …) // 可以根据类名创建一个Java类,同时返回一个lua变量与Java类对应
-- 启动手机设置function launchSetting(context)  -- 得到Intent类的实例  intent = luajava.newInstance("android.content.Intent")  c = luajava.newInstance("android.content.ComponentName","com.android.settings", "com.android.settings.Settings")  -- intent:用来调用对象的方法   -- intent.用来调用类的方法或变量(静态方法)  intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK);  intent:setComponent(c)  context:startActivity(intent)end
  • bindClass(className) // 可以让lua中的变量对应一个Java的类(是类,不是实例),这样就可以用lua的这个变量创建实例以及调用静态类
require 'import'button_cb = {}function button_cb.onClick(ev)  print('hello,world')  launchSetting(activity)end--[=[ 因为id是R.java里的一个静态类,所以引用Button的资源文件用下面的代码:   id.launchButton,而不是id:launchButton ]=]local id = luajava.bindClass("sk.kottman.androlua.R$id")local launch = activity:findViewById(id.launchButton)-- 另外,注意类中类的引用方法,如:android.view.View$OnClickListenerbuttonProxy = luajava.createProxy("android.view.View$OnClickListener", button_cb)launch:setOnClickListener(buttonProxy)

4. 在java中调用Lua:

  1. LuaState mLuaState = LuaStateFactory.newLuaState(); // Lua解析和执行由此对象完成
  2. mLuaState.openLibs();
  3. 调用Lua脚本语句:
private void executeLuaStatemanet() {    mLuaState.LdoString(" varSay = 'call from android : This is string in lua script statement.'");// 定义一个Lua变量    mLuaState.getGlobal("varSay");// 获取    displayResult1.setText(mLuaState.toString(-1));// 输出}

4.调用Lua脚本文件:

private void executeLuaFile() {    mLuaState.LdoString(readStream(getResources().openRawResource(R.raw.luafile)));    mLuaState.getField(LuaState.LUA_GLOBALSINDEX, "functionInLuaFile");// 找到functionInLuaFile函数    mLuaState.pushString("从Java中传递的参数");// 将参数压入栈    // functionInLuaFile函数有一个参数,一个返回结果    int paramCount = 1;    int resultCount = 1;    mLuaState.call(paramCount, resultCount);    mLuaState.setField(LuaState.LUA_GLOBALSINDEX, "resultKey");// 将结果保存到resultKey中    mLuaState.getGlobal("resultKey");// 获取    displayResult2.setText(mLuaState.toString(-1));// 输出}

5.调用android API:

private void callAndroidAPI() {    mLuaState.LdoString(readStream(getResources().openRawResource(R.raw.luafile)));    mLuaState.getField(LuaState.LUA_GLOBALSINDEX, "callAndroidApi");// 找到callAndroidApi函数    mLuaState.pushJavaObject(getApplicationContext()); // 上下文    mLuaState.pushJavaObject(mLayout); // 布局    mLuaState.pushString("lua call android Textview的setText()方法, 内容是:" + (++count)); // 内容    mLuaState.call(3, 0); // callAndroidApi函数需要传递3个参数,0个返回值}

6.raw文件目录下luafile.lua代码:

-- 调用Lua脚本文件function functionInLuaFile(key)    return 'call from android: I am in Lua file . Return : '..key..'!'end-- 调用android APIfunction callAndroidApi(context,layout,tip)    tv = luajava.newInstance("android.widget.TextView",context)    tv:setText(tip)    layout:addView(tv)end

更多相关文章

  1. android中bitmap压缩的几种方法详解
  2. android vold初始化及sd卡挂载流程
  3. Android(安卓)onTouchEvent 返回值不同时对事件的传递的影响
  4. 【Android(安卓)前沿技术】用MediaPlayer+TextureView封装好的视
  5. Android中关于画布Skew,斜切操作的计算方式
  6. Android获取View的宽度和高度
  7. Android(安卓)6.0以上权限拒绝打开权限设置界面的解决方法
  8. 大厂面试,居然还问这些问题!
  9. C#实现Android自动打包工具

随机推荐

  1. android-adb调试与sqlite远程shell(andro
  2. Android系统应用层App启动过程分析
  3. (20120731)android面试总结(002)
  4. OS X环境下如何搭建编译Cocos2D-X v3.x的
  5. 3.0之后在LinearLayout里增加分割线
  6. android中几个EditText的内容相关联的设
  7. Android(安卓)View measure(0,0)的作用
  8. android View与ViewGroup研究
  9. Android(安卓)金额转大写
  10. 5 个顶级 Android(安卓)开源库