着手改造之前,有兴趣可以阅读下官方文档:http://help.adobe.com/zh_CN/air/extensions/index.html

新建工程 NavService 并创建包 nav.wenbo.service, 这些都可以自定义,但要记住你的包名。

注意最下方那个jar包,这个是必需的,打开项目的构建目录(buildPath),引用外部jar包, 目录在你在Flex sdk目录下

%FlexSDK%\4.x.x\lib\android\FlashRuntimeExtensions.jar

我的本地目录是:F:\Program Files\Adobe\Adobe Flash Builder 4.7\sdks\4.6.0\lib\android\FlashRuntimeExtensions.jar

首先创建air调用的入口类 ServiceExtension 这个类必需在ane包里面的extension.xml里指定(后面会介绍)

package nav.wenbo.service;

import android.content.Context;
import android.content.Intent;
import android.util.Log; import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension; public class ServiceExtension implements FREExtension {
public static final String TAG = "ServiceExtension";
public static Context appContext;
public static FREContext extensionContext;
public static String Msg = "none"; @Override
public FREContext createContext(String contextType) {
// TODO Auto-generated method stub
return new ServiceExtensionContext();
} @Override
public void dispose() {
// TODO Auto-generated method stub
Log.d(TAG, "Extension disposed.");
} @Override
public void initialize() {
// TODO Auto-generated method stub
Log.d(TAG, "Extension initialized.");
} }

ServiceExtension中关键是 createContext 方法,这个方法返回一个可连通air及本地Java代码的上下文。并在该上下文中定义可供air调用的方法

下面是ServiceExtensionContext类

package nav.wenbo.service;

import java.util.HashMap;
import java.util.Map; import nav.wenbo.service.functions.InitFunction;
import nav.wenbo.service.functions.SendFunction;
import nav.wenbo.service.functions.StartFunction; import android.util.Log; import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction; public class ServiceExtensionContext extends FREContext {
public static final String TAG = "ServiceExtensionContext";
@Override
public void dispose() {
// TODO Auto-generated method stub
Log.d(TAG,"Context disposed.");
} @Override
public Map<String, FREFunction> getFunctions() {
Map<String, FREFunction> functions = new HashMap<String, FREFunction>();
functions.put("init", new InitFunction());
functions.put("service", new StartFunction());
functions.put("send", new SendFunction()); return functions;
} }

functions.put相当注册调用逻辑的调用名, 这里把你所有调用方法都填上。init 用于初始化上下文,service用来启动和关闭服务, send用于发送消息。 在编写对应方法之前,

先把上一节的Backgroundservice 移植过来

package nav.wenbo.service;

