Firefox OS中跨应用数据交互

移动开发
由于受到安全的限制,WEB应用跨域调用实现起来是比较麻烦的。传统的做法有服务器代理、jsonp接口等,但在firefox os中并不需要如此大费周折。在firefox os中已经提供了跨应用交互的机制,虽然目前来看并不是特别的方便,但已经可以实现基本的跨应用交互的App了。本文将以一个实际的DEMO来讲解B2G的跨应用调用。

由于受到安全的限制,WEB应用跨域调用实现起来是比较麻烦的。传统的做法有服务器代理、jsonp接口等,但在firefox os中并不需要如此大费周折。在firefox os中已经提供了跨应用交互的机制,虽然目前来看并不是特别的方便,但已经可以实现基本的跨应用交互的App了。本文将以一个实际的DEMO来讲解B2G的跨应用调用。

概要介绍

本文将开发两个应用,应用一:Caller,应用二:Receiver

Caller中有一个Show Images的按钮,点击该按钮将启动Receiver,Receiver中提供了一些图片浏览的功能,在Receiver中选择图片后,点击Select按钮,将把图片传送到Caller中,并在Caller中展现该选择的图片

整体效果如下

 

Caller应用

[[60720]]

Receiver应用

细节说明

Receiver

在Firefox OS中,要让应用可被其他应用调用,需要在该应用的manifest.webapp中进行声明。我们看一下Receiver的manifest.webapp文件

  1. {  
  2.      "name": "Receiver",  
  3.      "launch_path": "/index.html",  
  4.      "developer": {  
  5.          "name": "chyblog",  
  6.          "url": "http://www.chyblog.com"  
  7.      },  
  8.      "icons": {  
  9.          "120": "/style/icons/Receiver.png"  
  10.      },  
  11.      "permissions": [  
  12.          "background",  
  13.          "backgroundservice",  
  14.          "attention",  
  15.          "contacts",  
  16.          "settings",  
  17.          "desktop-notification"  
  18.      ],  
  19.      "activities": {  
  20.          "pick": {  
  21.              "filters": {  
  22.                  "type": ["image/png", "image/gif"]  
  23.              },  
  24.              "returnValue": true,  
  25.              "disposition": "inline"  
  26.          }  
  27.      }  
  28.  }  

其中activities属性声明了一个web activity,取名为pick,其中filters属性告诉system对哪些类型的请求响应,Receiver应用,可以响应名称为pick,type为image/png或者image/gif类型的响应。

returnValue是一个布尔类型的属性,为true时,声明该web activity需要返回数据给调用它的应用,false则不需要返回数据给调用者

disposition属性有两种可选值,window和inline,如果为window,则会以启动一个新应用的方式打开,如果为inline,则会临时启动一个画面显示该应用的界面。

在Receiver应用中,还需要用js编写响应调用的处理代码

  1. navigator.mozSetMessageHandler('activity', webActivityHandler);  
  2.  
  3. var activityRequest;  
  4.  
  5. var webActivityHandler = function(request) {  
  6.     activityRequest = request;  
  7.  
  8.     document.getElementById('button').disabled = '';  
  9.     document.getElementById('cancelButton').disabled = '';  
  10.  };  

以上代码注册了一个事件响应句柄,并将请求者的信息保存在全局变量activityRequest中

当用户点击Select按钮后,将把图片信息传送给Caller。代码如下

  1. function select() {  
  2.     if (!activityRequest) {  
  3.         alert('There are no any pending activity request.');  
  4.         return;  
  5.     }  
  6.  
  7.     // Return the request  
  8.     activityRequest.postResult({  
  9.         type : 'image/png',  
  10.         text : getBase64Image(selectedImg)  
  11.     });  
  12.     activityRequest = null;  
  13.  
  14.     // close app, currently useless,  
  15.     // see https://bugzilla.mozilla.org/show_bug.cgi?id=789392 
  16.     window.close();  
  17. };  

由于两个应用的数据交互只能使用文本信息传递,这里将Receiver中的图片以base64文字编码的方式传给Caller,在Caller中,将该文本设置到backgroundImage中,即可显示,获取图片的base64编码的代码如下

  1. function getBase64Image(imgSrc) {  
  2.     var img = new Image();  
  3.     img.src = imgSrc;  
  4.     var canvas = document.createElement("canvas");  
  5.     canvas.width = img.width;  
  6.     canvas.height = img.height;  
  7.     var ctx = canvas.getContext("2d");  
  8.     ctx.drawImage(img, 0, 0);  
  9.     var dataURL = canvas.toDataURL("image/png", 0.2);  
  10.     return dataURL;  
 

Caller

Call应用中,主要是触发Receiver调用的响应和接受返回数据的处理

Call首先创建一个activity请求,需要告诉system,请求的名称和类型。并注册请求成功返回和请求失败时的处理逻辑。而请求如何去调用,完全由system控制。创建请求的代码如下

  1. var a = new MozActivity({ name : 'pick', data : { type : 'image/png' } }); a.onsuccess = function() { reopenApp(); document.getElementById('showImg').style.backgroundImage = "url(" + this.result.text + ")"; document.getElementById('result').textContent = 'well done'; }; a.onerror = function() { reopenApp(); document.getElementById('showImg').style.backgroundImage = ""; document.getElementById('result').textContent = '(canceled)'; };

需要强调的是,Caller和Receiver是两个独立的应用,两者之间的交互都是system app负责的。我们需要做的,就是声明web activity,触发请求和响应请求。

源码下载:http://chyblog-chyblog.stor.sinaapp.com/wp-content/uploads/2012/10/webActivity.zip

 

责任编辑:Yeva 来源: chyblog.com
相关推荐

2012-09-04 13:35:24

Firefox OS

2013-01-14 12:25:49

Firefox OS

2013-01-14 12:24:06

Firefox OS

2013-01-14 12:19:48

Firefox OSFirefox OS

2013-01-14 13:21:09

Firefox os

2013-06-24 09:23:25

Firefox OS火狐手机Android

2013-01-14 12:53:13

Firefox OSIndexedDB

2013-01-14 12:10:46

firefox osfirefox os

2012-09-12 09:08:54

Firefox OS

2013-09-02 11:18:06

Firefox OSMarketplace

2013-01-14 13:14:11

Firefox OS

2012-09-29 10:24:14

Firefox OS

2014-01-09 14:07:46

Firefox OS操作系统

2014-06-16 10:20:46

Firefox OSWeb Apps

2015-11-12 13:47:53

Firefox OSAPPFirefox

2009-12-08 14:43:04

WCF跨域

2013-02-25 09:15:30

MWC 2013Firefox OS

2013-01-08 14:58:48

Firefox OS

2009-03-23 09:57:19

2011-10-08 15:18:38

MozillaFirefox移动战略
点赞
收藏

51CTO技术栈公众号