使用NativeExtension向AIR app 添加Activity和BroadCastReceiver(2)
开发:
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)的更多相关文章
- 如何给自己的app添加分享到有道云笔记这样的功能
文章同步自http://javaexception.com/archives/34 如何给自己的app添加分享到有道云笔记这样的功能 问题: 在之前的一个开源笔记类项目Leanote中,有个用户反馈想 ...
- 零行代码为App添加异常加载占位图
前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...
- 为你的MacOS App添加开机自启动(Swift)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52104828 ...
- 检查app的activity是否在当前
APP开发中经常会遇到这种需求,需要检查当前的APP是不是可见的,比如,如果是可见的就维持一个socket长连接,如果切到后台不可见了,就断开这个连接.Android本来并不允许APP去监听home键 ...
- Error running app: Default Activity not found ; 安卓程序运行不了,也不报错。
我最近copy一个工程,写完了去运行时不能运行,项目不报错,就是运行的地方有个叉号:尝试很多办法后准备重新New一个时发现:"10:17 Error running app: Default ...
- 零行代码为 App 添加异常加载占位图
前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...
- Android app启动activity并调用onCreate()方法时都默默地干了什么?
Android app启动activity并调用onCreate() 方法时都默默地干了什么? 在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...
- 首次给app添加页面
app添加页面的步骤(含泪史,都是自己摸索出来的) 1.通过页面上的文字,利用搜索功能找到这个页面 2.根据这个页面找到这个页面的action(注意了,这个R.layout.后面这个是页面文件名字) ...
- 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. ...
随机推荐
- linuxbash 父进程 子进程
linux登陆linux,就获得一个bash,之后你的bash就是一个独立的进程,被称为pid的就是,之后你在bash下面执行的任何命令都是由这个bash所衍生的,那些被执行的命令被称为子进程.子进程 ...
- css样式表--样式表分类
样式表分类 1.内联式.写在body里.控制精确,可重复性差. <body> <div style="color:#90F">更好发挥的返回结果还 < ...
- mysql5.7服务器The innodb_system data file 'ibdata1' must be writable导致无法启动服务器
现象如下:The innodb_system data file 'ibdata1' must be writable. 解决方案如下: 1.关闭mysqld进程: 2.删除配置文件中datadir所 ...
- VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...
- MySQL从删库到跑路(六)——SQL插入、更新、删除操作
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.插入数据 1.为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录的值. IN ...
- BabelMap 10.0.0.5 汉化版已经发布
新的 BabelMap 调整了用户体验的一些细节.修正了西夏语表意文字序列.修正了一些文字显示不全的问题. 请点击页面左上角连接,进入下载页面下载.
- python 同时迭代多个序列
每次分别从一个序列中取一个元素 >>> xpts = [1, 5, 4, 2, 10, 7] >>> ypts = [101, 78, 37, 15, 62, 99 ...
- Siddhi初探
官方对Siddhi的介绍如下: Siddhi CEP is a lightweight, easy-to-use Open Source Complex Event Processing Engine ...
- Functional Programming 资料收集
书籍: Functional Programming for Java Developers SICP(Structure and Interpretation of Computer Program ...
- 数据仓库基础(十一)Informatica小技巧(2)
本文转载自:http://www.cnblogs.com/evencao/p/3152384.html 1.User shortcuts:shortcuts能实现快捷方式的复用.快捷方式可以根据源的变 ...