项目介绍:cocos2dx跨平台游戏

项目需求:实现本地消息推送,需求①:定点推送;需求②:根据游戏内逻辑实现推送(比如玩家体力满时,需要计算后到点推送);需求③:清理后台程序或重启后依然能够实现本地推送。

功能实现:由于IOS有一套比较成熟的UILocalNotification推送机制,这里主要说明Android下本地推送的实现。另外大家感兴趣可以看下第三方的推送:个推、极光、腾讯信鸽、百度云推送等,第三方多是要接入服务端,否则只能自己在第三方申请的应用的后台手动推送,另外第三方也不保证能100%所有客户端都能接收到推送。自己游戏里接入了信鸽,亲试,开启游戏可以收到推送,关闭游戏未能收到而是在再次启动游戏时收到。看来接收也有待优化。

1.全局定时器AlarmManager,可参考闹钟app,AlarmManager为系统级别,所以一般不会被清理掉,并把设定的提醒保存到本地(这里使用的SharedPreference,也可使用SQLite数据库存储),开机重启时重新设置定时提醒。

  1. /**
  2. * 消息推送
  3. * noticeStr:通知内容
  4. * tiemstamp:通知的启动的时间戳,单位为秒,定时器单位为毫秒
  5. */
  6. public int noticeCount = 0;
  7. public void pushMessage(String noticeStr, long timestamp) {
  8. //System.currentTimeMillis() 等于 Calendar.getInstance().getTimeInMillis()
         
  9. long longTime = timestamp*1000;if (longTime > System.currentTimeMillis()) {
  10. Intent intent = new Intent(this, PushReceiver.class);
  11. //设置参数
  12. intent.putExtra("noticeId", noticeCount);
  13. intent.putExtra("noticeStr", noticeStr);
  14. //timestamp参数 区别要注册的PendingIntent
  15. //receiver获取参数需要flag设置为PendingIntent.FLAG_UPDATE_CURRENT
  16. PendingIntent pi = PendingIntent.getBroadcast(FunmAndroid.this, noticeCount, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  17. AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);;
  18. am.set(AlarmManager.RTC_WAKEUP, longTime, pi);
  19. //本地存储,手机重启,需要重新设置
  20. SharedPreferences sharedPreferences = getSharedPreferences("funm_push", Context.MODE_PRIVATE);
  21. Editor editor = sharedPreferences.edit();
  22. editor.putLong("tiemstamp_"+noticeCount, longTime);
  23. editor.putString("noticeStr_"+noticeCount, noticeStr);
  24. editor.putInt("noticeCount", noticeCount);
  25. Log.v("and_log", "put noticeCount: "+noticeCount);
  26. editor.commit();
  27. noticeCount++;
  28. }
  29. }

2.接收广播:BroadCastReceiver,注意这里使用BroadCastReceiver,不要使用service。开机重新设置提醒。

  1. package com.funcity.funm.push;
  2.  
  3. import android.app.Activity;
  4. import android.app.AlarmManager;
  5. import android.app.PendingIntent;
  6. import android.content.BroadcastReceiver;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.content.SharedPreferences;
  10.  
  11. import com.funcity.funm.FunmAndroid;
  12.  
  13. public class BootReceiver extends BroadcastReceiver {
  14.  
  15. @Override
  16. public void onReceive(Context context, Intent intent1) {
  17. // TODO Auto-generated method stub
  18. String action = intent1.getAction();
  19. if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
  20. resetPush(context);
  21. }
  22. }
  23.  
  24. private void resetPush(Context context) {
  25. SharedPreferences sharedPreferences = context.getSharedPreferences("funm_push", Context.MODE_PRIVATE);
  26. int count = sharedPreferences.getInt("noticeCount", 0);
  27. int noticeCount = 0;
  28. for (int i=0; i<count; i++) {
  29. long timestamp = sharedPreferences.getLong("tiemstamp_"+noticeCount, 0);
  30. String noticeStr = sharedPreferences.getString("noticeStr_"+noticeCount, "");
  31. if (timestamp !=0 && !noticeStr.equals("")) {
  32. Intent playerIntent = new Intent(context, PushReceiver.class);
  33. playerIntent.putExtra("noticeId", noticeCount);
  34. playerIntent.putExtra("noticeStr", noticeStr);
  35. PendingIntent pi = PendingIntent.getBroadcast(context, noticeCount, playerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  36. AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
  37. am.set(AlarmManager.RTC_WAKEUP, timestamp, pi);
  38. }
  39. noticeCount++;
  40. }
  41. }
  42. }

3.接收提醒并发起推送:

  1. package com.funcity.funm.push;
  2.  
  3. import com.fun.funm.R;
  4. import com.funcity.funm.FunmAndroid;
  5.  
  6. import android.app.Notification;
  7. import android.app.NotificationManager;
  8. import android.app.PendingIntent;
  9. import android.content.BroadcastReceiver;
  10. import android.content.Context;
  11. import android.content.Intent;
  12. import android.support.v4.app.NotificationCompat;
  13. import android.util.Log;
  14.  
  15. public class PushReceiver extends BroadcastReceiver {
  16.  
  17. private NotificationManager manager;
  18. @Override
  19. public void onReceive(Context context, Intent intent) {
  20. // TODO Auto-generated method stub
  21. manager = (NotificationManager)context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
  22. int noticeId = intent.getIntExtra("noticeId", 0);
  23. String noticeStr = intent.getStringExtra("noticeStr");
  24. Intent playIntent = new Intent(context, FunmAndroid.class);
  25. PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, playIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  26. NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
  27. builder.setContentTitle(FunmAndroid.getAppName()).setContentText(noticeStr).setSmallIcon(R.drawable.icon).setDefaults(Notification.DEFAULT_ALL).setContentIntent(pendingIntent).setAutoCancel(true);
  28. manager.notify(noticeId, builder.build());
  29. Log.v("and_log","收到推送:onReceive: "+ noticeStr);
  30. }
  31. }

