You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:43:03