通过 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"; @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服务 推送消息(二)的更多相关文章
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(一)
项目组用air来开发手游, 但有些在原生应用里很容易实现的功能没有办法在air中直接调用,比如说震动,服务等等.但Adobe 提供了一种方法让air间接调用本地代码(java,object-c...) ...
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
jar包完成后,剩下就是要构建ANE包来供实际程序调用. 首先要建两个Flex库项目, default那个是官方建议加上的,仅用于不在真实环境下编译调试的时候有个默认接口不至于调用不成功报错,项目结构 ...
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(四)
这一节,是要把AS库和Android的jar包及相关配置文件打成一个ane包. 首先先建一个build目录,里面文件目录结构如下: 然后用打开压缩包的方式打开ServiceLib.swc, 把其中的l ...
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(五)
这一节,用个简单的例子来调用下之前生成的service.ane 首先建一个flex手机项目 然后在构建路径中把ane引进来 可以看到此ane支持Android平台. serviceMobile.mxm ...
- 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)
这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...
- APNS 服务推送通知
1. 将app注册notification里面, 并从APNS上获取测试机的deviceToken. - (BOOL)application:(UIApplication *)application ...
- 模拟websocket推送消息服务mock工具二
模拟websocket推送消息服务mock工具二 在上一篇博文中有提到<使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock>使用electron创建一个模拟后 ...
- Spring Boot 集成 WebSocket 实现服务端推送消息到客户端
假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...
随机推荐
- Postfix配置Q&A
原文地址:http://space.doit.com.cn/51460/viewspace-4943.html 在配置Postfix中遇到的一些问题及相关的解决方法,希望在遇到相同的问题时能起参考的作 ...
- 【转】如何从零开始学会 Ruby on Rails?
文章转自:http://huacnlee.com/blog/how-to-start-learning-ruby-on-rails/ 这个话题曾经给身边的很多朋友说过同样的话题,这里整理以下. 如果你 ...
- [置顶] Java编程笔试题之一 ----文件操作
题目:给定一个文件和一个字符串,判断文件是否包含该字符串,如果包含,请打印出包含该字符串的行号以及该行的全部内容. 思路: ①使用缓冲流(BufferedReader)读取文件,定义初始行号为0. ...
- EasyUI基础入门之Easyloader(载入器)
在了解完easyui的parser(解析器)之后,接下来就是easyloader(简单载入器)的学习了. 什么是EasyLoader 正如其名字一样easyloader的作用是为了动态的载入组件所需的 ...
- C++类的定义之作用域
每个类都定义了自己的新作用域和唯一的类型.在类的定义体内声明内成员,将成员名引入类的作用域.两个不同的类具有两个不同的类作用域. 例如: Class First { int memi; double ...
- 如何真正免费运营推广APP应用
随着移动终端的迅速普及,各类APP如雨后春笋般涌现出来,但是真正的运营成功的产品却寥寥无几. 从瓜分渠道资源到抢占用户的过程中,很多同行都明显的感觉到,渠道平台所带来的量日益减少,但是刊例价格却一再攀 ...
- 关于IE调试模式下才能显示效果
要去除console.log() 低版本IE 没有开启调试模式 console.log()会导致报错
- nginx性能配置参数说明:
nginx的配置:main配置段说明一.正常运行的必备配置: 1.user username [groupname]; 指定运行worker进程的用户和组 2.pid /path/to/pidfile ...
- 简单理解前端web开发的MVC模式
随着前端Ajax兴起.前端开发工作进一步划分:js开发和ui页面制作.另外从整个前端项目的清晰明朗以可扩展性角度来看,MVC的应用也越来越必要,特别是对大的项目. 例如 需要给一个页面上的button ...
- 关于properties文件在项目中的使用
这个是当时在学习JDBC的时候老师给讲的.web项目中把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 老师讲了两种读取 ...