展会信息港展会大全

Titanium中Android模块开发:移植到1.8版本上
来源:互联网   发布日期:2016-01-19 11:22:00   浏览:1718次  

导读:官方地址:Android Module Porting Guide for 1 8 0 1概要伴随着Titanium Mobile 1 8 0 1的发布, 对于Android的支持改变成支持多个Javascript引擎(V8和Rhino) 这个变化也影响了很多的APIs和第三方modu ...

官方地址:Android Module Porting Guide for 1.8.0.1

概要

伴随着Titanium Mobile 1.8.0.1的发布, 对于Android的支持改变成支持多个Javascript引擎(V8和Rhino). 这个变化也影响了很多的APIs和第三方modules. 尽管平台的变化, 大多数内部module需要修改的地方也就是简单的方法标记,类型重命名, import 位置。

Manifest变化

开发在Titanium Mobile 1.8.0.1 (或者更高)的第三方modules需要在module manifest中设置一个新的属性:apiversion,值为2.

引用

apiversion: 2

如果你创建一个新的第三方module的话,Titanium Mobile 1.8.0.1会为你的工程自动生成这个属性,但是,如果是已经有的工程的话,你需要手动的添加这个属性,而且确保你重新编译你的module(参照下边 的Build变化):

引用

$ ant clean && ant

Build变化

为了能使用新的V8引擎,所有的第三方Module都需要Android NDK来编译V8,可以从Google下载获取最新的NDK::

http://developer.android.com/sdk/ndk/index.html

编译Module之前,需要设置环境变量ANDROID_NDK:

引用

$ export ANDROID_NDK=/path/to/android-ndk

$ ant

当然,你也可以在build.properties中设置android.ndk属性:

引用

android.ndk=/path/to/android-ndk

你还得更新你的build.properties文件(如果使用Eclipse的话也要更新.classpath文件)来引用Titanium Mobile 1.8.0.1 和 API level 8 或者更高::

引用

titanium.sdk=/Library/Application\ Support/Titanium/

titanium.os=osx

titanium.version=1.8.0.1

android.sdk=/usr/android-sdk

titanium.platform=${titanium.sdk}/mobilesdk/${titanium.os}/${titanium.version}/android

android.platform=${android.sdk}/platforms/android-8

google.apis=${android.sdk}/add-ons/addon_google_apis_google_inc_8

基本变化

1. Remove TiContext.

TiContext is being replaced, and any implementation utilizing TiContext will take a performance / stability hit compared to using the desired API's directly.

In most of the places where TiContext is used as an argument, the TiContext argument can be removed entirely or replaced with an Activity reference.

Example:

Js代码

TiDrawableReference.fromUrl(proxy.getTiContext(), tiImage)

becomes:

Js代码

TiDrawableReference.fromUrl(proxy.getActivity(), tiImage)

In the specific case of fromUrl, the following form can also be used:

Js代码

TiDrawableReference.fromUrl(proxy, tiImage)

The specific alternative varies based on which API point is being modified, but generally there is a very simple alternative that can be used.

2. Use KrollFunction instead of KrollCallback

KrollFunction has been added, and KrollCallback has been removed; The dual runtime change required a common interface to be defined to replace KrollCallback.

In most cases, a direct replacement of KrollCallback with KrollFunction should suffice.

主要变化

Known compatibility points that need to be changed:

1. Remove KrollInvocation as a method argment.

Example:

Js代码

@Kroll.method

public void myMethod(final KrollInvocation invocation, KrollDict args)

becomes:

Js代码

@Kroll.method

public void myMethod(KrollDict args)

2. Remove TiContext from your module constructor. super(TiContext) will no longer work due to the previously mentioned TiContext change. In most if not all cases, simply removing the argument will address the problem.

Example:

Js代码

public BoxModule(TiContext context) {

super(context);

}

becomes:

Js代码

public BoxModule() {

super();

}

3. When replacing KrollCallback with KrollFunction, you need to to pass a KrollObject argument to the call and callAsync methods.

Example:

Js代码

KrollCallback success = (KrollCallback)args.get("success");

...

success.callAsync(event);

becomes:

Js代码

KrollFunction success = (KrollFunction)args.get("success");

...

success.callAsync(proxy.getKrollObject(), event);

4. Change getView() on a TiViewProxy to getOrCreateView()/

Example:

Js代码

View view = myViewProxy.getView();

becomes:

S代码

View view = myViewProxy.getOrCreateView();

5. Change TiDrawableReference.fromUrl(proxy.getTiContext(), tiImage) to TiDrawableReference.fromUrl(proxy.getActivity(), tiImage) due to the TiContext change. Same applies to all the "from<source>" methods in TiDrawableReference.

Example:

Js代码

TiDrawableReference ref = TiDrawableReference.fromBlob(context, blob);

becomes:

Js代码

TiDrawableReference ref = TiDrawableReference.fromBlob(getActivity(), blob);

6. <KrollInvocation>.getActivity() no longer exists. getActivity can be called on each proxy to get the activity for that proxy or TiApplication.getAppCurrentActivity() and TiApplication.getAppRootActivity() can be used for getting activity instances to work with. In general, system services, etc., can and should use the root activity if it exists. TiApplication.getRootOrCurrentActivity() will serve this purpose in the vast majority of situations.

