[转] Adobe AIR移动App的互相调用实现方式

在使用Adobe AIR进行移动应用开发的时候,我们或许会有这样的需求:假如我们开发的是两个应用(A和B),同时安装到手机上,那么能否在A中呼叫B并传递参数呢(或者反过来B操作后,再把参数返回给A)。目前AIR还没有直接呼叫某个APP的API,但我们可以使用手机特有的特性来实现。

第一种方式:使用ANE

假如我们的目标平台是Android,那么可以确定的是,Java是可以呼叫一个APP并传递参数的,所以我们可以借助Java实现的ANE来调用另一个APP(只要知道另一个APP的ID就可以了)。

首先打开Eclipse,创建一个Android项目,引入FlashRuntimeExtensions.jar,编写Extension,Context和Function(具体过程不再细述了,可以参阅创建ANE的初级教程),也可以在稍后的链接中下载Java部分的代码。主要是实现callApp这个Function,代码如下:

package com.techmx.extensions;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;public class CallAppFunction implements FREFunction {@Overridepublic FREObject call(FREContext arg0, FREObject[] arg1) {FREObject result = null;String appPackage;String appID;Intent myIntent = new Intent();try {Activity currentActivity = arg0.getActivity();appPackage = arg1[0].getAsString();appID = arg1[1].getAsString();myIntent.addCategory(Intent.CATEGORY_LAUNCHER);myIntent.setAction(Intent.ACTION_MAIN);myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);myIntent.setData(Uri.parse(arg1[2].getAsString()));myIntent.setClassName(appPackage, appID);currentActivity.startActivity(myIntent);} catch (Exception e) {// TODO: handle exception
        }return result;}
}

然后打开Flash Builder,创建一个库项目,和Java部分的接口相对应:

