开发:

Android项目

新建一个针对NativeExtension的Android项目,实现相应的FREContext,FREExtension和FREFunction等方法,同时新建一个Activity和一个BroadCastReceiver。对于如何配置Android项目来开发NativeExtension,参考http://sswilliam.blog.163.com/blog/static/1896963832011910101142574/

Android项目目录和代码如下:

 

CallBackExtension

CallBackExtension是NativeExtension的入口,实现了FREExtension接口,直接返回一个CallBackContext的对象实例,没啥好说的

package net.sswilliam.ane.callback;

import com.adobe.fre.FREContext;

import com.adobe.fre.FREExtension;

public class CallBackExtension implements FREExtension {

@Override

public FREContext createContext(String arg0) {

// TODO Auto-generated method stub

return new CallBackContext();

}

@Override

public void dispose() {

// TODO Auto-generated method stub

}

@Override

public void initialize() {

// TODO Auto-generated method stub

}

}

CallBackContext

CallBackContext是整个扩展Java部分的上下文,扩展了FREContext。首先先定义一些常量:

常量名

说明

REGISTER_RECEIVER_FUNCTION

注册BroadCastReceiver函数的Key

START_ACTIVITY_FUNCTION

开启Activity函数的Key

DATA_RECEIVE

返回给AS端的事件

在CallBackContext中主要需要实现getFunctions()方法,用来返回具体的java函数的映射:

@Override

public Map<String, FREFunction> getFunctions() {

// TODO Auto-generated method stub

if(functionMaps == null){

functionMaps = new HashMap<String, FREFunction>();

functionMaps.put(REGISTER_RECEIVER_FUNCTION, new RegisterReceiverFunction());

functionMaps.put(START_ACTIVITY_FUNCTION, new StartActivityFunction());

}

return functionMaps;

}

RegisterReceiverFunction

RegisterReceiverFunction实现了FREFunction接口。其功能是向Android系统注册一个BroadCastReceiver。这里我们直接通过registerReceiver函数动态注册BroadCastReceiver而非是在AndroidManifest.xml中静态注册,主要原因是这个BroadCastReceiver的生命周期也就是这个app的生命周期,并且需要与App的FREContext进行交互,注册为静态的不是很合适。当然在AIR开发的Android程序中,也是支持在AndroidManifest.xml中静态注册BroadCastReceiver的。我们会在后面静态的注册一个Activity,静态注册BroadCastReceiver的方法和注册Activity的方法一样,因此这里就不赘述了。就像正常Android程序开发一样,Log也适用于AIR开发的Android app,可以在Logcat中查看。

@Override

public FREObject call(FREContext arg0, FREObject[] arg1) {

// TODO Auto-generated method stub

Log.d("YZ", "register receiver");

MyReceiver receiver = new MyReceiver(arg0);

arg0.getActivity().registerReceiver(receiver, new IntentFilter(MyReceiver.MYARECEIVER_ACTION));

return null;

}

StartActivityFunction

StartActivityFunction实现了FREFunction接口。其功能是打开一个我们自定义的Activity。我们会定义一个自定义的ACTION。然后在AndroidManifest.xml将这个ACTION和这个Activity进行绑定。这样我们用startActivity方法发送一个Intent,就可以开启这个Activity

@Override

public FREObject call(FREContext arg0, FREObject[] arg1) {

// TODO Auto-generated method stub

Intent intent = new Intent(MyActivity.MYACTIVITY_ACTION);

arg0.getActivity().startActivity(intent);

return null;

}

MyActivity

MyActivity就是我们自定义的用来返回结果的Activity。首先会定义MyActivity的开启的ACTION:MYACTIVITY_ACTION = "net.sswilliam.ane.callback.myactivity".

然后重写onCreate函数构建界面,并添加事件侦听。这里我们适用java编码的方式构建界面,因为我们在新建项目时,就把gen这个目录已经剔除了。我的考虑可能是因为R中存储的都是资源的地址,在原生Android的应用中没有问题,但是AIR会重新编译和打包,所以在Android中的R里的地址可能在AIR中就变了,所以R也不能用。这只是一个猜的,具体还需要实验论证,等有时间了实验论证后再公布出来。

package net.sswilliam.ane.callback;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.LinearLayout;

public class MyActivity extends Activity implements OnClickListener{

//声明开启Activity的Action

public static final String MYACTIVITY_ACTION = "net.sswilliam.ane.callback.myactivity";

private LinearLayout layout;

private EditText inputEdit;

private Button submit;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

//构建界面

super.onCreate(savedInstanceState);

layout = new LinearLayout(this);

inputEdit = new EditText(this);

submit = new Button(this);

submit.setText("return");

layout.addView(inputEdit);

layout.addView(submit);

this.setContentView(layout);

//添加事件侦听

submit.setOnClickListener(this);

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//像预先注册过的BroadCastReceiver发送Intent以返回数据

Intent intent = new Intent(MyReceiver.MYARECEIVER_ACTION);

intent.putExtra("data",this.inputEdit.getText().toString());

this.sendBroadcast(intent);

this.finish();

}

}

