首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Titanium中Android模块开发指南(汉语言)

2012-08-15 
Titanium中Android模块开发指南(中文)官方地址:Android Module Development Guide摘要本指南教你如何在Tit

Titanium中Android模块开发指南(中文)
官方地址:Android Module Development Guide

摘要
本指南教你如何在Titanium中开发Android模块从而扩展Titanium的功能. 在本指南中,你将会学习到以下几点:
设置你的环境能够构建Android模块构建一个Android模块打包一个Android模块理解Android模块API
Titanium Android模块开发指南
为了使用Android模块SDK, 你必须具有Android SDK相关的知识. 本指南将假定你知道如何使用原生的Android SDK进行开发.

前提条件
Titanium Mobile SDK 1.5 及以上版本最新版的Python( >= 2.5), 必须在PATH路径中, 或定义PYTHONHOME常量         在Windows中, Titanium Developer / Desktop绑定了Python2.5,因此不需要额外配置Oracle JDKAndroid SDKAnt 1.7.1 或以上版本,必须包含在PATH中.         如果你不想单独安装Ant,你可以使用Eclipse

环境设置
参照 Titanium命令行工具 完成环境设置.

创建一个模块
要创建一个模块,我们需要传递一些参数给titanium命令行工具.
模块的名字 ($MODULE_NAME) 和ID ($MODULE_ID)模块的目标运行平台 (android)Android SDK的安装目录 ($ANDROID_SDK) 例如 /opt/android-sdk
对于一个Android, 我们以如下参数创建一个模块:
按下“Finish”后,就应该能够在Eclipse的”Package Explorer “下看到你的模块工程了.
构建模块zip
dist目录下的zip包是模块的可分发形式, 它通常遵循的命名模式为$MODULE_ID-android-$MODULE_VERSION.zip
其中包含:
编译的包含类,生成的绑定,以及资源文件的JAR包lib目录中的第三方JAR包模块清单, 包括作者,版本,许可,版权等部署需要的元数据模块的timodule.xml文件
通过Ant从命令行构建
如果ant已经在PATH中, 你可以简单地在模块顶层目录执行, 你会看到如下输出:
<!-- $MODULE_VERSION should be the same as "version" in the module manifest --> [*]<modules> [*] <module version="$MODULE_VERSION">$MODULE_ID</module> [*] <!-- For example, if we were adding the calc module: --> [*] <module version="0.1">org.appcelerator.calc</module> [*]</modules> 在应用程序代码中使用 require 函数包含模块代码到应用程序中, 例如:

var Module = require('$MODULE_ID');[*]// For example, to load the calc module:[*]var Calc = require('org.appcelerator.calc');
下一次应用程序启动或构件时, 模块应该被包含在应用程序中了.[/list]
用嵌入的Example项目进行测试
使你的模块能够工作,最简单的方法是在example/app.js文件中编写代码,并使用ant运行和测试模块代码. example目录等同于应用程序的Resources目录.

运行示例项目的过程非常简单:
运行android模拟器模拟器启动后便可运行你的模块代码了.
运行Android模拟器
从命令行在模块项目木下运行:
点击Apply然后运行这样你就可以通过外部工具菜单(或者工具栏)的run运行这个启动配置
你应该能看到在Eclipse的控制台窗口,emulator有输出信息
运行Example项目

Once the emulator is up and running, you just need to wait for the unlock screen to appear, and you can start running your project. Make sure to unlock the screen so you’ll see the example project when it launches.

From command line, run this inside your module project:



生成模块和Example代理

作为初始创建项目的一部分,Titanium产生两个示例项目中使用的类:
module类, 如: src/org/appcelerator/calc/CalcModule.javaproxy类, 如: src/org/appcelerator/calc/ExampleProxy.java
产看这些代码来了解一下Modules和Proxies是怎么样跟Javascript通信的,在下一节将简要介绍了Titanium 和Kroll的API。

Android Titanium API

模块和代理(Kroll part 1)
一个模块是一个静态的、可选的顶级接口点,总是可以通过相同的名字访问.Titanium.UI 和 Titanium.App 就是两个在顶级API TItanium对象下的两个Module例子.代理是能够被用于通过一个模块或其他代理创建和查询的动态对象.当你使用“Titanium.UI.createView”:http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.UI.createView-method.html 创建一个原生视图时, 视图对象本身就是一个代理模块和代理都能够向Javascript API导出方法,属性,常量以及getters/setters方法.
模块
必须使用 @Kroll.module 符号标注,并继承 KrollModule 类模块可以有父模块, 比如 “Titanium.App.Properties“http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.App.Properties-module 模块就存在于 Titanium.App 下可以给定一个唯一的ID用于require()可以导出为顶级对象(与Titanium同级)
代理
必须使用 @Kroll.proxy 符号标注, 并继承 KrollProxy 类当使用 @Kroll.proxy#creatableInModule() 时, 有一个生成的 “create” 方法.有内置的事件管理
导出方法和属性(Kroll part 2)

方法

代理和模块的方法通过 @Kroll.method 符号标注进行导出. 下面是一个简单的例子:

@Kroll.methodpublic String getMessage() {    return "Hello World";}

如果你导出的方法要求当前Activity, 你可以添加 KrollInvocation 作为第一个参数:

