如何将Android原生代码封装为Titanium模块以调用原生Activity
嘿,我来帮你搞定这个Titanium Android模块的事儿,解决你卡在TiViewProxy的困惑~下面是一步步的实操指南,把你的原生代码当成黑盒封装成模块,还能实现Activity调用+响应回调:
步骤1:搭建基础的Titanium模块骨架
首先用Titanium CLI生成模块的基础结构,打开终端跑这条命令:
ti create --type module --platform android --name MyNativeModule --id com.mynative.module
生成的目录里,android/src放原生Java代码,android/res放资源文件,timodule.xml是模块配置文件,这些是我们重点要改的地方。
步骤2:把原生“黑盒”代码塞进模块
- 把你的原生Java类(包括目标Activity)复制到
android/src对应的包路径下,注意包名要和模块的包名匹配,或者调整导入语句确保路径正确。 - 如果原生Activity需要权限(比如相机、存储),一定要在
timodule.xml里声明,比如:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> - 原生的布局、字符串等资源文件,直接复制到
android/res对应的子目录里就行。
步骤3:用TiViewProxy搭建JS和原生的交互桥(核心解决你的卡点)
TiViewProxy就是用来连接Titanium JS层和原生组件的中间层,我们用它封装启动Activity的逻辑,还能处理Activity返回的结果。
3.1 写自定义的Proxy类
在模块的src目录下创建一个继承自TiViewProxy的类,比如MyActivityProxy.java:
package com.mynative.module; import org.appcelerator.kroll.KrollDict; import org.appcelerator.kroll.KrollFunction; import org.appcelerator.kroll.KrollProxy; import org.appcelerator.kroll.annotations.Kroll; import org.appcelerator.titanium.TiApplication; import android.app.Activity; import android.content.Intent; @Kroll.proxy(creatableInModule = MyNativeModuleModule.class) public class MyActivityProxy extends KrollProxy { private static final int REQUEST_CODE = 1001; private KrollFunction callback; // 暴露给JS调用的方法,用来启动原生Activity @Kroll.method public void startNativeActivity(KrollDict options) { // 保存JS传过来的回调函数 if (options != null && options.containsKey("callback")) { callback = (KrollFunction) options.get("callback"); } // 获取当前Titanium的Activity,启动原生Activity Activity currentActivity = TiApplication.getInstance().getCurrentActivity(); Intent intent = new Intent(currentActivity, YourNativeActivity.class); // 如果需要给原生Activity传参数,在这里添加 if (options.containsKey("inputData")) { intent.putExtra("EXTRA_INPUT", options.getString("inputData")); } currentActivity.startActivityForResult(intent, REQUEST_CODE); } // 处理原生Activity返回的结果 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && callback != null) { KrollDict result = new KrollDict(); if (resultCode == Activity.RESULT_OK) { // 从返回的Intent里取数据,比如原生回传的内容 String response = data.getStringExtra("EXTRA_RESPONSE"); result.put("success", true); result.put("responseData", response); } else { result.put("success", false); result.put("message", "Activity canceled or failed"); } // 调用JS的回调函数,把结果传回去 callback.call(getKrollObject(), new Object[]{result}); } } }
3.2 在模块主类里注册Proxy
找到模块的主类(比如MyNativeModuleModule.java),添加Proxy的注册逻辑,让Titanium能识别它:
package com.mynative.module; import org.appcelerator.kroll.KrollModule; import org.appcelerator.kroll.annotations.Kroll; import org.appcelerator.titanium.TiApplication; @Kroll.module(name="MyNativeModule", id="com.mynative.module") public class MyNativeModuleModule extends KrollModule { @Override public void onAppCreate(TiApplication app) { super.onAppCreate(app); // 注册我们的自定义Proxy registerProxy(MyActivityProxy.class); } }
步骤4:编译模块并集成到Alloy项目
- 进入模块根目录,执行编译命令生成模块包:
生成的ti build --platform android --release.zip模块文件在dist目录下。 - 把这个zip包放到Alloy项目的
modules/android目录下(没有就手动创建)。 - 在项目的
app/config.json里添加模块依赖:"modules": { "com.mynative.module": "1.0" }
步骤5:在Alloy代码里调用模块
在你的Controller JS文件里,这样调用原生Activity并处理回调:
var MyNativeModule = require('com.mynative.module'); // 创建Proxy实例 var activityProxy = MyNativeModule.createMyActivity(); // 启动原生Activity,传参数+监听回调 activityProxy.startNativeActivity({ inputData: "Hello from Alloy!", callback: function(result) { if (result.success) { alert("原生返回的数据:" + result.responseData); } else { alert("出错了:" + result.message); } } });
几个关键提醒
- 确保原生Activity的类名和包名在Intent里引用正确,要是原生代码的包名和模块不一样,就得写完整类名(比如
com.your.native.package.YourNativeActivity)。 - 如果原生代码依赖第三方库,把
.jar或.aar文件放到模块的android/libs目录,还要在build.gradle里配置依赖。 - 调试的时候可以先单独跑原生代码确保Activity正常,再集成到模块里测试,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者empiresdev
相关产品推荐
相关产品推荐

