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