着手改造之前,有兴趣可以阅读下官方文档: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";@Overridepublic FREContext createContext(String contextType) {// TODO Auto-generated method stubreturn new ServiceExtensionContext();}@Overridepublic void dispose() {// TODO Auto-generated method stubLog.d(TAG, "Extension disposed.");}@Overridepublic void initialize() {// TODO Auto-generated method stubLog.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";@Overridepublic void dispose() {// TODO Auto-generated method stubLog.d(TAG,"Context disposed.");}@Overridepublic 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;@Overridepublic 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");}@Overridepublic void onDestroy(){super.onDestroy();mSend = false;}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}class ServiceWorker implements Runnable {@Overridepublic 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";@Overridepublic 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 {@Overridepublic 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 {@Overridepublic FREObject call(FREContext context, FREObject[] args) {// TODO Auto-generated method stubString msg="none";try{msg = args[0].getAsString();}catch(Exception e){}ServiceExtension.Msg = msg;return null;}}

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

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

转载于:https://www.cnblogs.com/Free-Thinker/p/3273206.html

通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)相关推荐

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

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

  2. ios 消息服务器,关于IOS APNS推送消息(iphone端+服务端)

    这两天,项目要求做个推送功能,研究了一天,在此跟各位分享下.因为之前做了一年的php,所以服务端我自己写的,php语言. 1:请求证书,APPID各种繁琐的操作,我就不多话了,我也是看网上例子的. h ...

  3. Android Cloud to Device Messaging 服务介绍 – 如何使用云计算推送消息到手机(转载)...

    基 于 Android 的手机是面向移动互联网的手机,保持24小时在线才能充分发挥它的全部能量.而 Google 也在不断提供各式各样的网络服务来吸引用户,有的服务是直接面向终端用户,而有的服务是面向 ...

  4. android推送服务不被关闭,Android APP被关闭后无法收到推送消息(尝试)

    1.   Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...

  5. Java 服务端推送消息有那么难吗?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 转自公众号:码农小胖哥 今天项目经理交给我一个开发任务.如果有人在前台下了订单就给后台仓库管 ...

  6. 苹果推送消息服务(转)

    苹果推送消息服务 .NET 开源项目:https://github.com/Redth/APNS-Sharp Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个 ...

  7. android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法

    问题的提出 本次接入的是个推,其他家的推送没有研究过,思路应该是类似的 App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面 App在后台,或是App进程已 ...

  8. JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息

    客户端代码: package com.lcx.socket;import java.io.BufferedReader; import java.io.BufferedWriter; import j ...

  9. nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...

    C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用 运行效果: 1.安装Microsoft.AspNetCore.Signa ...

最新文章

  1. html导入excel文件,使用js-xlsx简单实现一个导入excel
  2. 在校园里捉到一只小鸟,怎么办?
  3. Java里optionsMenu.add_Android中OptionMenu的使用总结
  4. python简单爬虫入门一_Python简单爬虫入门二
  5. 第一阶段用户模板和场景
  6. PyTorch深度学习实践02
  7. UI5 libraries determined in Backend
  8. 汇编学习笔记(二)--数据处理的两个基本问题
  9. 转载:Pixhawk源码笔记一:APM代码基本结构
  10. vim简单命令教程-firstblood
  11. 中国汽车产业数字化服务商研究报告及TOP50榜单
  12. python 解方程 sympy_Python数据处理篇之Sympy系列(五)---解方程
  13. Sequence operation3397
  14. java根据ip获取经纬度城市地址
  15. 百度迁徙数据爬取 生成excel数据
  16. 台式计算机的质保期是多少,戴尔台式机保修多长时间
  17. 算法总结与学习心得体会
  18. 宝塔同时安装苹果cms海洋cms_海洋cms新手入门安装配置教程
  19. 云和恩墨mysql_云和恩墨携手华为云鲲鹏云服务探索政企数据库升级的“新引擎”...
  20. 计算机格式化后能恢复数据吗,格式化数据恢复 电脑格式化了还能恢复吗?原来找回如此简单!...

热门文章

  1. HDU-4777 Rabbit Kingdomom(树状数组、区间离线)
  2. java中string的方法_java中String类中的常用方法
  3. [攻防世界 pwn]——实时数据监测
  4. Linux查看当前http连接,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  5. ReentrantLock之公平锁源码分析
  6. 常用netbeans快捷键
  7. url携带的参数获取并处理demo
  8. 剑指Offer_35_数组中的逆序对
  9. Longest Substring with At Most Two Distinct
  10. [整理]Git使用文章整理