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

posted @ 2014-10-20 18:10  HUWENFENG  阅读(3677)  评论(2编辑  收藏  举报