Flex Library项目Flex Library项目目录和代码如下:
CallBackExtension CallBackExtension是我们这个NativeExtension的Actionscript的具体实现。同样我们会在其中先声明需要调用函数在Map中的Key,这两个Key和Java中的两个Key是完全相同的,申明成静态的常量可以减少编程时带来的拼写误差,也提高程序的可读性。
- public static const REGISTER_RECEIVER_FUNCTION:String = "register_receiver_function";
- public static const START_ACTIVITY_FUNCTION:String = "start_activity_function";
复制代码
对于Java端的两个函数,其中注册BroadCastReceiver的RegisterReceiverFunction函数会在CallBackExtension新建时就调用。从而将我们自定义的BroadCastReceiver动态的注册进系统。而StartActivityFunction函数提供给第三方程序进行调用。 - public function CallBackExtension(target:IEventDispatcher=null)
- {
- super(target);
- ext = ExtensionContext.createExtensionContext("net.sswilliam.ane.callback","");
- ext.addEventListener(StatusEvent.STATUS,onDataReceived);
- ext.call(REGISTER_RECEIVER_FUNCTION);
- }
- public function startActivity():void{
- ext.call(START_ACTIVITY_FUNCTION);
- }
复制代码
同时需要给ExtensionContext添加事件侦听函数。从而获得从Java端抛出的Actionscript事件。具体请查看NaiveExtension事件机制章节。 CallBackEvent CallBackEvent是自定义的一个事件类,将从Java端接收到的事件和数据封装为Actionscript的一个事件对象,供具体使用该NativeExtension的app调用。 - package net.sswilliam.ane.callback
- {
- import flash.events.Event;
-
- public class CallBackEvent extends Event
- {
- public static const DATE_RECEIVE:String = "data_receive";
-
- public var callbackData:String = "";
- public function CallBackEvent(callBackData:String, bubbles:Boolean=false, cancelable:Boolean=false)
- {
- super(DATE_RECEIVE, bubbles, cancelable);
- this.callbackData = callBackData;
- }
- }
- }
复制代码
extension.xml 最后我们不能忘记在项目中添加相应的extension.xml文件对这个扩展做一个描述。大部分的tag都很清晰,就不过多解释了。注意的是namespace,虽然我们用3.0的sdk,但是在NativeExtension中还是2.5。 - <?xml version="1.0" encoding="UTF-8"?>
- <extension xmlns="http://ns.adobe.com/air/extension/2.5">
- <id>net.sswilliam.ane.callback</id>
- <versionNumber>1</versionNumber>
- <platforms>
- <platform name="Android-ARM">
- <applicationDeployment>
- <nativeLibrary>CallBack.jar</nativeLibrary>
- <initializer>net.sswilliam.ane.callback.CallBackExtension</initializer>
- <finalizer>net.sswilliam.ane.callback.CallBackExtension</finalizer>
- </applicationDeployment>
- </platform>
- </platforms>
- </extension>
复制代码
Flex Mobile 项目Flex Mobile项目目录结构和代码如下:
在这个项目中,重点不在于App的开发,而在于app.xml的配置。 CallbackTest.mxml 只是一个很简单调用我们NativeExtension的程序。我们会在程序启动时直接实例化NativeExtension,然后添加事件。并且通过一个Button来开启Java原生的Activity。最后显示从Java返回的数据。代码如下: - <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="init(event)">
- <fx:Script>
- <![CDATA[
- import mx.events.FlexEvent;
-
- import net.sswilliam.ane.callback.CallBackEvent;
- import net.sswilliam.ane.callback.CallBackExtension;
-
- import spark.effects.CallAction;
-
- private var ext:CallBackExtension;
- protected function init(event:FlexEvent):void
- {
- // TODO Auto-generated method stub
- ext = new CallBackExtension();
- ext.addEventListener(CallBackEvent.DATE_RECEIVE,dataReceiverHandler);
-
- }
- private function dataReceiverHandler(e:CallBackEvent):void{
- this.console.appendText("data receiver:"+e.callbackData+"\n");
- }
-
- protected function startActivity(event:MouseEvent):void
- {
- // TODO Auto-generated method stub
- this.ext.startActivity();
- }
-
- ]]>
- </fx:Script>
- <fx:Declarations>
- <!-- 将非可视元素(例如服务、值对象)放在此处 -->
- </fx:Declarations>
- <s:Button x="10" y="10" label="call activity" click="startActivity(event)"/>
- <s:TextArea id="console" x="13" y="86" width="457" height="667"/>
- </s:Application>
-
复制代码
CallbackTest-app.xml 每一个AIR程序都需要一个app.xml文件对其进行描述。当AIR支持Android平台后,在app.xml中就多了一个的tag。里面会有一个manifestAdditions的子tag。在这里,就可以包含针对Android程序中的AndroidManifest.xml的一些信息的添加和修改。默认的,在这个tag里会包含如下信息: - <android>
- <manifestAdditions><![CDATA[
- <manifest android:installLocation="auto">
-
- <!--See the Adobe AIR documentation for more information about setting Google Android permissions-->
- <!--删除 android.permission.INTERNET 权限将导致无法调试设备上的应用程序-->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
- <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
- <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
- <!--应同时切换 DISABLE_KEYGUARD 和 WAKE_LOCK 权限,才能访问 AIR
- 的 SystemIdleMode API-->
- <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>-->
- <!--<uses-permission android:name="android.permission.WAKE_LOCK"/>-->
- <!--<uses-permission android:name="android.permission.CAMERA"/>-->
- <!--<uses-permission android:name="android.permission.RECORD_AUDIO"/>-->
- <!--应同时切换 ACCESS_NETWORK_STATE 和 ACCESS_WIFI_STATE 权限,才能使用 AIR
- 的 NetworkInfo API-->
- <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->
- <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->
- </manifest>
-
- ]]></manifestAdditions>
- </android>
复制代码
从中可以看出,主要是对permission的一些设置。这些permission由AIR SDK自动添加到最终生成的AndroidManifest当中。 在原生的Android App中,当我们需要注册一个Activity时,可以直接修改AndroidManifest.xml文件。那么当我们向要在用AIR开发的Android app注册一个Activity要怎么做呢?其实也很简单,只要在AIR的app.xml的Android中添加相应的Tag即可。如下图红色标记,这里我们就向我们的AIR app添加了一个MyActivity的Activity。同时也定义了相应的IntentFilter。这里一定要注意两点 1. 包括在application tag里,在原生Android开发中,Activity也是注册在application tag里的。但是AIR的app.xml里没有这个tag,经过测试,发现直接在app.xml里添加application tag,最终application tag里的内容也会合并到最后生成的AndroidManifest.xml中。 2. android:name的值与Android项目中的Activity的包路径相同。 - <android>
- <manifestAdditions><![CDATA[
- <manifest android:installLocation="auto">
- <application>
- <activity android:name="net.sswilliam.ane.callback.MyActivity">
- <intent-filter>
- <action android:name="net.sswilliam.ane.callback.myactivity" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- </application>
- <!--See the Adobe AIR documentation for more information about setting Google Android permissions-->
- <!--删除 android.permission.INTERNET 权限将导致无法调试设备上的应用程序-->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
- <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
- <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
- <!--应同时切换 DISABLE_KEYGUARD 和 WAKE_LOCK 权限,才能访问 AIR
- 的 SystemIdleMode API-->
- <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>-->
- <!--<uses-permission android:name="android.permission.WAKE_LOCK"/>-->
- <!--<uses-permission android:name="android.permission.CAMERA"/>-->
- <!--<uses-permission android:name="android.permission.RECORD_AUDIO"/>-->
- <!--应同时切换 ACCESS_NETWORK_STATE 和 ACCESS_WIFI_STATE 权限,才能使用 AIR
- 的 NetworkInfo API-->
- <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->
- <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->
- </manifest>
-
- ]]></manifestAdditions>
- </android>
复制代码
编译打包编译打包跟其他的NativeExtension没有什么区别,具体参见:http://sswilliam.blog.163.com/blog/static/1896963832011910111931102/ http://sswilliam.blog.163.com/blog/static/1896963832011910111931102/
再次重申一下,NativeExtension目前的开发还是挺麻烦的,大家一定要耐心+细心。做成功一遍后就基本不会遇到什么困难了。
|