如何启动一个AIR移动应用及向它传递参数
2014-11-06 17:53
866 查看
作者总结:移动AIR应用在启动时会有一个事件派发:
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE,onInvoke);
借助该事件可以得到调用方传递过来的参数。以此可以实现邀请注册,有奖推荐等功能。
在AIR移动应用中,至少有两种方案可以以程序启动一个AIR移动应用并传参过去。一种使用ANE,通过原生语言调用另一个应用并传递参数;一种使用自定义URI,以navigateURL启动或链接启动。后一种方法跨技术跨平台,在AIR移动应用中可以调用,在移动浏览器上也可以调用,非常灵活。在第二种方案中,invokeEvent.arguments参数为:
另一个应用程序或浏览器使用自定义 URL 调用该应用程序(iOS 和·Android)
在invokeEvent.reason属性中,标识了打开的类型:
在IOS AIR应用中,处理invokeEvent事件时,可能需要区分一下被呼叫的原因。
在Objective-C中,打开另一个应用的方法:
http://blog.csdn.net/likendsl/article/details/7553605
在Android中:
http://www.devdiv.com/forum.php?mod=viewthread&tid=144005
以下内容转自@郭少瑞_NeoGuo发表于AIR移动研究小组的文章:
http://www.todoair.com/adobe-air移动app的互相调用实现方式-2012-09-28/
在使用Adobe AIR进行移动应用开发的时候,我们或许会有这样的需求:假如我们开发的是两个应用(A和B),同时安装到手机上,那么能否在A中呼叫B并传递参数呢(或者反过来B操作后,再把参数返回给A)。
目前AIR还没有直接呼叫某个APP的API,但我们可以使用手机特有的特性来实现。
假如我们的目标平台是Android,那么可以确定的是,Java是可以呼叫一个APP并传递参数的,所以我们可以借助Java实现的ANE来调用另一个APP(只要知道另一个APP的ID就可以了)。
首先打开Eclipse,创建一个Android项目,引入FlashRuntimeExtensions.jar,编写Extension,Context和Function(具体过程不再细述了,可以参阅创建ANE的初级教程),也可以在稍后的链接中下载Java部分的代码。主要是实现callApp这个Function,代码如下:
然后打开Flash Builder,创建一个库项目,和Java部分的接口相对应:
然后就可以拿出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。
使用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,来启动您的应用。
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE,onInvoke);
借助该事件可以得到调用方传递过来的参数。以此可以实现邀请注册,有奖推荐等功能。
在AIR移动应用中,至少有两种方案可以以程序启动一个AIR移动应用并传参过去。一种使用ANE,通过原生语言调用另一个应用并传递参数;一种使用自定义URI,以navigateURL启动或链接启动。后一种方法跨技术跨平台,在AIR移动应用中可以调用,在移动浏览器上也可以调用,非常灵活。在第二种方案中,invokeEvent.arguments参数为:
另一个应用程序或浏览器使用自定义 URL 调用该应用程序(iOS 和·Android)
ARGUMENTS | IOS | ANDROID |
---|---|---|
InvokeEvent.arguments.length | 3 | 2 |
InvokeEvent.arguments[0] | url | url |
InvokeEvent.arguments[1] | 源应用程序 id | 动作·id |
InvokeEvent.arguments[2] | null | NA |
INVOKEEVENTREASON 常量 | 意义 |
---|---|
LOGIN | 登录时自动启动。 |
NOTIFICATION | 因响应通知而启动(仅 iOS)。 |
OPEN_URL | 因该应用程序被另一个应用程序调用而启动。 |
STANDARD | 由于其他原因而启动。 |
在Objective-C中,打开另一个应用的方法:
http://blog.csdn.net/likendsl/article/details/7553605
在Android中:
http://www.devdiv.com/forum.php?mod=viewthread&tid=144005
以下内容转自@郭少瑞_NeoGuo发表于AIR移动研究小组的文章:
http://www.todoair.com/adobe-air移动app的互相调用实现方式-2012-09-28/
在使用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 { @Override public 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,来启动您的应用。
相关文章推荐
- 如何给你的AIR应用创建一个启动屏幕
- 如何正确的启动一个需要传递参数的Activity。
- Android中用一个应用启动另一个应用并传递参数
- 如何给你的AIR应用创建一个启动屏幕
- 如何向一个jsp传递两个以上的参数
- Android高手进阶教程(十二)之----Android 在一个应用中如何启动另外一个已安装的应用!!!
- 求教:WebService如何传递一个TreeView类型的参数啊?
- Android高手进阶教程(十二)之----Android 在一个应用中如何启动另外一个已安装的应用!!!
- 如何让同台机器 只能允许一个应用启动(加入用户友好处理)
- Android 在一个应用中如何启动另外一个已安装的应用
- C#--第四周实验--任务2--定义一个描述坐标点的CPoint类,利用(默认参数值)构造函数传递参数。(控制台应用)
- VC++ 如何创建一个线程并传递参数
- 智遥工作流,调用SAP RFC,如何传递一个内表参数。
- Android深入探究笔记之二 -- 打开一个新的 Activity 并传递参数与如何响应控件的点击事件
- Android 在一个应用中如何启动另外一个已安装的应用!!!
- Android高手进阶教程(十二)之----Android 在一个应用中如何启动另外一个已安装的应用!
- Android 在一个应用中如何启动另外一个已安装的应用!!!
- 创建一个pthread线程时如何传递参数
- C#中启动线程时,如何传递参数
- Android 在一个应用中如何启动另外一个已安装的应用