import com.wenbo.navservice.R;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log; public class NotificationService extends Service {
private NotificationManager notificationMgr;
private Thread mthr;
private int mCount=0;
private Boolean mSend=true; @Override
public void onCreate() {
super.onCreate();
notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
displayNotificationMessage("starting Background Service"); if(mthr == null || mSend == false)
{
mSend=true;
mthr = new Thread(null, new ServiceWorker(), "BackgroundSercie");
mthr.start();
}
if(null != ServiceExtension.extensionContext) ServiceExtension.extensionContext.dispatchStatusEventAsync("start", "1");
} @Override
public void onDestroy()
{
super.onDestroy();
mSend = false;
} @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} class ServiceWorker implements Runnable {
@Override
public void run() {
// do background processing here.....
// stop the service when done...
// BackgroundService.this.stopSelf()
while(mSend)
{
try{
Thread.sleep(1000);
Log.d("", "runnable" + mCount);
displayNotificationMessage(ServiceExtension.Msg);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
} private void displayNotificationMessage(String message) {
if(message == "none") return; Log.d("", message);
mCount++;
Notification notification = new Notification(R.drawable.ic_launcher, message,
System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Activity.class), 0); notification.setLatestEventInfo(this, "女神之贱", message, contentIntent); notificationMgr.notify(1000, notification);
}
}

这里改动很小,发送的消息从ServiceExtension类里面取,当message != none时显示该通知,另ServiceExtension.extensionContext.dispatchStatusEventAsync 是用来给air程序发消息, 在air中监听StatusEvent.STATUS 可以捕获这条消息并获取对应参数。在这里用处是通知服务启动成功。

下面就剩下实际调用的方法了。

首先是初始化上下文,这里主要是ServiceExtension.extensionContext 主要用于往air发消息。

package nav.wenbo.service.functions;

import nav.wenbo.service.ServiceExtension;

import android.content.Context;
import android.util.Log; import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject; public class InitFunction implements FREFunction {
public static final String TAG = "InitFunction";
@Override
public FREObject call(FREContext context, FREObject[] args) {
ServiceExtension.extensionContext = context; Context appContext = context.getActivity().getApplicationContext();
ServiceExtension.appContext = appContext; Log.i(TAG, "in init"); return null;
} }

这里注意了,因为我们没有独立的Android入口文件,我们 只能从 FREContext.getActivity() 来取得我们所需的上下文,并用这上下文启动我们的服务,这是跟前一节例子最大不同的地方。

执行后通知air:context.dispatchStatusEventAsync("start", "2");

package nav.wenbo.service.functions;

import nav.wenbo.service.NotificationService;
import android.content.Context;
import android.content.Intent; import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject; public class StartFunction implements FREFunction { @Override
public FREObject call(FREContext context, FREObject[] args) {
Context appContext = context.getActivity().getApplicationContext();
Boolean isStart=true;
try {
isStart = args[0].getAsBool();
} catch (Exception e) { }
if(isStart) context.getActivity().startService(new Intent(appContext, NotificationService.class));
else context.getActivity().stopService(new Intent(appContext, NotificationService.class)); context.dispatchStatusEventAsync("start", "2");
return null;
} }

最后这个最简单,仅仅设置下所要推送的消息.

package nav.wenbo.service.functions;

import nav.wenbo.service.ServiceExtension;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject; public class SendFunction implements FREFunction { @Override
public FREObject call(FREContext context, FREObject[] args) {
// TODO Auto-generated method stub
String msg="none";
try
{
msg = args[0].getAsString();
}
catch(Exception e)
{ }
ServiceExtension.Msg = msg;
return null;
} }

做完这些,并设置好权限后,把项目导出jar包, 命名为 libAndroidServiceLib.jar

下一节我将介绍air中跟此jar包对接。

通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)的更多相关文章

  1. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(一)

    项目组用air来开发手游, 但有些在原生应用里很容易实现的功能没有办法在air中直接调用,比如说震动,服务等等.但Adobe 提供了一种方法让air间接调用本地代码(java,object-c...) ...

  2. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)

    jar包完成后,剩下就是要构建ANE包来供实际程序调用. 首先要建两个Flex库项目, default那个是官方建议加上的,仅用于不在真实环境下编译调试的时候有个默认接口不至于调用不成功报错,项目结构 ...

  3. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(四)

    这一节,是要把AS库和Android的jar包及相关配置文件打成一个ane包. 首先先建一个build目录,里面文件目录结构如下: 然后用打开压缩包的方式打开ServiceLib.swc, 把其中的l ...

  4. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(五)

    这一节,用个简单的例子来调用下之前生成的service.ane 首先建一个flex手机项目 然后在构建路径中把ane引进来 可以看到此ane支持Android平台. serviceMobile.mxm ...

  5. 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)

    这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...

  6. APNS 服务推送通知

    1. 将app注册notification里面, 并从APNS上获取测试机的deviceToken. - (BOOL)application:(UIApplication *)application ...

  7. 模拟websocket推送消息服务mock工具二

    模拟websocket推送消息服务mock工具二 在上一篇博文中有提到<使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock>使用electron创建一个模拟后 ...

  8. Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

    假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...

  9. 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言

    在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...

随机推荐

  1. POJ 1703 Find them, catch them (并查集)

    题目:Find them,Catch them 刚开始以为是最基本的并查集,无限超时. 这个特殊之处,就是可能有多个集合. 比如输入D 1 2  D 3 4 D 5 6...这就至少有3个集合了.并且 ...

  2. 网络防火墙实战-基于pfsense(1)

    pfSense是一个免费的,开源的FreeBSD作为防火墙和路由器专为使用自定义版本.除了 是一个功能强大的,灵活的防火墙和路由平台,它包括一个长长的清单相关的功能,并允许进一步的扩展包,不添加膨胀和 ...

  3. java并行调度框架封装及演示样例

    參考资料:  阿里巴巴开源项目 CobarClient  源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...

  4. android 基于百度地图api开发定位以及获取详细地址

    一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView ...

  5. C 二叉树 1

    二叉链表: #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include & ...

  6. 文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/GoodSync/Allway Sync/Compare Advance)

    关于文件同步的文章,已经很多次出现在异次元上了,因为它们很多都能实实在在提高工作便利性.比方说有我们熟悉的云端同步软件 Dropbox.金山快盘,以及曾经还介绍过可本地使用的 Allway Sync  ...

  7. 打造强大的BaseModel(1):让Model自我描述

    前言 从事iOS开发已经两年了,从一无所知到现在能独立带领团队完成一系列APP的开发,网络上的大神给了我太多的帮助.他们无私地贡献自己的心得和经验,写出了一篇篇精美的文章.现在我也开始为大家贡献自己的 ...

  8. Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈

    1. TCP协议上传图片并给出反馈: (1)客户端: package cn.itcast_13; import java.io.BufferedInputStream; import java.io. ...

  9. Android_CntextMenu_example_textSize

    menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item ...

  10. CentOS7安装RabbitMQ集群

    实验环境 RabbitMQ 集群 server1.example.com    IP: 10.10.10.11    Node: diskserver2.example.com    IP: 10.1 ...