zoukankan      html  css  js  c++  java
  • Cocos2dx-本地消息推送

    本文转载于:http://www.cnblogs.com/ziqiongbuxi/p/3513468.html

    用coocs2dx引擎开发单机,或者若联网游戏,加入推送通知是很有必要的。现在把本人在项目中做的推送通知整理一下供大家参考,抛砖引玉,我是调用的android 和 ios 平台自己的推送。

    首先是一个管理者:

    #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;

        

    };

    #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"

    #endif

    CCNotificationManager* 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 

    ios 下 的实现。 

    #ifndef __CCNOTIFICATION_HELPER_H__

    #define __CCNOTIFICATION_HELPER_H__

    #include <stdio.h>

    #include <time.h>

    #include "GlobalHead.h"

    class  CCNotificationHelper

    {

    public:

        static CCNotificationHelper* sharedInstance();

        

        void pushMessage(const char * message,long delay,int repeats,const char * key);

        

        void removeNotification();

        

    private:

        CCNotificationHelper();

        

    private:

        static CCNotificationHelper*  m_pNotification;

        bool   m_accept;

    };

    #define CNH     CCNotificationHelper::sharedInstance()

    #endif /* defined(__CCNOTIFICATION_HELPER_H__) */

    #include "CCNotificationHelper.h"

    CCNotificationHelper* CCNotificationHelper::m_pNotification = NULL;

    CCNotificationHelper* CCNotificationHelper::sharedInstance()

    {

        if (!m_pNotification)

        {

            m_pNotification = newCCNotificationHelper();

            returnm_pNotification;

        }

        

        returnm_pNotification;

    }

    void CCNotificationHelper::pushMessage(const char * message,long delay,int repeats,const char * key)

    {

        // repeats  0:不重复 1:/DAY  2:/HOUR 3:/MINUTE 4:SECOND

        

        NSString * castStr = [[NSStringalloc] initWithUTF8String:message];

        

        NSString * keyStr = [[NSStringalloc] initWithUTF8String:key];

        

        //1、增加一个本地推送

        NSDate *date = [NSDatedateWithTimeIntervalSinceNow:delay];

        //创建一个本地推送

        UILocalNotification *noti = [[[UILocalNotificationalloc] init] autorelease];

        if (noti) {

            //设置推送时间

            noti.fireDate = date;

            //设置时区

            noti.timeZone = [NSTimeZonedefaultTimeZone];

            //设置重复间隔

            if(repeats == 1)

            {

                noti.repeatInterval  = kCFCalendarUnitDay;

            }else if (repeats == 2)

            {

                noti.repeatInterval  = kCFCalendarUnitHour;

            }else if (repeats == 3)

            {

                noti.repeatInterval  = kCFCalendarUnitMinute;

            }else if (repeats == 4)

            {

                noti.repeatInterval  = kCFCalendarUnitSecond;

            }else

            {

                noti.repeatInterval  = 0;

            }

            

            //推送声音

            noti.soundName = UILocalNotificationDefaultSoundName;

            //内容

            noti.alertBody = castStr;

            

            //        //显示在icon上的红色圈中的数子

            noti.applicationIconBadgeNumber = 0;

            

            //设置userinfo 方便在之后需要撤销的时候使用

            NSDictionary *infoDic = [NSDictionarydictionaryWithObject:keyStr forKey:keyStr];

            noti.userInfo = infoDic;

            //添加推送到uiapplication

            UIApplication *app = [UIApplicationsharedApplication];

            [app scheduleLocalNotification:noti];

        }

        [castStr release];

        

        [keyStr release];

        

    }

    void CCNotificationHelper::removeNotification()

    {

        [[UIApplicationsharedApplication] cancelAllLocalNotifications];

    }

    CCNotificationHelper::CCNotificationHelper()

    {

        

    }

    android下的实现

    #ifndef __CCNOTIFICATION_ANDROID_H__

    #define __CCNOTIFICATION_ANDROID_H__

    #include "GlobalHead.h"

    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    #include <jni.h>  

    extern"C"

    {

        extern void java_push(string message,long mark,int repeats);

        

        extern void java_removePush();

    }

    #endif

    #endif

    #include "CCNotificationAndroid.h"

    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    #include "jni/JniHelper.h"

    #include <android/log.h>

    #include <jni.h>

    extern"C"

    {

        void java_push(string message,long mark,int repeats)

        {

            JniMethodInfo t;

            //LI

            if (JniHelper::getStaticMethodInfo(t,"com/ea/product/alpaca/alpaca","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/alpaca/alpaca","removeNotification", "()V");

            if (!isHave)

            {

                CCLOG("jni:此函数不存在");

            }

            else

            {

                minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);

            }

        }

    }

    #endif

    然后切换到pro.android 

    public class alpaca extends Cocos2dxActivity {

    public  finalstaticint  convert = 1000;

    public  finalstatic String SER_KEY = "com.ea.product.alpaca.message";

    publicstatic alpaca malpacaObj;

    protected void onCreate(Bundle savedInstanceState) {

    Log.e("com.ea.product.alpaca", "onCreate");

    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    malpacaObj = this;

    public Cocos2dxGLSurfaceView onCreateView() {

    Log.e("com.ea.product.alpaca", "onCreateView");

    Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);

    // alpaca should create stencil buffer

    glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);

    return glSurfaceView;

    }

    @Override

    protected 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(alpaca.this, CCNotifitionService.class);

    Bundle mBundle = new Bundle();

    mBundle.putSerializable(SER_KEY, message);

    intent.putExtras(mBundle);

    alpaca.this.startService(intent);

    System.out.println("Push notify message.");

    }

    public static void pushMessage(String message,long mark,int repeats) {

    System.out.println("alpaca.passFromJni()"+mark);

    NotificationMessage nmObj = new NotificationMessage();

    nmObj.setMessage(message);

    nmObj.setMark(mark * convert);

    nmObj.setId(repeats);

    malpacaObj.SerializeMethod(nmObj);

    }

    public void onStop() {

    super.onStop();

    }

    public void onDestroy() {

    super.onDestroy();

    }

    public alpaca() {

    }

    static {

    System.loadLibrary("alpaca");

    }

    }

    这个是一个实体model

    package com.ea.product.alpaca;

    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() {

    returnmessage;

    }

    public void setMessage(String message) {

    this.message = message;

    }

    public long getMark() {

    returnmark;

    }

    public void setMark(long mark) {

    this.mark = mark;

    }

    public int getId() {

    returnid;

    }

    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.alpaca;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Timer;

    import com.ea.product.alpaca.alpaca;
    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<NotificationMessage> mMessageList = new ArrayList<NotificationMessage>(); 

    String mmessage = "" ;
    @Override
    public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
    }

    public CCNotifitionService(){
    System.out.println("CCNotifitionService.CCNotifitionService()");
    }

    @Override
    public 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); 
    }

    @Override
    public void onStart(Intent intent, int startId)
    {
    if((intent!=null) )
    {
    NotificationMessage message = (NotificationMessage)intent.getSerializableExtra(alpaca.SER_KEY);  
    mMessageList.add(message);
    }
    }

    @Override
    public 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 ;i<listSize;i++){

    if(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.alpaca.alpaca");
    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 block
    e.printStackTrace();
    }

    if(checkPushStatue())
    {
    showNotification();
    }
    }
    }
    }

    }

    最后千万不能忘了在配置文件中加入这个service的属性

            <serviceandroid:enabled="true"android:name=".CCNotifitionService"

                android:process=":message"

                />

     这样就可以在用户退出后,开启一个新的进程来处理逻辑(判断满足条件推送)

  • 相关阅读:
    layer-list:Android中layer-list使用详解
    Nexus6p:正在下载系统更新,没有进度
    转:浅谈char类型范围
    C/C++/Java中的volatile关键字
    C++中的mutable关键字
    C++中的typedef typename 作用
    C++中的友元函数和友元类
    用flashfxp做ftp镜像同步
    python读取caffemodel文件
    py-faster-rcnn几个辅助脚本
  • 原文地址:https://www.cnblogs.com/guangyun/p/4670443.html
Copyright © 2011-2022 走看看