守望者--AIR技术交流
标题: 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二) [打印本页]
作者: 破晓 时间: 2015-1-20 14:25
标题: 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
着手改造之前,有兴趣可以阅读下官方文档:http://help.adobe.com/zh_CN/air/extensions/index.html
新建工程 NavService 并创建包 nav.wenbo.service, 这些都可以自定义,但要记住你的包名。
[attach]510[/attach]
注意最下方那个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包对接。
本文来自:http://www.cnblogs.com/bobolive/p/3202038.html
作者: 破晓 时间: 2015-1-20 14:41
本系列文章目录
通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(一)
通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(四)
通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(五)
| 欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/) |
|