通过 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服务 推送消息(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getchar()和getch()的区别
- 下一篇: HDFS2.x之RPC流程分析