cocos2d-x中本地推送消息

时间:2023-03-09 08:59:46
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!=)
{
notification.repeatInterval = kCFCalendarUnitDay;
}
else
{
notification.repeatInterval = ;
}
// 推送声音//
notification.soundName = UILocalNotificationDefaultSoundName;
// 推送内容//
notification.alertBody = [NSString stringWithUTF8String: content.c_str()];
//显示在icon上的红色圈中的数子//
notification.applicationIconBadgeNumber = ;
//设置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 = ;
//获取本地推送数组
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一样了。