Android本地消息推送

项目介绍:cocos2dx跨平台游戏

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

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

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

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

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

package com.funcity.funm.push;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;

import com.funcity.funm.FunmAndroid;

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent1) {
        // TODO Auto-generated method stub
        String action = intent1.getAction();
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
            resetPush(context);
        }
    }

    private void resetPush(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("funm_push", Context.MODE_PRIVATE);
        int count = sharedPreferences.getInt("noticeCount", 0);
        int noticeCount = 0;
        for (int i=0; i<count; i++) {
            long timestamp = sharedPreferences.getLong("tiemstamp_"+noticeCount, 0);
            String noticeStr = sharedPreferences.getString("noticeStr_"+noticeCount, "");
            if (timestamp !=0 && !noticeStr.equals("")) {
                Intent playerIntent = new Intent(context, PushReceiver.class);
                playerIntent.putExtra("noticeId", noticeCount);
                playerIntent.putExtra("noticeStr", noticeStr);
                PendingIntent pi = PendingIntent.getBroadcast(context, noticeCount, playerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
                am.set(AlarmManager.RTC_WAKEUP, timestamp, pi);
            }
            noticeCount++;
        }
    }
}

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

package com.funcity.funm.push;

import com.fun.funm.R;
import com.funcity.funm.FunmAndroid;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

public class PushReceiver  extends BroadcastReceiver {  

    private NotificationManager manager;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        manager = (NotificationManager)context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
        int noticeId = intent.getIntExtra("noticeId", 0);
        String noticeStr = intent.getStringExtra("noticeStr");
        Intent playIntent = new Intent(context, FunmAndroid.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, playIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setContentTitle(FunmAndroid.getAppName()).setContentText(noticeStr).setSmallIcon(R.drawable.icon).setDefaults(Notification.DEFAULT_ALL).setContentIntent(pendingIntent).setAutoCancel(true);
        manager.notify(noticeId, builder.build());
        Log.v("and_log","收到推送:onReceive: "+ noticeStr);
    }
}

4.Receiver注册及权限

<receiver android:name="com.funcity.funm.push.PushReceiver">
            <intent-filter>
                 <action android:name="com.funcity.funm.push.PushReceiver"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.funcity.funm.push.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
         </receiver>

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

android:targetSdkVersion="18"

注意:

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

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

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

时间: 2024-11-07 20:20:41

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

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

消息推送的目的:让服务器端及时的通知客户端 实现方案 轮询:客户端每隔一定的时间向服务器端发起请求,获得最新的消息 特点:如果用在最新新闻通知上,效率就有点低了,技术简单,好实现 应用场景:服务器端以一定的频率更新时,如:股票行情,就比较适用轮询了 当你把手机应用的聊天打开,过了一会发烫,基本就是轮询实现的 发短信:服务端发送短信,客户端对短信进行解析 特点:最及时,费用高 应用场景:土豪公司,没联网也可以收到信息 使用第三方的开源项目: androidPN (android push noti

android热门消息推送横向测评!

关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做了一个简单的调研,希望可以帮到大家. 简介: 手机推送服务是指服务器定向将信息实时送达手机的服务.推送服务,主要就是将最新资讯和最近的活动信息及时推送给用户,与用户保持互动,从而提高用户粘性,提升用户体验.例如,微信,新浪微博等APP的通知栏消息. 原理: 1)轮询(Pull)方式:应用程序应当阶段

Android (Notification)消息推送机制

从网上查询资料学习Android消息推送机制,效果图如下: 1.首先是布局文件代码 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"

IOS本地消息推送(UILocalNotification)

IOS本地的Notification由iOS下NotificationManager统一管理,只需要将封装好的本地Notification对象加入到系统Notification管理机制队列中,系统会在指定的时间激发将本地Notification,应用只需设计好处理Notification的方法就完成了整个Notification流程了. IOS本地的Notification有UILocalNotification对象完成.它包括的主要属性有:fireDate.timeZone.repeatInt

本地消息推送设置

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10]; UILocalNotification *localNotification = [[UILocalNotification alloc]init]; localNotification.fireDate = date; localNotification.timeZone = [NSTimeZone localTimeZone]; localNotification.alertBo

Android第三方消息推送

====================问题描述==================== 我看现在第三方的消息推送怎么都是从网页推到手机上的?有没有从手机到手机的,即时聊天那样的?有哪些? ====================解决方案1==================== 终端直接一般依靠服务器实现,如果终端不经过服务器中转,那就不能实现广域网通讯.终端之间可以通过udp广播实现局域网内消息推送. ====================解决方案2====================

关于Android的消息推送以及前后台切换

让Android点击通知栏信息后返回正在运行的程序,并完全退出所有activity 首先,其中一个原因可能是从通知栏打开应用是新开activity并且是存在一个新的task堆里的,这种情况下使用 restartpackage()方法不能关闭应用的所有activity,解决的办法可以强制从通知栏打开应用时回来原activity或者能关闭所有 task里的 activity 方法二试过,不过不知如何取出所有activity,task也不知如何清除.方法一现在想想应该推荐这种方法,找到的方法资料先贴上

Android后台消息推送-android学习之旅(71)

建议使用第三方的sdk,比如极光推送,小米推送,百度推送 版权声明:本文为博主原创文章,未经博主允许不得转载.

Android Mqtt 消息推送使用

初始化SDK: /** * 初始化SDK * * @param context context */ public void initSDK(Context context) { String clientId = String.valueOf(System.currentTimeMillis()+userId); mqttAndroidClient = new MqttAndroidClient(mContext, serverUri, clientId); subscriptionTopic