Example:

Js代码

Activity activity = invocation.getActivity();

becomes:

Js代码

Activity activity = TiApplication.getAppRootOrCurrentActivity();

7. Calling addOnLifeCycleEvent on a module is no longer necessary. Modules are now automatically registered to receive the lifecycle events (onPause, onResume, onStart, onStop, and onDestroy).

8. <KrollEventManager>.addOnEventChangeListener() is no longer supported. The new mechanism for this is to override KrollProxy.eventListenerAdded, and move the code from the listenerAdded method into the overridden eventListenerAdded method after the call to super.eventListenerAdded.

Example:

Js代码

@Override

public void eventListenerAdded(String type, int count, KrollProxy proxy)

{

super.eventListenerAdded(type, count, proxy);

// this is the logic that used to live inside the listenerAdded() method

if (MY_CUSTOM_EVENT.equals(type)) {

invokeMyCustomMethod();

}

}

9. resolveUrl has been moved to the proxy object.

Example:

Js代码

_proxy.getTiContext().resolveUrl(url);

becomes:

Js代码

_proxy.resolveUrl(url);

10. Change getModuleById to getModuleByName and specify the module name in the module constructor. By default the module cannot be found by calling getModuleByName. You must use the form of super() in the module constructor that allows you to specify the module name.

Example:

Js代码

public myModule(TiContext tiContext) {

super(tiContext);

}

...

TiApplication appContext = TiApplication.getInstance();

MyModule myModule =(MyModule)appContext.getModuleById("ti.mymodule");

becomes:

Js代码

public myModule() {

super("mymodule");

}

...

TiApplication appContext = TiApplication.getInstance();

MyModule myModule = (MyModule)appContext.getModuleByName("mymodule");

11. <TiContext>.getAndroidContext() no longer exists. If the ContextWrapper returned originally is being used to access system or app level resources, use TiApplication.getInstance() or TiApplication.getInstance().getApplicationContext() instead. To get the ContextWrapper for the top most Activity, use TiApplication.getAppCurrentActivity() instead.

Example:

Js代码

myFunction(context.getAndroidContext());

becomes:

Js代码 <

myFunction(TiApplication.getInstance().getApplicationContext());

12. getContext() on a TiProxy no longer exists because its purpose was to return a TiContext instance. This call should no longer be needed in module implementation once TiContext is no longer being passed in as an argument (the normal use case for this method).

Example:

Js代码

Context context = proxy.getContext();

becomes:

Js代码

Context context = TiApplication.getInstance().getApplicationContext();

13. Remove context from TiFileFactory.createTitaniumFile.

Example:

Js代码

TiBaseFile file = TiFileFactory.createTitaniumFile(context, fileURL, false);

becomes:

Js代码

TiBaseFile file = TiFileFactory.createTitaniumFile(fileURL, false);

14. getChangeDir is now called on the TiApplication instance.

Example:

Js代码

_proxy.getContext().getCacheDir()

becomes:

Js代码

TiApplication.getInstance().getCacheDir()

15. Overriding the fireEvent method requires a change to the method signature. The argument has changed from a KrollDict class to an Object.

Example:

Js代码

@Override

public boolean fireEvent(String eventName, KrollDict data) {

...

}

becomes:

Js代码

@Override

public boolean fireEvent(String eventName, Object data) {

...

}

16. <KrollInvocation>.getTiContext() no longer exists. TiContext is no longer needed. Some examples show this being used to get the TiApplication instance. TiApplication.getInstance() can be used instead.

17. Change usage of KrollDict in method signatures to HashMap. Dictionary values are now passed to methods as HashMap objects. If you need to access any of the KrollDict methods on the HashMap object you can create a KrollDict object from the HashMap object.

Example:

Js代码

public void myMethod(KrollInvocation invocation, KrollDict args)

{

TiBlob blob = (TiBlob) args.get("image");

int myId = args.getInt("id);

becomes:

Js代码

public void myMethod(HashMap args) {

KrollDict argsDict = new KrollDict(args);

TiBlob blob = (TiBlob) args.get("image");

int myID = argsDict.getInt("id");

18. runOnUiThread is no longer supported. You must explicitly manage and call your methods on the UI thread where necessary. Specifically, you can use the TiMessenger class to run code on the UI thread.

Example:

Js代码

@Kroll.method(runOnUiThread = true)

public void refresh() {

if (_view != null)

_view.refresh();

}

becomes:

Js代码

private static final int MSG_REFRESH = 50000;

private final Handler handler = new Handler(TiMessenger.getMainMessenger().getLooper(), new Handler.Callback ()

{

public boolean handleMessage(Message msg)

{

switch (msg.what) {

case MSG_REFRESH: {

AsyncResult result = (AsyncResult) msg.obj;

handleRefresh();

result.setResult(null);

return true;

}

}

return false;

}

});

private void handleRefresh()

{

_view.refresh();

}

@Kroll.method

public void refresh() {

if (_view != null) {

if (!TiApplication.isUIThread()) {

TiMessenger.sendBlockingMainMessage(handler.obtainMessage(MSG_REFRESH));

} else {

handleRefresh();

}

}

}

赞助本站

人工智能实验室

相关热词: Titanium 移植

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港