4.Receiver注册及权限

  1. <receiver android:name="com.funcity.funm.push.PushReceiver">
  2. <intent-filter>
  3. <action android:name="com.funcity.funm.push.PushReceiver"/>
  4. </intent-filter>
  5. </receiver>
  6. <receiver android:name="com.funcity.funm.push.BootReceiver">
  7. <intent-filter>
  8. <action android:name="android.intent.action.BOOT_COMPLETED" />
  9. </intent-filter>
  10. </receiver>

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

android:targetSdkVersion="18"

注意:

1.手机必须开启允许开启自启动权限定时推送才能在重启后依然生效。有些手机管理软件,如360会推荐关闭一些应用的开机自启动选项。

2.targetSdkVersion19以前是准时推送,貌似19之后为非准时推送,需要注意一下。

3.有些手机类型,比如小米,可能有5分钟以内的误差,可能是基于省电的考虑。

Android本地消息推送的更多相关文章

  1. Android开发学习笔记-关于Android的消息推送以及前后台切换

    下面是最简单的Android的消息推送的实现方法 package com.example.shownotic; import java.util.Random; import android.supp ...

  2. Android客户端消息推送原理简介

    首先简单介绍一下Android消息推送的主要三种方式,如果你已经看过类似的文章,请直接忽略三种介绍.    1.使用SMS服务,即服务器端发送短信,然后手机客户端监听短信的广播,然后对数据进行一定的处 ...

  3. [android] 安卓消息推送的几种实现方式

    消息推送的目的:让服务器端及时的通知客户端 实现方案 轮询:客户端每隔一定的时间向服务器端发起请求,获得最新的消息 特点:如果用在最新新闻通知上,效率就有点低了,技术简单,好实现 应用场景:服务器端以 ...

  4. Android 生态消息推送平台介绍

    一.手机厂商平台 华为消息推送服务 华为推送(Push)是为开发者提供的消息推送平台,建立了从云端到手机端的消息推送通道,使应用可以将最新信息及时通知用户,从而构筑良好的用户关系,提升用户的感知和活跃 ...

  5. android热门消息推送横向测评![转]

    关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做 ...

  6. Android (Notification)消息推送机制

    从网上查询资料学习Android消息推送机制,效果图如下: 1.首先是布局文件代码 activity_main.xml <?xml version="1.0" encodin ...

  7. Android之消息推送实现

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  8. iOS/Android网络消息推送的实现两种方法

    移动时代,用户为王,而每个APP拥有的活跃用户量(Active Users),决定了其价值. 消息推送成为了不可或缺的活跃唤起工具. 目前消息推送有如下两种途径: 1.iOS传统方式: 通过Apple ...

  9. IOS - 本地消息推送

    第一步:创建本地推送 // 创建一个本地推送 UILocalNotification *notification = [[[UILocalNotification alloc] init] autor ...

随机推荐

  1. eclipse 安装egit插件

    一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到对应的 EGit插件,无法安装) E ...

  2. 最短的计算大数乘法的c程序

    #include <stdio.h> char s[99],t[99]; int m,n; void r(int i,int c) { int j=0,k=i; while(k)c+=s[ ...

  3. Meter Bus解析4:升压斩波电路

             Meter Bus解析1(http://blog.csdn.net/qingwufeiyang12346/article/details/47767595),对Meter Bus进行 ...

  4. Fragmen的onAttach方法

    现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写在Fr ...

  5. changing permissions of Read-only file system in linux

      up vote 2 down vote favorite 1 i use this command to make a bootable flash disk of linux mint sudo ...

  6. 重启标志log

    01) fatal error : 如下: [ >.()[:swapper/][name:disp_lcm&][DISP]disp_lcm_probe [ >.()[:swappe ...

  7. 在Java中实现UDP协议编程(DatagramSocket/DatagramPacket)

    1.什么是UDP协议? UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层. ...

  8. poj1200Crazy Search(hash)

    题目大意   将一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串. /* 字符串hash O(n)枚举起点 然后O(1)查询子串hash值 然后O(n)找不一样的个数 ...

  9. 各地图API坐标系统比较

    各地图API坐标系统比较 简单记录一下各家坐标系 WGS84坐标系:即地球坐标系,国际上通用的坐标系.设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,谷歌地图采用的是WGS84地 ...

  10. printf的字符型

    参  数 说  明 %s 按实际宽度输出一个字符串 %ms m指定宽度(不足时左补空格,大于时按实际宽度输出) %-ms 左对齐,不足时右补空格 %m.ns 输出占m个字符位置,其中字符数最多n个,左 ...