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一样了。
cocos2d-x中本地推送消息的更多相关文章
- iOS -- 处理推送消息
简介 很多应用都会实现推送功能,我们可以集成第三方框架实现推送功能,比如: JPush推送:https://www.jpush.cn 个推:http://www.getui.com 下面来说说收到推送 ...
- iOS8推送消息的回复处理速度
iOS8我们有一个新的通知中心,我们有一个新的通报机制.当在屏幕的顶部仅需要接收一个推拉向下,你可以看到高速接口,天赋并不需要输入应用程序的操作.锁定屏幕,用于高速处理可以推动项目. 推送信息,再次提 ...
- iOS8推送消息的快速回复处理
http://blog.csdn.net/yujianxiang666/article/details/35260135 iOS8拥有了全新的通知中心,有全新的通知机制.当屏幕顶部收到推送时只需要往下 ...
- 本地推送UILocalNotification(转)
1.增加一个本地推送 //设置20秒之后 NSDate *date = [NSDate dateWithTimeIntervalSinceNow:]; //chuagjian一个本地推送 UILoca ...
- IOS中程序如何进行推送消息(本地推送,远程推送)
[1]-------------什么是推送消息? 我就以一张图解释------------ [2]-----------IOS程序中如何进行本地推送?----------- 2.1,先征求用户同意 1 ...
- IOS中程序如何进行推送消息(本地推送,远程推送)2(上)
未看过本地推送的,可以提前看一下本地推送. http://www.cnblogs.com/wolfhous/p/5135711.html =============================== ...
- IOS 本地通知推送消息
在现在的移动设备中,好多应用性的APP都用到了推送服务,但是有好多推送的内容,比如有的只是单纯的进行推送一个闹钟类型的,起了提醒作 用,有的则是推送的实质性的内容,这就分为推送的内容来区别用什么推送, ...
- SWIFT推送之本地推送(UILocalNotification)之二带按钮的消息
上一篇讲到的本地推送是普通的消息推送,本篇要讲一下带按钮动作的推送消息,先上个图瞅瞅: 继上一篇的内容进行小小的改动: 在didFinishLaunchingWithOptions方法内进行以下修改 ...
- iOS-推送,证书申请,本地推送
介绍一点点背景资料 众所周知,使用推送通知是一个很棒的.给应用添加实时消息通知的方式.这样做的结局是,开发者和用户之间,彼此永远保持着一种令人愉悦的亲密关系. 然而不幸的是,iOS的推送通知并非那么容 ...
随机推荐
- wsse:InvalidSecurity Error When Testing FND_PROFILE Web Service in Oracle Applications R 12.1.2 from SOAP UI (Doc ID 1314946.1)
wsse:InvalidSecurity Error When Testing FND_PROFILE Web Service in Oracle Applications R 12.1.2 from ...
- JsonPath详解
JsonPath is to JSON what XPATH is to XML, a simple way to extract parts of a given document. JsonPat ...
- Innodb引擎 long semaphore waits
上一篇介绍了因为子表过多,导致innodb crash的情况,但crash的原因是long semaphore waits.long semaphore waits又为何物? 背景:Innodb使用了 ...
- UVa 10539 (筛素数、二分查找) Almost Prime Numbers
题意: 求正整数L和U之间有多少个整数x满足形如x=pk 这种形式,其中p为素数,k>1 分析: 首先筛出1e6内的素数,枚举每个素数求出1e12内所有满足条件的数,然后排序. 对于L和U,二分 ...
- Java框架的思考
目前的JAVA 企业级开发框架,我们常用的大致包括IOC AOP MVC ORM框架 1. IOC spring是一个非常棒的ico容器,其思想非常简单,用一个集合对象如MAP 来缓存对象(对象都是单 ...
- Hibernate4.x之映射文件
POJO类和数据库的映射文件*.hbm.xml POJO类和关系数据库之间的映射可以用一个XML文档来定义 通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据库表之间的对应关系, ...
- iOS开发中提交带有中文或特殊字符串的参数
iOS开发中,与后台进行数据交换是一个很常见的场景. 在web开发中,对于我们提交的地址,浏览器会负责进行decode,但是在ios中,必须要自己手动来实现.否则我们拼接出的网址在包括中文.特殊字符串 ...
- HDU 4009 Transfer water 最小树形图
分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...
- 【转】修改xampp的mysql默认密码
http://www.cnblogs.com/hongchenok/archive/2012/08/21/2648549.html MySQL 的“root”用户默认状态是没有密码的,所以在 PHP ...
- 《转》高级Unix命令
原文链接:http://coolshell.cn/articles/1044.html 在Unix操作中有太多太多的命令,这些命令的强大之处就是一个命令只干一件事,并把这件事干好.Do one thi ...