cocos2dx 消息推送
来源:互联网 发布:adobe br是什么软件 编辑:程序博客网 时间:2024/05/02 00:33
用coocs2dx引擎开发游戏,消息推送通知是很有必要的。android端实现
首先是一个消息管理者:
CCNotificationManager.h
#ifndef __CCNOTIFICATION_MANAGER_H__#define __CCNOTIFICATION_MANAGER_H__#define NM CCNotificationManager::getNotificationManager()#include "GlobalHead.h"class CCNotificationManager{public: static CCNotificationManager* getNotificationManager(); void notification(const char * message,long delay,int repeats,const char * key);private: CCNotificationManager();private: staticCCNotificationManager* m_pNotifiMgr;};
CCNotificationManager.cpp
#include "CCNotificationManager.h"#include "CCTimeHelper.h"#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)#include "CCNotificationHelper.h"#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include "CCNotificationAndroid.h"#endifCCNotificationManager* CCNotificationManager::m_pNotifiMgr = NULL;CCNotificationManager::CCNotificationManager(){}CCNotificationManager* CCNotificationManager::getNotificationManager(){ if (NULL == m_pNotifiMgr) { m_pNotifiMgr = newCCNotificationManager(); returnm_pNotifiMgr; } returnm_pNotifiMgr;}void CCNotificationManager::notification(const char * message,long delay,int repeats,const char * key){#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)// CNH->pushMessage(message ,delay ,repeats,key ); CNH->pushMessage(message ,delay ,0,key );#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) java_push(message,delay + GTH->getCurrentTime(),repeats);#endif}#endif
**
android下的实现
**
CCNotificationAndroid.h
#ifndef __CCNOTIFICATION_ANDROID_H__#define __CCNOTIFICATION_ANDROID_H__#include "GlobalHead.h"#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include extern"C"{ extern void java_push(string message,long mark,int repeats); extern void java_removePush();}#endif#endif
调用android端
#include "CCNotificationAndroid.h"#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include "jni/JniHelper.h"#include #include extern"C"{ void java_push(string message,long mark,int repeats) { JniMethodInfo t; //LI if (JniHelper::getStaticMethodInfo(t,"com/ea/product/DAoTest/DAoTest","pushMessage","(Ljava/lang/String;JI)V")) { jstring messageStr = t.env->NewStringUTF(message.c_str()); t.env->CallStaticVoidMethod(t.classID,t.methodID,messageStr,mark,repeats); t.env->DeleteLocalRef(messageStr); } } void java_removePush() { JniMethodInfo minfo; bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ea/product/DAoTest/DAoTest","removeNotification", "()V"); if (!isHave) { CCLOG("jni:此函数不存在"); } else { minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); } }}#endif
然后切换到pro.android
public class DAoTest extends Cocos2dxActivity {public finalstaticint convert = 1000;public finalstatic String SER_KEY = "com.ea.product.DAoTest.message";publicstatic DAoTest mDAoTestObj;protected void onCreate(Bundle savedInstanceState) {Log.e("com.ea.product.DAoTest", "onCreate");super.onCreate(savedInstanceState);getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);mDAoTestObj = this;} public Cocos2dxGLSurfaceView onCreateView() { Log.e("com.ea.product.DAoTest", "onCreateView"); Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); // DAoTest should create stencil buffer glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8); return glSurfaceView;}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);}//Serializeable传递对象的方法 public void SerializeMethod(NotificationMessage message) { Intent intent = new Intent(); intent.setClass(DAoTest.this, CCNotifitionService.class); Bundle mBundle = new Bundle(); mBundle.putSerializable(SER_KEY, message); intent.putExtras(mBundle); DAoTest.this.startService(intent); System.out.println("Push notify message.");}public static void pushMessage(String message,long mark,int repeats) { System.out.println("DAoTest.passFromJni()"+mark); NotificationMessage nmObj = new NotificationMessage(); nmObj.setMessage(message); nmObj.setMark(mark * convert); nmObj.setId(repeats); mDAoTestObj.SerializeMethod(nmObj);}public void onStop() { super.onStop();}public void onDestroy() { super.onDestroy();}public DAoTest() {}static { System.loadLibrary("DAoTest");}}
实例
package com.ea.product.DAoTest;import java.io.Serializable;public class NotificationMessage implements Serializable{ private static final long serialVersionUID = -7060210544600464481L; private String message;privatelong mark;privateint id;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public long getMark() {return mark;}public void setMark(long mark) {this.mark = mark;}public int getId() {return id;}public void setId(int id) {this.id = id;}public NotificationMessage(String message, long mark, int id) {super();this.message = message;this.mark = mark;this.id = id;}public NotificationMessage() {}}
**
最后在service中做逻辑处理(启动一个定时器到时间就推送)
**
package com.ea.product.DAoTest;import java.util.ArrayList;import java.util.List;import java.util.Timer;import com.ea.product.DAoTest.DAoTest;import android.app.NotificationManager;import android.app.Notification;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.os.IBinder;public class CCNotifitionService extends Service {static List mMessageList = new ArrayList(); String mmessage = "" ;@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}public CCNotifitionService(){System.out.println("CCNotifitionService.CCNotifitionService()");}@Overridepublic void onCreate(){System.out.println("onCreate()"+mMessageList.size());super.onCreate();Timer timer = new Timer(true);timer.schedule(new java.util.TimerTask() { public void run() {if(checkPushStatue()){showNotification();}} }, 0, 1*1000); }@Overridepublic void onStart(Intent intent, int startId){if((intent!=null) ){NotificationMessage message = (NotificationMessage)intent.getSerializableExtra(DAoTest.SER_KEY); mMessageList.add(message);}}@Overridepublic void onDestroy() {super.onDestroy();}public CCNotifitionService(Context context){}public boolean checkPushStatue(){long currentTime = System.currentTimeMillis();if(mMessageList.size()>0){int listSize = mMessageList.size();for(int i = 0 ;iif(mMessageList.get(i).getMark() < currentTime){mmessage = mMessageList.get(i).getMessage();mMessageList.remove(i);return true;}else{return false;}}}else{return false;}return false;}public void showNotification(){Notification notification = new Notification(R.drawable.icon, mmessage, System.currentTimeMillis());notification.defaults = Notification.DEFAULT_SOUND;Intent it = new Intent(Intent.ACTION_MAIN);it.setClassName(this,"com.ea.product.DAoTest.DAoTest");it.addCategory(Intent.CATEGORY_LAUNCHER);it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);PendingIntent pintent = PendingIntent.getActivity(CCNotifitionService.this, 0,it,0);notification.setLatestEventInfo(CCNotifitionService.this,"",mmessage,pintent);String service = Context.NOTIFICATION_SERVICE;NotificationManager mNotificationManager =(NotificationManager)getSystemService(service);mNotificationManager.notify(R.string.app_name, notification);}public class PushThread implements Runnable {public void run() {System.out.println("CCNotifitionService.PushThread.run()"+mMessageList.size());while(true){try {Thread.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(checkPushStatue()){showNotification();}}}}}
最后千万不能忘了在配置文件中加入这个service的属性
独立进程
无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务。 我们需要一个独立进程的后台服务。
在androidmanifest.xml中注册service时,有一个android:process属性,如果这个属性以”.”开头,则为此服务开启一个
全局的独立进程,如果以”:”开头则为此服务开启一个为此应用私有的独立进程。 这样就可以在用户退出后,开启一个新的进程来处理逻辑(判断满足条件推送)
<serviceandroid:enabled="true"android:name=".CCNotifitionService" android:process=":message" />
0 0
- cocos2dx 消息推送
- Cocos2d-X 学习笔记 13 cocos2dx ios 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- 消息推送
- numa
- 黑马程序员——java基础之抽象与接口
- scala基本语法及注意点
- 《罗辑思维》笔记
- XML解析
- cocos2dx 消息推送
- Toast 的默认和自定义显示
- Heritrix 工具化
- Android 线程间通信机制(ITC详解)
- scala解析xml
- 【bzoj4352】 Tower
- scala指令
- 可见性和原子性——JAVA并发编程指南
- 解决vs2013网站发布时漏掉部分文件或者文件夹中的内容