博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-x中本地推送消息
阅读量:6703 次
发布时间:2019-06-25

本文共 12336 字,大约阅读时间需要 41 分钟。

作者:HU

转载请注明,原文链接: 

IOS下很简单:

添加一条推送

void PushNotificationIOS::addNoticfy(std::string title,std::string content,unsigned int delalt,std::string key,unsigned int repeatTime){        // 创建一个本地推送//    UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];    //设置delalt秒之后//    NSDate *pushDate = [NSDate dateWithTimeIntervalSinceNow:delalt];    if (notification != nil)    {        // 设置推送时间//        notification.fireDate = pushDate;        // 设置时区//        notification.timeZone = [NSTimeZone defaultTimeZone];        // 设置重复间隔//        if (repeatTime!=0)        {            notification.repeatInterval = kCFCalendarUnitDay;        }        else        {            notification.repeatInterval = 0;        }        // 推送声音//        notification.soundName = UILocalNotificationDefaultSoundName;        // 推送内容//        notification.alertBody = [NSString stringWithUTF8String: content.c_str()];        //显示在icon上的红色圈中的数子//        notification.applicationIconBadgeNumber = 1;        //设置userinfo 方便在之后需要撤销的时候使用//        NSDictionary *info = [NSDictionary dictionaryWithObject:[NSString stringWithUTF8String: key.c_str()] forKey:@"DDNoticfykey"];        notification.userInfo = info;        //添加推送到UIApplication//        UIApplication *app = [UIApplication sharedApplication];        [app scheduleLocalNotification:notification];            }}

删除一条推送

void PushNotificationIOS::removeNoticfy(std::string key){    // 获得 UIApplication    UIApplication *app = [UIApplication sharedApplication];    app.applicationIconBadgeNumber = 0;    //获取本地推送数组    NSArray *localArray = [app scheduledLocalNotifications];    //声明本地通知对象    UILocalNotification *localNotification = nil;    if (localArray)    {        for (UILocalNotification *noti in localArray)        {            NSDictionary *dict = noti.userInfo;            if (dict) {                NSString* keys = [[[NSString alloc] initWithUTF8String: key.c_str()] autorelease];                NSString* inKey = [dict objectForKey:@"DDNoticfykey"];                                if ([inKey isEqualToString:keys])                {                    NSLog(@"remove1 %@,%@",keys,inKey);                    [app cancelLocalNotification: noti];                    if (localNotification){                        [localNotification release];                        localNotification = nil;                    }                    localNotification = [noti retain];                    break;                }                            }        }                //判断是否找到已经存在的相同key的推送        if (!localNotification) {            //不存在初始化            localNotification = [[UILocalNotification alloc] init];        }                if (localNotification) {            //不推送 取消推送            [app cancelLocalNotification:localNotification];            [localNotification release];            return;        }    }}

android下没有系统直接延时本地推送的功能,我们使用AlarmManager闹钟服务,和BroadcastReceiver广播来做一个本地推送

首先建一个Cocos2dxAlarmManager类

package org.cocos2dx.lib;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.AlarmManager;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;public class Cocos2dxAlarmManager {    public static void alarmNotify(Context Context, String jsonString)    {        AlarmManager localAlarmManager = (AlarmManager)Context.getSystemService(android.content.Context.ALARM_SERVICE);                String countTimeType = "rtc";        long intervalAtMillis = 86400;        long triggerAtMillis = System.currentTimeMillis() / 1000L;        int type = AlarmManager.RTC;        PendingIntent localPendingIntent; try        {          JSONObject localJSONObject = new JSONObject(jsonString);          String packageName = localJSONObject.optString("packageName",Context.getPackageName());          String ticker = localJSONObject.optString("ticker", "null");          String title = localJSONObject.optString("title", "null");          String text = localJSONObject.optString("text", "null");          String str1 = localJSONObject.optString("tag", "noonce");          triggerAtMillis = localJSONObject.optLong("triggerAtMillis", System.currentTimeMillis() / 1000L);          long triggerOffset = localJSONObject.optLong("triggerOffset", 0L);          intervalAtMillis = localJSONObject.optLong("intervalAtMillis", 0);          countTimeType = localJSONObject.optString("countTimeType", "rtc");          triggerAtMillis *= 1000L;          long triggerOffsetMillis = triggerOffset * 1000L;          intervalAtMillis *= 1000L;          int id = localJSONObject.optInt("id", 0);          if (triggerOffsetMillis > 0L)              triggerAtMillis += triggerOffsetMillis;//          if (!countTimeType.equals("rtc"))//            return;          Intent localIntent = new Intent("game_receiver");//广播名,时间到了就会发送game_receiver          Bundle localBundle = new Bundle();          localBundle.putInt("flag", id);          localBundle.putString("packageName", packageName);          localBundle.putString("ticker", ticker);          localBundle.putString("title", title);          localBundle.putString("text", text);          localIntent.putExtras(localBundle);          localPendingIntent = PendingIntent.getBroadcast(Context, id, localIntent, PendingIntent.FLAG_UPDATE_CURRENT);          if (!str1.equals("once"))          {              localAlarmManager.set(type, triggerAtMillis, localPendingIntent);          }          else          {              localAlarmManager.setRepeating(type , triggerAtMillis, intervalAtMillis, localPendingIntent);           }//            Intent localIntent1 = new Intent("game_receiver");//            PendingIntent localPendingIntent1 = PendingIntent.getBroadcast(Context, 0, localIntent, 0);          long sss = System.currentTimeMillis();          sss += 10000;             Log.v("MyService","Cocos2dxAlarmManager "+(System.currentTimeMillis()-triggerAtMillis));          //            localAlarmManager.set(AlarmManager.RTC_WAKEUP , triggerAtMillis, localPendingIntent);//            localAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP , System.currentTimeMillis(), 5000, localPendingIntent);         }        catch (JSONException localJSONException)        {//          localJSONException.printStackTrace();////          if (countTimeType.equals("rtc_wakeup"))//              type = AlarmManager.RTC_WAKEUP;//          if (countTimeType.equals("elapsed_wakeup"))//              type = AlarmManager.ELAPSED_REALTIME_WAKEUP;//          type = AlarmManager.ELAPSED_REALTIME;//          //          localAlarmManager.setRepeating(type, triggerAtMillis, intervalAtMillis, localPendingIntent);        }    }        public static void cancelNotify(Context paramContext, int paramInt)      {        NotificationManager localNotificationManager = (NotificationManager)paramContext.getSystemService("notification");        localNotificationManager.cancel(paramInt);                AlarmManager localAlarmManager = (AlarmManager)paramContext.getSystemService(android.content.Context.ALARM_SERVICE);        PendingIntent localPendingIntent = PendingIntent.getBroadcast(paramContext, paramInt, new Intent("game_receiver"), PendingIntent.FLAG_NO_CREATE);        if (localPendingIntent == null)          return;        localAlarmManager.cancel(localPendingIntent);      }      public static void cancelNotify(Context paramContext, String paramString)      {        AlarmManager localAlarmManager = (AlarmManager)paramContext.getSystemService(android.content.Context.ALARM_SERVICE);        try        {          JSONArray localJSONArray = new JSONObject(paramString).optJSONArray("piids");          int i = 0;          if (i >= localJSONArray.length())            return;          PendingIntent localPendingIntent = PendingIntent.getBroadcast(paramContext, localJSONArray.getInt(i), new Intent("game_receiver"), PendingIntent.FLAG_NO_CREATE);          if (localPendingIntent != null)            localAlarmManager.cancel(localPendingIntent);          ++i;        }        catch (JSONException localJSONException)        {          localJSONException.printStackTrace();        }      }}

在Cocos2dxActivity.java中添加一个方法给调用者使用

public static void addNoticfy(String title,String content,int delalt,int key,int repeatTime)    {        JSONObject j = new JSONObject();        try {            j.put("ticker", content);            j.put("title", title);            j.put("text", content);            if(repeatTime<=0)            {                j.put("tag", "once");            }            else            {                j.put("intervalAtMillis", repeatTime);            }            j.put("triggerOffset", delalt);            j.put("id", key);            j.put("packageName", "com.xxx.cxxxx");//包名注意填            Cocos2dxAlarmManager.alarmNotify(instance, j.toString());        } catch (JSONException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

再添加一个Cocos2dxBroadcastReceiver类用于接收广播

package org.cocos2dx.lib;import android.app.ActivityManager;import android.app.ActivityManager.RunningServiceInfo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;public class Cocos2dxBroadcastReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {        // TODO Auto-generated method stub        if(intent.getAction().equals("game_receiver"))        {            Log.v("MyService","Cocos2dxPushService onReceive");             Bundle localBundle = intent.getExtras();            int flag = localBundle.getInt("flag");            String packageName = localBundle.getString("packageName");            String ticker = localBundle.getString("ticker");            String title = localBundle.getString("title");            String text = localBundle.getString("text");            int id = localBundle.getInt("id");            Log.v("MyService","Cocos2dxPushService onReceive2  "+packageName);             Cocos2dxNotification.doNotify(context, packageName, ticker, title, text,id);//开始本地推送        }    }}

再添加一个推送消息类

package org.cocos2dx.lib;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.support.v4.app.NotificationCompat;import android.util.Log;public class Cocos2dxNotification {
public static void doNotify(Context paramContext, String packageName, String ticker, String title, String text, int id) {
int icon = paramContext.getResources().getIdentifier("notification_icon", "drawable", paramContext.getPackageName()); NotificationManager localNotificationManager = (NotificationManager)paramContext.getSystemService("notification"); NotificationCompat.Builder localBuilder = new NotificationCompat.Builder(paramContext); localBuilder.setSmallIcon(icon); localBuilder.setTicker(ticker); localBuilder.setContentTitle(title); localBuilder.setContentText(text); localBuilder.setAutoCancel(true); try { Log.v("MyService",packageName); Log.v("MyService",Class.forName(packageName).toString()); Intent localIntent = new Intent(paramContext, Class.forName(packageName)); localIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); localIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); localBuilder.setContentIntent(PendingIntent.getActivity(paramContext, 0, localIntent, PendingIntent.FLAG_ONE_SHOT)); Notification notfi =localBuilder.build(); notfi.defaults=Notification.DEFAULT_SOUND; notfi.defaults |= Notification.DEFAULT_VIBRATE; notfi.defaults|=Notification.DEFAULT_LIGHTS; localNotificationManager.notify(id, notfi); return; } catch (ClassNotFoundException localClassNotFoundException) { localClassNotFoundException.printStackTrace(); } }}

使用时只要使用Cocos2dxActivity.java中

public static void addNoticfy(String title,String content,int delalt,int key,int repeatTime)

方法就可以和IOS一样了。

转载于:https://www.cnblogs.com/xioapingguo/p/4038277.html

你可能感兴趣的文章
Centos7安装chrome浏览器
查看>>
第八章 磁盘操作-centos7.5知识
查看>>
libjpeg.(a|so)--libpng.(also)--ldap libraries
查看>>
Java Math.round()
查看>>
python 自动生成k8s 集群yaml 文件
查看>>
declare命令
查看>>
怎样用cmd启动停止服务
查看>>
CSS 很容易,那为什么大家还是把 CSS 写的那么烂呢?
查看>>
文件权限的s位
查看>>
zencart 如何调用边框等
查看>>
JS获取页面高宽
查看>>
Java集合, ArrayBlockingQueue源码解析(常用于并发编程)
查看>>
二维几何变换---二维复合变换
查看>>
阶乘的末尾有多少0 Factorial Trailing Zeroes
查看>>
我的友情链接
查看>>
Windows Server2003防***权限设置
查看>>
特例:Outlook / Live Mail 之非戰之罪:附件打不開
查看>>
MyEclipse上运行比特币全节点bitcoinj
查看>>
Linux系统下Shell命令行快捷键实用技巧
查看>>
解决“远程计算机需要网络级别身份验证,你的系统不支持”难题
查看>>