通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
着手改造之前,有兴趣可以阅读下官方文档: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服务 推送消息(二)相关推荐
- 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)
这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...
- ios 消息服务器,关于IOS APNS推送消息(iphone端+服务端)
这两天,项目要求做个推送功能,研究了一天,在此跟各位分享下.因为之前做了一年的php,所以服务端我自己写的,php语言. 1:请求证书,APPID各种繁琐的操作,我就不多话了,我也是看网上例子的. h ...
- Android Cloud to Device Messaging 服务介绍 – 如何使用云计算推送消息到手机(转载)...
基 于 Android 的手机是面向移动互联网的手机,保持24小时在线才能充分发挥它的全部能量.而 Google 也在不断提供各式各样的网络服务来吸引用户,有的服务是直接面向终端用户,而有的服务是面向 ...
- android推送服务不被关闭,Android APP被关闭后无法收到推送消息(尝试)
1. Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...
- Java 服务端推送消息有那么难吗?
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 转自公众号:码农小胖哥 今天项目经理交给我一个开发任务.如果有人在前台下了订单就给后台仓库管 ...
- 苹果推送消息服务(转)
苹果推送消息服务 .NET 开源项目:https://github.com/Redth/APNS-Sharp Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个 ...
- android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法
问题的提出 本次接入的是个推,其他家的推送没有研究过,思路应该是类似的 App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面 App在后台,或是App进程已 ...
- JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息
客户端代码: package com.lcx.socket;import java.io.BufferedReader; import java.io.BufferedWriter; import j ...
- nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...
C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用 运行效果: 1.安装Microsoft.AspNetCore.Signa ...
最新文章
- html导入excel文件,使用js-xlsx简单实现一个导入excel
- 在校园里捉到一只小鸟,怎么办?
- Java里optionsMenu.add_Android中OptionMenu的使用总结
- python简单爬虫入门一_Python简单爬虫入门二
- 第一阶段用户模板和场景
- PyTorch深度学习实践02
- UI5 libraries determined in Backend
- 汇编学习笔记(二)--数据处理的两个基本问题
- 转载:Pixhawk源码笔记一:APM代码基本结构
- vim简单命令教程-firstblood
- 中国汽车产业数字化服务商研究报告及TOP50榜单
- python 解方程 sympy_Python数据处理篇之Sympy系列(五)---解方程
- Sequence operation3397
- java根据ip获取经纬度城市地址
- 百度迁徙数据爬取 生成excel数据
- 台式计算机的质保期是多少,戴尔台式机保修多长时间
- 算法总结与学习心得体会
- 宝塔同时安装苹果cms海洋cms_海洋cms新手入门安装配置教程
- 云和恩墨mysql_云和恩墨携手华为云鲲鹏云服务探索政企数据库升级的“新引擎”...
- 计算机格式化后能恢复数据吗,格式化数据恢复 电脑格式化了还能恢复吗?原来找回如此简单!...
热门文章
- HDU-4777 Rabbit Kingdomom(树状数组、区间离线)
- java中string的方法_java中String类中的常用方法
- [攻防世界 pwn]——实时数据监测
- Linux查看当前http连接,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- ReentrantLock之公平锁源码分析
- 常用netbeans快捷键
- url携带的参数获取并处理demo
- 剑指Offer_35_数组中的逆序对
- Longest Substring with At Most Two Distinct
- [整理]Git使用文章整理