package com.techmx.extensions
{import flash.events.EventDispatcher;import flash.events.IEventDispatcher;import flash.external.ExtensionContext;/*** 通过一个传递的ID,启动另外一个应用*/public class CallAppExtension extends EventDispatcher{public static const CALL_APP:String = "callApp";public static const EXTENSION_ID:String = "com.techmx.extensions.CallAppExtension";private var extContext:ExtensionContext;public function CallAppExtension(target:IEventDispatcher=null){extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");}public function callApp(appPackage:String,appID:String,customURI:String):void{if(extContext){extContext.call(CALL_APP,appPackage,appID,customURI);}}}
}

然后就可以拿出SWC,和Java项目导出的JAR一起,打包为ANE文件。整个项目工程(包括ANE文件)可以点击这里下载:ANEPack2

然后我们就可以创建两个测试项目:MobileA和MobileB,类型都是ActionScript手机项目。在MobileA中,引入刚才创建的ANE文件,并调用扩展的方法来呼叫另一个应用,也就是MobileB。

MobileA的主体代码:

package
{import com.techmx.extensions.CallAppExtension;import flash.display.Sprite;import flash.events.MouseEvent;import flash.net.*;public class MobileA extends Sprite{public function MobileA(){super();var btn:Sprite = new Sprite();btn.graphics.beginFill(0x000000,1);btn.graphics.drawCircle(50,50,50);btn.graphics.endFill();addChild(btn);btn.addEventListener(MouseEvent.CLICK,clickHandler);}protected function clickHandler(event:MouseEvent):void{var extension:CallAppExtension = new CallAppExtension();//注意ID的规则,AIR会自动补上"air."和".AppEntry"extension.callApp("air.MobileB","air.MobileB.AppEntry","myarguments://me=neo&you=jack");}}
}

注意扩展方法的第三个参数,我们可以用自定义URI的方式传递参数,这里写的是myarguments,实际上你写成其它的值也没有关系,都可以传递过去。

在MobileB中,则可以生成一个文本对象,来显示收到的参数:

package
{import flash.desktop.NativeApplication;import flash.display.Sprite;import flash.events.InvokeEvent;import flash.text.TextField;import flash.text.TextFormat;[SWF(width="320",height="480")]public class MobileB extends Sprite{private var label:TextField;public function MobileB(){super();label = new TextField();var format:TextFormat = new TextFormat(null,28);label.width = 320;label.height = 480;label.defaultTextFormat = format;addChild(label);NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);}private function onInvoke(event:InvokeEvent):void{label.text = "Reason: "+event.reason;label.appendText("\n"+"Arguments: " + event.arguments);}}
}

将两个应用全部安装到手机上,然后打开MobileA,就可以点击黑色的圆圈呼叫MobileB。

第二种方式:使用自定义URI

使用ANE的方式,可以最大程度的使用底层API的便利,但对于项目还是不太方便。如果只是呼叫另一个APP的话,所幸我们还有另一个选择,就是使用自定义的URI。

这种方式就要求我们对那个需要被调用的应用(在这个例子中就是MobileB),在配置文件中注册一个自定义的URI,比如我们要注册一个“todoair”的URI,需要在配置文件中同时更改Android部分的定义和iOS部分的定义(如果您还要部署到iOS的话)。

<android><manifestAdditions><![CDATA[<manifest android:installLocation="auto"><application><activity><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.BROWSABLE"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="todoair"/></intent-filter></activity></application><uses-permission android:name="android.permission.INTERNET"/></manifest>
 ]]></manifestAdditions>
</android>
<iPhone><InfoAdditions><![CDATA[<key>UIDeviceFamily</key><array><string>1</string><string>2</string></array><key>CFBundleURLTypes</key><array><dict><key>CFBundleURLSchemes</key><array><string>todoair</string></array><key>CFBundleURLName</key><string>MobileB</string></dict></array>]]></InfoAdditions><requestedDisplayResolution>high</requestedDisplayResolution>
</iPhone>

然后先把MobileB打包安装到手机,接着来修改MobileA的代码,将调用方式修改为:

protected function clickHandler(event:MouseEvent):void
{//URL方式//navigateToURL(new URLRequest("todoair://me=neo&you=jack"));
}

这就可以了,打包MobileA到手机,运行效果和刚才基于ANE的方式是类似的:

这个方式不需要编写原生代码来配合,使用简单,但是一定要在配置文件中注册URI才会生效。另外您应该也注意到了,它使用navigateToURL来调用,说明这个方式用网页也是可行的。您可以在您的WEB网站上,用HTML中的A链接,结合注册的自定义URI,来启动您的应用。

Adobe AIR移动App的互相调用实现方式相关推荐

  1. adobe air linux centos,Adobe AIR(跨平台应用)

    Adobe AIR(跨平台应用)现在正式应用于android平台了,Adobe Air是一款独立的客户端应用软件,这些软件可以作为单独的程序安装使用,它可以使开发人员使用HTML.JavaScript ...

  2. mac上 关于Adobe air Installer 安装无响应

    本人也是为了安装 .air 文件困惑了好久,一直没安装上,我也搜了好多地方教程,终于有人给了我答案,亲身测试,确实可行,让大家都能快乐的安装需要的 air 文件. 1.去get.adobe.com/c ...

  3. 设置Adobe Air应用程序属性

    除了所有创建 AIR(Adobe Integrated Runtime )应用程序的需要的资源文件以外,Adobe AIR应用程序还需要一个应用程序描述文件,一个用来定义Adobe AIR应用程序基本 ...

  4. 利用Adobe AIR本地扩展支持Android开发

    http://bbs.9ria.com/thread-180609-1-1.html 学前准备... 2 所需知识... 2 额外工具... 2 用户等级... 2 例子文件... 2 设置AIR S ...

  5. 开发Adobe AIR移动应用程序的考虑事项

    来自:http://www.infoq.com/cn/news/2011/08/considerations-air-apps-mobile 扩展:http://mobile.51cto.com/Ad ...

  6. Android之Adobe AIR本地扩展

    来自:http://bbs.9ria.com/thread-180609-1-1.html 学前准备... 2 所需知识... 2 额外工具... 2 用户等级... 2 例子文件... 2 设置AI ...

  7. Adobe AIR移动应用中的文本输入

    Adobe AIR移动应用中的文本输入 语言:ActionScript 3.0 环境:Adobe AIR for Mobile 作者:@flashache 来自:AIR移动研究小组 简介: flash ...

  8. 分享用Adobe Air向iOS移植游戏的经验

    分享用Adobe Air向iOS移植游戏的经验 http://gamerboom.com/archives/47931 发布时间:2012-02-21 17:04:42 Tags:Adobe Air, ...

  9. adobe air 工程师_使用Adobe AIR将CSS带到桌面!

    adobe air 工程师 So, I've been issued a challenge at SitePoint to develop a piece of software in order ...

最新文章

  1. 修改 ShiroUser 缓存用户
  2. HTML5将重塑Web世界?,互联网营销
  3. USB和串口(COM)的区别,以及相互转换
  4. 5位无符号阵列乘法器设计_可变位宽的大规模矩阵乘法方法
  5. 问题与事务跟踪系统jira中的版本管理
  6. hibernate访问效率相关
  7. 客户端和服务器不支持一般 ssl 协议版本或加密套件。_恶意软件加密通信概要分析...
  8. 我参与的一个项目的继续总结:牢骚篇
  9. 从网络营销辞职转行软件测试,100天的心酸拿到9K,过程都是自己在苦撑,只因我...
  10. 出版了两本实体书,写了9本开源电子书,还上了百度百科,冰河这是要起飞了吗?(建议收藏)
  11. 如何脱控极域电子教室
  12. solidworks经典实例网盘下载_三菱 PLC FX3U 程序无线下载经典实例
  13. java面试最后问面试官什么问题,详细说明
  14. unity3d显示c4d材质_C4D入门到精通,没那么难
  15. 【STM32技巧】HX711称重芯片详细说明
  16. Chloe.ORM 实体批量生成
  17. 制作启动U盘重装系统
  18. mongodb中地理位置信息的存储和查询
  19. redis cluster如何添加和删除节点?
  20. CentOS(/dev/mapper/centos-root)进行磁盘扩容

热门文章

  1. android控件的touch事件_Android touch 事件分发时序
  2. master节点重置后添加node报错_企业实战(23)基于Docker平台的Jenkins添加node节点与报错详解(2)...
  3. 数据结构与算法:十大排序算法之插入排序
  4. JavaScript中的字面量
  5. [Vue warn]: Error in mount hook: “TypeError: Cannot read properties of null (reading ‘getAttribute‘)
  6. Use // eslint-disable-next-line to ignore the next line.解决办法
  7. pythonmapiter_018.Python迭代器以及map和reduce函数
  8. 好好讲一讲:到底什么是Java架构师(含福利放送,名额有限)
  9. [翻译]Hystrix wiki–How it Works
  10. Proxy实现MySQL读写分离