在公司遇到了ActionScript调用Java的需求,所以大概了解了一下:
一般基本是分成了三块,本身flash的项目,ActionScript的库,Java的库
通信方式一般有两种:
一.ActionScript直接通过Call方法来调用Native的代码:
1.(1).如上图,ActionScript的库作为项目与Java之间的桥梁
对于ActionScript库,ExtensionContext是它的核心类,一直都是由它来负责与java层之间的调用
然后通过ExtensionContext的实例instance的call()方法来调用Java中的方法:
(注意,下面的call里面的login可以认为是java层里面的重写FREContext类getFunctions()中对应的键)
(2).对于被调用的Java库:
它的入口是FREExtension,需要重写createContext()方法来获取本地代码上下文,也就是自己拓展的FREContext子类
FREFunction则是Java本地方法的具体实现,实例化之后可以以键值对的方法存入FREContext的getFunctions()中去,
call()方法就是通过传入对应键值来调起本地方法。
2.对于Java端有返回的方法,可以直接在AS端拿到返回值,再重新用FREObject包装一下:
在AS的library端:
二.Native代码直接向ActionScript代码抛出事件:(其实主要是分为派发事件,侦听事件和处理事件三个部分)
1.派发事件:
2.在ActionScript处侦听事件以及处理事件:
1 import flash.events.Event; 2 import flash.events.EventDispatcher; 3 import flash.events.StatusEvent; 4 import flash.external.ExtensionContext; 5 6 public class WenverPay extends EventDispatcher 7 { 8 private static var content:ExtensionContext; 9 10 public static const KEY_UPDATECOMPLETE_CODE:String = "UpdateConfigParamsComplete"; 11 12 private static function init():void 13 { 14 content = Context.getInstance(); 15 } 16 17 private function onStatus(event:StatusEvent):void 18 { 19 switch(event.code) 20 { 21 case KEY_UPDATECOMPLETE_CODE: 22 { 23 var e:Event = new Event(KEY_UPDATECOMPLETE_CODE); 24 dispatchEvent(e); 25 26 break; 27 } 28 default: 29 { 30 break; 31 } 32 } 33 } 34 35 public function setUpdateSuccess(updateComplete:Function):void 36 { 37 init(); 38 content.addEventListener(StatusEvent.STATUS, onStatus); 39 } 40 41 }