@Kroll.methodpublic String getMessage(KrollInvocation invocation) {    Activity activity = invocation.getTiContext().getActivity();}

方法还有许多其他的选项, 详细信息可查看 @Kroll.method Javadoc

属性

属性可以以两种不同的形式导出:

1,getter/setter方法通过 @Kroll.getProperty 和 @Kroll.setProperty 符号导出, Getter/setter方法还可以被导出为Kroll方法(这是在Titanium中常用的模式)
2,使用 Kroll.property 符号导出为一个对象字段(使用反射,速度稍慢)

该示例为message属性导出了一个getter和setter, 以及同名的方法:

@Kroll.getProperty @Kroll.methodpublic String getMessage() {        return "Hello World";}@Kroll.setProperty @Kroll.methodpublic void setMessage(String message) {    Log.d(TAG, "Tried setting message to: " + message);}

在Javascript中可以这样使用:

var object = //..object.message = "hi"; // orobject.setMessage("hi");


常量

常量是 @Kroll.module 中的以及静态属性, 该字段以 “@Kroll.constant” 符号标注, 必须是static和final, 这儿有一个例子:

@Kroll.modulepublic class MyModule extends KrollModule {    @Kroll.constant    public static final int CONSTANT = 100;}

常量可以直接使用: Ti.My.CONSTANT == 100

视图

在Titanium中视图必须要有2个class::

视图代理: TiViewProxy的子类
负责视图属性和方法暴露给JavaScript(和一般代理做的一样).实现TiUIView的createView(Activity activity)方法来返回一个TiUIView的实例很多时候,你想在UI线程中调用你的UIView,参考 @Kroll.method#runOnUiThread
视图实现: TiUIView的子类
必须用视图的一个实例来调用setNativeView,无论是在构造函数中,或在processProperties视图实现负责从视图代理的获取数据,并直接应用到本地View这个类可以选择性的实现propertyChanged 和 processProperties,当用户在proxy中设置了属性的话会的得到通知。作为了一个简单的例子,参考Button 的实现方法ButtonProxy 和TiUIButton

重量级和轻量级窗口

当用户使用Titanium.UI.createWindow API 创建一个窗口时, 运行一些检查来告知是否创建应该是 heavy weight:

如果一个窗口被设置了以下任何一个属性的话,他就是”heavyweight“: fullscreen, navBarHidden, modal, windowSoftInputMode, 或者tabOpen:true相反的话, 他就是”lightweight“Heavyweight窗口会在栈中生成一个新的Activity,而且也一直为窗口创建新的Javascript ContextLightweight窗口创建的时候一个全屏的View(调用代码是相同的Activity) ,如果设置了url属性的话,也会为每个窗口创建新的Javascript Context
线程安全

从Javascript的Context(潜在的任何Activity或Thread)调用一个方法或者属性的话,在设计你的API的时候,很重要的一点是保证线程安全。

为了确保一个方法是在UI线程上执行, 可以参考 @Kroll.method#runOnUiThread(). 以下是例子:

@Kroll.proxypublic class MyProxy extends KrollProxy {  @Kroll.method(runOnUiThread=true)  public int doSomething() {    return 100;  }}
1 楼 RomKK 2012-03-07   楼主太棒了,终于找到一个titanium专业的博客了, 楼主能翻译一下iphone模块开发吗?现在正在这一块遇到一些问题。 2 楼 RomKK 2012-04-11   generate.bindings:

pre.compile:

ndk.build:
    [mkdir] Created dir: /Users/romkk/Workspace/Titanium/ti-adview/build/generated/jni
     [copy] Copying 1 file to /Users/romkk/Workspace/Titanium/ti-adview/build/generated
     [copy] Copying 1 file to /Users/romkk/Workspace/Titanium/ti-adview/build/generated/jni
     [echo] /Applications/Java/Dev/android-ndk-r4b/ndk-build
     [echo] "TI_MOBILE_SDK=/Users/romkk/Library/Application Support/Titanium/mobilesdk/osx/1.8.1"
     [echo] "NDK_PROJECT_PATH=/Users/romkk/Workspace/Titanium/ti-adview/build/generated"
     [echo] "NDK_APPLICATION_MK=/Users/romkk/Workspace/Titanium/ti-adview/build/generated/Application.mk"
     [echo] "PYTHON=python"
     [echo] "V=0"
     [exec] jni/Android.mk:24: warning: overriding commands for target `/Users/romkk/Workspace/Titanium/ti-adview/build/generated/KrollGeneratedBindings.cpp'
     [exec] jni/Android.mk:24: warning: ignoring old commands for target `/Users/romkk/Workspace/Titanium/ti-adview/build/generated/KrollGeneratedBindings.cpp'
     [exec] jni/Android.mk:27: warning: overriding commands for target `/Users/romkk/Workspace/Titanium/ti-adview/build/generated/BootstrapJS.cpp'
     [exec] jni/Android.mk:27: warning: ignoring old commands for target `/Users/romkk/Workspace/Titanium/ti-adview/build/generated/BootstrapJS.cpp'
     [exec] make: *** No rule to make target `Support/Titanium/mobilesdk/osx/1.8.1'.  Stop.

BUILD FAILED
/Users/romkk/Library/Application Support/Titanium/mobilesdk/osx/1.8.1/module/android/build.xml:233: exec returned: 2

热点排行