MyReceier

MyReceiver是我们自定义的BroadCastReceiver,会被动态的注册到系统中从而侦听相应的Intent,首先我们定义需要侦听的Intent的ACTION:MYARECEIVER_ACTION = "net.sswilliam.ane.callback.myreceiver"。同时我们会传入CallBackContext的引用。这样可以在处理Intent时向Actionscript端抛出事件。

注意FREContext中有一个dispatchStatusEventAsync方法可以从java代码向Actionscript端抛出ActionScript的事件。具体请查看NaiveExtension事件机制章节。

package net.sswilliam.ane.callback;

import com.adobe.fre.FREContext;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

public class MyReceiver extends BroadcastReceiver {

private FREContext context;

public static final String MYARECEIVER_ACTION = "net.sswilliam.ane.callback.myreceiver";

public MyReceiver(FREContext context){

this.context = context;

}

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

String data = arg1.getExtras().getString("data");

this.context.dispatchStatusEventAsync(CallBackContext.DATE_RECEIVE, data);

}

}

使用NativeExtension向AIR app 添加Activity和BroadCastReceiver(2)的更多相关文章

  1. 如何给自己的app添加分享到有道云笔记这样的功能

    文章同步自http://javaexception.com/archives/34 如何给自己的app添加分享到有道云笔记这样的功能 问题: 在之前的一个开源笔记类项目Leanote中,有个用户反馈想 ...

  2. 零行代码为App添加异常加载占位图

    前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...

  3. 为你的MacOS App添加开机自启动(Swift)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52104828 ...

  4. 检查app的activity是否在当前

    APP开发中经常会遇到这种需求,需要检查当前的APP是不是可见的,比如,如果是可见的就维持一个socket长连接,如果切到后台不可见了,就断开这个连接.Android本来并不允许APP去监听home键 ...

  5. Error running app: Default Activity not found ; 安卓程序运行不了,也不报错。

    我最近copy一个工程,写完了去运行时不能运行,项目不报错,就是运行的地方有个叉号:尝试很多办法后准备重新New一个时发现:"10:17 Error running app: Default ...

  6. 零行代码为 App 添加异常加载占位图

    前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...

  7. Android app启动activity并调用onCreate()方法时都默默地干了什么?

    Android app启动activity并调用onCreate() 方法时都默默地干了什么?   在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...

  8. 首次给app添加页面

    app添加页面的步骤(含泪史,都是自己摸索出来的) 1.通过页面上的文字,利用搜索功能找到这个页面 2.根据这个页面找到这个页面的action(注意了,这个R.layout.后面这个是页面文件名字) ...

  9. Android Studio添加Activity时Resolved versions for app (21.0.3) and test app (25.4.0) differ.

    将以下代码添加到gradle(module) dependencise中 androidTestCompile 'com.android.support:support-annotations:xx. ...

随机推荐

  1. linux服务后台管理

    把进程放到后台有两种方法 1.cmmand & 2.ctrl+z    暂停到后台 查看后台服务  jobs 把后台进程移到前台 fg  %2 工作号  恢复到前台 后台服务继续执行 bg  ...

  2. VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)

    前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...

  3. Eclipse 启动项目错误:class not found

    其中,很可能的原因:项目存在编译错误,根本没有编译成功,没有生成class文件:可查看problems标签页查看具体错误.

  4. python 元组 序列上使用enumerate()函数

    不能直接for n,x,y in enumerate(data)

  5. 数据仓库基础(七)Informatica PowerCenter介绍

    本文转载自:http://www.cnblogs.com/evencao/p/3140938.html  Infromatica PowerCenter介绍: 1993年在美国加利福尼亚州成立,一年后 ...

  6. linux常用命令:diff 命令

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  7. Linux基础命令---cpio

    cpio 从归档中复制文件,或者复制文件到归档中.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. Cpio命令有三种工作模式: 1)c ...

  8. Linux笔记 #07# 搭建机器学习环境

    环境: Debian 8.8 64位, 同样适用 win10 基本步骤: 安装 Python 安装必要的库 测试 一.安装 Python 延续之前的 搭建 Python 环境 选取折中版本 Pytho ...

  9. SQL学习之SqlMap SQL注入

    sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了. 今天把我一 ...

  10. LOJ10067 构造完全图

    LOJ10067 构造完全图 最小生成树 每次找到最小的边,将边两端的块合并 (我之前想的是什么鬼) #include<cstdio> #include<algorithm> ...