• cocos2d-x中本地推送消息


    作者:HU

    转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4038277.html 

    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一样了。

  • 相关阅读:
    codeforces 459 C. Pashmak and Buses(思维)
    poj 2763 Housewife Wind(树链剖分+单点查询+区间修改)
    codeforces E. Phone Talks(dp)
    BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分+单点更新+区间求和+区间求最大值)
    SPOJ
    hdu 3966 Aragorn's Story(树链剖分+区间修改+单点查询)
    codeforces H. Queries for Number of Palindromes(区间dp)
    codeforces 245 D. Restoring Table(位运算+思维)
    codeforces 402 D. Upgrading Array(数论+贪心)
    codeforces 793 D. Presents in Bankopolis(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/xioapingguo/p/4038277.html
Copyright © 2020-2023  润新知