守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 905|回复: 1

[Android] 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-20 14:25:24 | 显示全部楼层 |阅读模式

    着手改造之前,有兴趣可以阅读下官方文档: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里指定(后面会介绍)

    1. package nav.wenbo.service;

    2. import android.content.Context;
    3. import android.content.Intent;
    4. import android.util.Log;

    5. import com.adobe.fre.FREContext;
    6. import com.adobe.fre.FREExtension;

    7. public class ServiceExtension implements FREExtension {
    8.     public static final String TAG = "ServiceExtension";
    9.     public static Context appContext;
    10.     public static FREContext extensionContext;
    11.     public static String Msg = "none";
    12.    
    13.     @Override
    14.     public FREContext createContext(String contextType) {
    15.         // TODO Auto-generated method stub
    16.         return new ServiceExtensionContext();
    17.     }

    18.     @Override
    19.     public void dispose() {
    20.         // TODO Auto-generated method stub
    21.         Log.d(TAG, "Extension disposed.");
    22.     }

    23.     @Override
    24.     public void initialize() {
    25.         // TODO Auto-generated method stub
    26.         Log.d(TAG, "Extension initialized.");
    27.     }

    28. }
    复制代码
    ServiceExtension中关键是 createContext 方法,这个方法返回一个可连通air及本地Java代码的上下文。并在该上下文中定义可供air调用的方法。下面是ServiceExtensionContext类
    1. package nav.wenbo.service;

    2. import java.util.HashMap;
    3. import java.util.Map;

    4. import nav.wenbo.service.functions.InitFunction;
    5. import nav.wenbo.service.functions.SendFunction;
    6. import nav.wenbo.service.functions.StartFunction;

    7. import android.util.Log;

    8. import com.adobe.fre.FREContext;
    9. import com.adobe.fre.FREFunction;

    10. public class ServiceExtensionContext extends FREContext {
    11.     public static final String TAG = "ServiceExtensionContext";
    12.     @Override
    13.     public void dispose() {
    14.         // TODO Auto-generated method stub
    15.         Log.d(TAG,"Context disposed.");
    16.     }

    17.     @Override
    18.     public Map<String, FREFunction> getFunctions() {
    19.         Map<String, FREFunction> functions = new HashMap<String, FREFunction>();
    20.         functions.put("init", new InitFunction());
    21.         functions.put("service", new StartFunction());
    22.         functions.put("send", new SendFunction());
    23.         
    24.         return functions;
    25.     }

    26. }
    复制代码
    functions.put相当注册调用逻辑的调用名, 这里把你所有调用方法都填上。init 用于初始化上下文,service用来启动和关闭服务, send用于发送消息。 在编写对应方法之前,先把上一节的Backgroundservice 移植过来
    1. package nav.wenbo.service;

    2. import com.wenbo.navservice.R;

    3. import android.app.Activity;
    4. import android.app.Notification;
    5. import android.app.NotificationManager;
    6. import android.app.PendingIntent;
    7. import android.app.Service;
    8. import android.content.Intent;
    9. import android.os.IBinder;
    10. import android.util.Log;

    11. public class NotificationService extends Service {
    12.     private NotificationManager notificationMgr;
    13.     private Thread mthr;
    14.     private int mCount=0;
    15.     private Boolean mSend=true;
    16.    
    17.     @Override
    18.     public void onCreate() {
    19.         super.onCreate();
    20.         notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    21.         displayNotificationMessage("starting Background Service");
    22.         
    23.         if(mthr == null || mSend == false)
    24.         {
    25.             mSend=true;
    26.             mthr = new Thread(null, new ServiceWorker(), "BackgroundSercie");
    27.             mthr.start();
    28.         }
    29.         if(null != ServiceExtension.extensionContext) ServiceExtension.extensionContext.dispatchStatusEventAsync("start", "1");
    30.     }
    31.    
    32.     @Override
    33.     public void onDestroy()
    34.     {
    35.         super.onDestroy();
    36.         mSend = false;
    37.     }
    38.    
    39.     @Override
    40.     public IBinder onBind(Intent intent) {
    41.         // TODO Auto-generated method stub
    42.         return null;
    43.     }

    44.     class ServiceWorker implements Runnable {
    45.         @Override
    46.         public void run() {
    47.             // do background processing here.....
    48.             // stop the service when done...
    49.             // BackgroundService.this.stopSelf()
    50.             while(mSend)
    51.             {
    52.                 try{
    53.                     Thread.sleep(1000);
    54.                     Log.d("", "runnable" + mCount);
    55.                     displayNotificationMessage(ServiceExtension.Msg);
    56.                 }
    57.                 catch (InterruptedException e)
    58.                 {
    59.                     e.printStackTrace();
    60.                 }
    61.             }
    62.         }
    63.     }
    64.    
    65.     private void displayNotificationMessage(String message) {
    66.         if(message == "none") return;
    67.         
    68.         Log.d("", message);
    69.         mCount++;
    70.         Notification notification = new Notification(R.drawable.ic_launcher, message,
    71.                 System.currentTimeMillis());
    72.         
    73.         PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Activity.class), 0);
    74.         
    75.         notification.setLatestEventInfo(this, "女神之贱", message, contentIntent);
    76.         
    77.         notificationMgr.notify(1000, notification);
    78.     }
    79. }
    复制代码
    这里改动很小,发送的消息从ServiceExtension类里面取,当message != none时显示该通知,另ServiceExtension.extensionContext.dispatchStatusEventAsync 是用来给air程序发消息, 在air中监听StatusEvent.STATUS 可以捕获这条消息并获取对应参数。在这里用处是通知服务启动成功。下面就剩下实际调用的方法了。首先是初始化上下文,这里主要是ServiceExtension.extensionContext 主要用于往air发消息。
    1. package nav.wenbo.service.functions;

    2. import nav.wenbo.service.ServiceExtension;

    3. import android.content.Context;
    4. import android.util.Log;

    5. import com.adobe.fre.FREContext;
    6. import com.adobe.fre.FREFunction;
    7. import com.adobe.fre.FREObject;

    8. public class InitFunction implements FREFunction {
    9.     public static final String TAG = "InitFunction";
    10.     @Override
    11.     public FREObject call(FREContext context, FREObject[] args) {
    12.         ServiceExtension.extensionContext = context;
    13.         
    14.         Context appContext = context.getActivity().getApplicationContext();
    15.         ServiceExtension.appContext = appContext;
    16.         
    17.         
    18.         Log.i(TAG, "in init");
    19.         
    20.         return null;
    21.     }

    22. }
    复制代码
    这里注意了,因为我们没有独立的Android入口文件,我们 只能从 FREContext.getActivity() 来取得我们所需的上下文,并用这上下文启动我们的服务,这是跟前一节例子最大不同的地方。执行后通知air:context.dispatchStatusEventAsync("start", "2");
    1. package nav.wenbo.service.functions;

    2. import nav.wenbo.service.NotificationService;
    3. import android.content.Context;
    4. import android.content.Intent;

    5. import com.adobe.fre.FREContext;
    6. import com.adobe.fre.FREFunction;
    7. import com.adobe.fre.FREObject;

    8. public class StartFunction implements FREFunction {

    9.     @Override
    10.     public FREObject call(FREContext context, FREObject[] args) {
    11.         Context appContext = context.getActivity().getApplicationContext();
    12.         Boolean isStart=true;
    13.         try {
    14.             isStart = args[0].getAsBool();
    15.         } catch (Exception e) {
    16.             
    17.         }
    18.         if(isStart) context.getActivity().startService(new Intent(appContext, NotificationService.class));
    19.         else context.getActivity().stopService(new Intent(appContext, NotificationService.class));
    20.         
    21.         context.dispatchStatusEventAsync("start", "2");
    22.         return null;
    23.     }

    24. }
    复制代码
    最后这个最简单,仅仅设置下所要推送的消息.
    1. package nav.wenbo.service.functions;

    2. import nav.wenbo.service.ServiceExtension;

    3. import com.adobe.fre.FREContext;
    4. import com.adobe.fre.FREFunction;
    5. import com.adobe.fre.FREObject;

    6. public class SendFunction implements FREFunction {

    7.     @Override
    8.     public FREObject call(FREContext context, FREObject[] args) {
    9.         // TODO Auto-generated method stub
    10.         String msg="none";
    11.         try
    12.         {
    13.             msg = args[0].getAsString();
    14.         }
    15.         catch(Exception e)
    16.         {
    17.             
    18.         }
    19.         ServiceExtension.Msg = msg;
    20.         return null;
    21.     }

    22. }
    复制代码
    做完这些,并设置好权限后,把项目导出jar包, 命名为 libAndroidServiceLib.jar下一节我将介绍air中跟此jar包对接。
    本文来自:http://www.cnblogs.com/bobolive/p/3202038.html


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-20 14:41:38 | 显示全部楼层
    本系列文章目录

    通过 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技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-9-15 14:13 , Processed in 0.041252 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表