关于Air端与android端的通信实现
来源:互联网 发布:linux基本知识 编辑:程序博客网 时间:2024/05/16 07:42
最近看到很多关于Air、android、Ane的帖子,很多都是在提air和android直接的调用、通信的问题。事实上,在我们使用air进行android开发时,两端之间的通信是十分必要的。废话不多说,直接上教程。
PS:该教程的案例是实现,从Air端向Android端传递linux命令,在Android端执行完成后,将结果再传递会Air端。
一、Air程序向android程序的通信、传参:
这一步的实现,我们使用ANE作为中介。ANE详细怎么写这里就不多说了,随便百度一下超多教程。
1、ANE——as代码:
复制代码
这里我们Ane里面自己写的一个传参、启动应用的方法
复制代码
2、Air程序:
复制代码
这里调用Ane的方法
launchAppExtension(packetName:String,operation:String,args:Array=null).
其中:
"com.myActivity"——是要与Air通信、接收参数的Android程序的包名,
opertation ——是在android程序的处理行为(只是一个标示),这里的处理行为是"exeCmd"——执行命令。
[commands] —— 是给予opertation处理行为带上的参数、属性,这里指的是要执行的linux命令 —— 禁用浏览器"pm enable com.android.browser";。
3、ANE——java代码:
复制代码
这段代码是写在ANE的java端的,会ANE应该都能看懂,就是将MyExtension.getInstance().launchAppExtension("com.myActivity",opertation,[commands]) 这个方法传递过来的3个参数进行处理,
通过startActivity启动"com.myActivity",
并将opertation = "exeCmd"存到opertation —— intent.putExtra("operation", arg1[1].getAsString());
并将commands = "pm enable com.android.browser"存到key —— intent.putExtra("key"+(i-1), freObject.getAsString());
4、Android程序:
复制代码
到这里,Air程序向android程序的通信、传参就结束了,里面用到的ExecuteAsRoot是自己写的一个执行linux命令类,是通过Process和DataOutputStream实现的,比较简单,网上也很多教程,这里就不展开了。
小结:
Air程序向android程序的通信、传参看起来比较复杂(事实上也比较复杂),其实明白之后思路是比较简单的,也可能是因为本人是第一次写教程贴,写得比较啰嗦。下面简单给出这个阶段的通信流程吧:
Air程序 —> Ane(As端) —> Ane(java端) —> Android程序
二、android程序向Air程序的通信、传参:
1、Air程序:
复制代码
首先,这里使用InvokeEvent事件做一个调用Air时触发的监听
复制代码
这里可以看到我们使用了URLVariables这个类接收参数,其实待会我们要在android程序中使用的启动Air程序、传参方法就是通过URI实现的,所以这里还要在Air程序的xml中做一下简单的配置,添加<data android:scheme="myAirApp"/> 这一句:
复制代码
其实就是给我们的Air程序一个唯一的URI标识<data android:scheme="myairapp"/>,这种配置方式貌似是从Android的AndroidManifest.xml延伸过来的,详细的介绍可以在百度搜一下"AndroidManifest.xml文件详解"学习一下。
2、Android程序:
复制代码
这个方法是将执行结果传递回Air程序中,就是通过刚才我们在Air配置的数据位置标识URI —— "myairapp://"传递的。这里我们看一下Intent.parseUri(String uri, int flags)的解释 —— "Create an intent from a URI. ",然后下面也是调用startActivity(i),也就是说这是启动一个Activityd的另一种方法 —— 通过URI启动 (说多了,也是属于Android原生的东西了)。
这里的
复制代码
这一句,会在我们Air程序启动后,被
复制代码
监听到,然后就会到了我们的第一步:
复制代码
到这里,android程序向Air程序的通信、传参就结束了。
小结:
这个流程起到关键作用的是两个地方,一个是Air端的InvokeEvent.INVOKE事件监听,另一个则是Android端的Intent.parseUri()启动方法。下面给出这个阶段的通信流程吧:
Android程序 —> Air程序
总结:
流程我搅得是比较简单的(其实大家明白的事都说是简单的),Air和Android的交互对于我们用Air开发android的人来说其实是很常用的,以上给出的只是我在开发项目中使用到的一个"手段"。这段流程我们也想过将它优化,所以如果有很好方法的大神,希望我们能交流分享。
写得手都麻了,希望对大家有用吧......
PS:该教程的案例是实现,从Air端向Android端传递linux命令,在Android端执行完成后,将结果再传递会Air端。
一、Air程序向android程序的通信、传参:
这一步的实现,我们使用ANE作为中介。ANE详细怎么写这里就不多说了,随便百度一下超多教程。
1、ANE——as代码:
- public class MyExtension
- {
- public function launchAppExtension(packetName:String,operation:String,args:Array=null):String{
- if(_context){
- if(!args||!args.length){
- return _context.call(LAUNCH_APP_FUNCTION,packetName,operation) as String;
- }
- var allArgs:Array = [LAUNCH_APP_FUNCTION,packetName,operation].concat(args);
- _context.call.apply(this,allArgs);
- }
- return "err";
-
- }
- }
这里我们Ane里面自己写的一个传参、启动应用的方法
- MyExtension.getInstance().launchAppExtension(packetName:String,operation:String,args:Array=null).
2、Air程序:
- opertation = "exeCmd";
- commands = "pm enable com.android.browser";
- MyExtension.getInstance().launchAppExtension("com.myActivity",opertation,[commands]);
这里调用Ane的方法
launchAppExtension(packetName:String,operation:String,args:Array=null).
其中:
"com.myActivity"——是要与Air通信、接收参数的Android程序的包名,
opertation ——是在android程序的处理行为(只是一个标示),这里的处理行为是"exeCmd"——执行命令。
[commands] —— 是给予opertation处理行为带上的参数、属性,这里指的是要执行的linux命令 —— 禁用浏览器"pm enable com.android.browser";。
3、ANE——java代码:
- public FREObject call(FREContext arg0, FREObject[] arg1) {
- // TODO Auto-generated method stub
- FREObject result = null;
- try {
- result = FREObject.newObject("ok");
- Activity a = arg0.getActivity();
-
- PackageManager pm = a.getPackageManager();
- Intent intent = pm.getLaunchIntentForPackage(arg1[0].getAsString());
- intent.putExtra("operation", arg1[1].getAsString());
-
- for (int i = 2; i < arg1.length; i++) {
- FREObject freObject = arg1;
- intent.putExtra("key"+(i-1), freObject.getAsString());
- }
- a.startActivity(intent);
-
- } catch (Exception e) {
- // TODO: handle exception
- try {
- result = FREObject.newObject("ERR");
- } catch (Exception e2) {
- // TODO: handle exception
- }
- }
- return result;
- }
这段代码是写在ANE的java端的,会ANE应该都能看懂,就是将MyExtension.getInstance().launchAppExtension("com.myActivity",opertation,[commands]) 这个方法传递过来的3个参数进行处理,
通过startActivity启动"com.myActivity",
并将opertation = "exeCmd"存到opertation —— intent.putExtra("operation", arg1[1].getAsString());
并将commands = "pm enable com.android.browser"存到key —— intent.putExtra("key"+(i-1), freObject.getAsString());
4、Android程序:
- public class MyActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- Bundle bundle = getIntent().getExtras();
- if(bundle.getString("operation").equalsIgnoreCase("exeCmd")){
- try{
- ExecuteAsRoot root = new ExecuteAsRoot();
- ArrayList<String> list = new ArrayList<String>();
- list.add(bundle.getString("key1"));
- root.setCommands(list);
- root.execute();
- } catch (Exception e) {
- // TODO: handle exception
- }
- finish();
- return;
- }
- }
到这里,Air程序向android程序的通信、传参就结束了,里面用到的ExecuteAsRoot是自己写的一个执行linux命令类,是通过Process和DataOutputStream实现的,比较简单,网上也很多教程,这里就不展开了。
小结:
Air程序向android程序的通信、传参看起来比较复杂(事实上也比较复杂),其实明白之后思路是比较简单的,也可能是因为本人是第一次写教程贴,写得比较啰嗦。下面简单给出这个阶段的通信流程吧:
Air程序 —> Ane(As端) —> Ane(java端) —> Android程序
二、android程序向Air程序的通信、传参:
1、Air程序:
- NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);
首先,这里使用InvokeEvent事件做一个调用Air时触发的监听
- private function onInvoke(e:InvokeEvent):void {
- if(e.arguments.length>0){
- var uv:URLVariables = new URLVariables((e.arguments[0] as String).split("//")[1]);
- if(uv.hasOwnProperty("resulet")){
- trace("接收成功");
- }
- }
- }
这里可以看到我们使用了URLVariables这个类接收参数,其实待会我们要在android程序中使用的启动Air程序、传参方法就是通过URI实现的,所以这里还要在Air程序的xml中做一下简单的配置,添加<data android:scheme="myAirApp"/> 这一句:
- <manifest android:installLocation="auto" android:hardwareAccelerated="true">
- <application>
- <activity android:launchMode="singleInstance">
- <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="myairapp"/>
- </intent-filter>
- </application>
- </manifest>
其实就是给我们的Air程序一个唯一的URI标识<data android:scheme="myairapp"/>,这种配置方式貌似是从Android的AndroidManifest.xml延伸过来的,详细的介绍可以在百度搜一下"AndroidManifest.xml文件详解"学习一下。
2、Android程序:
- private void sendResult(String result){
- Intent i;
- try {
- i = Intent.parseUri("myairapp://result="+result,Intent.URI_INTENT_SCHEME);
- i.addCategory(Intent.CATEGORY_BROWSABLE);
- i.setComponent(null);
- i.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- startActivity(i);
- } catch (URISyntaxException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
这个方法是将执行结果传递回Air程序中,就是通过刚才我们在Air配置的数据位置标识URI —— "myairapp://"传递的。这里我们看一下Intent.parseUri(String uri, int flags)的解释 —— "Create an intent from a URI. ",然后下面也是调用startActivity(i),也就是说这是启动一个Activityd的另一种方法 —— 通过URI启动 (说多了,也是属于Android原生的东西了)。
这里的
- i = Intent.parseUri("myairapp://result="+result,Intent.URI_INTENT_SCHEME)
这一句,会在我们Air程序启动后,被
- NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);
监听到,然后就会到了我们的第一步:
- ...
- if(uv.hasOwnProperty("resulet")){
- trace("接收成功");
- }
- ...
到这里,android程序向Air程序的通信、传参就结束了。
小结:
这个流程起到关键作用的是两个地方,一个是Air端的InvokeEvent.INVOKE事件监听,另一个则是Android端的Intent.parseUri()启动方法。下面给出这个阶段的通信流程吧:
Android程序 —> Air程序
总结:
流程我搅得是比较简单的(其实大家明白的事都说是简单的),Air和Android的交互对于我们用Air开发android的人来说其实是很常用的,以上给出的只是我在开发项目中使用到的一个"手段"。这段流程我们也想过将它优化,所以如果有很好方法的大神,希望我们能交流分享。
写得手都麻了,希望对大家有用吧......
0 0
- 关于Air端与android端的通信实现
- 关于Air端与android端的通信实现
- 基于Scoket的Android端与服务器端的通信实现
- Air与java通信
- 基于AIR实现的Android程序
- 关于Flash air实现Android原生Activity生命周期函数的方法
- Android Socket通信与聊天室的实现
- android端与服务器端的通信交互
- 通过USB数据线实现Android端与PC端的通信
- 关于air Android 微信签名工具填包名的问题
- 关于Unity与Android通信与交互
- 实现PC端与手机端的UDP通信
- Android端 同 单片机 利用蓝牙模块的通信实现
- 关于AIR的一点认识
- Spring for android实现客户端与服务器的通信
- android系统与mcu串口通信的实现
- Android 自定义AIDL的实现与通信原理
- Socket实现Android客户端与服务器的通信
- 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model
- 从java apk中调用 Flex air apk 的方法
- android studio 用法记录 更新中....
- c++中string到int的转换
- tar压缩解压缩命令详解
- 关于Air端与android端的通信实现
- 白藜芦醇2
- 用Dojo实现Ajax请求:XHR、跨域、及其他(1)
- 白藜芦醇3
- atoi,atol,strtod,strtol,strtoul实现类型转换
- VMware ESXi 5.1 U盘安装,驱动安装
- 深入研究虚函数和vtable
- 番茄红素1
- AJAX——ASP.NET AJAX(三)ScriptManagerProxy,Timer和UpdateProgress