实现友盟推送消息的完全自定义处理

1,下面的前提是必须申请了友盟且有app key

2,集成友盟SDK  参看官方文档http://dev.umeng.com/push/android/integration#1

3,若开发者需要实现对消息的完全自定义处理,则可以继承 UmengBaseIntentService, 实现自己的Service来完全控制达到消息的处理。

    1,实现一个类,继承 UmengBaseIntentService, 重写onMessage(Context context, Intent intent) 方法,并请调用super.onMessage(context, intent)。参考 demo 应用中MyPushIntentService。请参考下面代码:

/**

* 友盟推送服务

*/

public class PushIntentService extends UmengBaseIntentService {

private static final String TAG = PushIntentService.class.getName();

// 如果需要打开Activity,请调用Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);否则无法打开Activity。

@Override

protected void onMessage(Context context, Intent intent) {

// 需要调用父类的函数,否则无法统计到消息送达

super.onMessage(context, intent);

try {

//可以通过MESSAGE_BODY取得消息体

String message = intent.getStringExtra(BaseConstants.MESSAGE_BODY);

//            String str=message.replaceAll("\\\\", "");//将URL中的反斜杠替换为空  加上之后收不到消息

UMessage msg = new UMessage(new JSONObject(message));

Log.d(TAG,"message=" + message);    //消息体

Log.d(TAG, "custom=" + msg.custom);    //自定义消息的内容

Log.d(TAG, "title=" + msg.title);    //通知标题

Log.d(TAG, "text=" + msg.text);    //通知内容

//消息处理

Map<String ,String> extra=msg.extra;

String displayType=extra.get("displayType");//展示情况WAP 和直接activity展示

Intent intentAct = new Intent();

intentAct.setClass(context, MessageDetailActivity.class);

intentAct.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Bundle bundle = new Bundle();

MessageItem item=new MessageItem();//自定义的消息bean

item.setMsmType("PUSH");

item.setMsmcontent(msg.text);//获取推送的消息内容

item.setTitle(msg.title);//获取推送的消息标题

if (displayType.equals("DISPLAYONAPP")){//手机端展示

item.setDisplayType("DISPLAYONAPP");

} else if (displayType.equals("DISPLAYONWAP")){//打开指定网页

item.setDisplayType("DISPLAYONWAP");

item.setOtherParams(extra.get("otherParams"));//将整个自定义参数传出去,在需要的地方处理

}else{

System.out.println("推送消息类型错误!");

}

bundle.putSerializable("message", item);//传递一个序列化参数

intentAct.putExtras(bundle);

showNotification(context, msg, intentAct);//必须要有,不然收不到推送的消息

// 完全自定义消息的处理方式,点击或者忽略

boolean isClickOrDismissed = true;

if(isClickOrDismissed) {

//完全自定义消息的点击统计

UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);

} else {

//完全自定义消息的忽略统计

UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);

}

} catch (Exception e) {

Log.e(TAG, e.getMessage());

}

}

// 通知栏显示当前播放信息,利用通知和 PendingIntent来启动对应的activity

public void showNotification(Context context,UMessage msg,Intent intent) {

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

builder.setAutoCancel(true);

Notification mNotification = builder.build();

mNotification.icon = R.drawable.ic_launcher;//notification通知栏图标

mNotification.defaults |= Notification.DEFAULT_SOUND;

mNotification.defaults |= Notification.DEFAULT_VIBRATE ;

mNotification.tickerText=msg.ticker;

//自定义布局

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.activity_umeng_push);

contentView.setImageViewResource(R.id.Umeng_view, R.drawable.ic_launcher);

contentView.setTextViewText(R.id.push_title, msg.title);

contentView.setTextViewText(R.id.push_content, msg.text);

mNotification.contentView = contentView;

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,

intent, PendingIntent.FLAG_UPDATE_CURRENT);//不是Intent

//notifcation.flags = Notification.FLAG_NO_CLEAR;// 永久在通知栏里

mNotification.flags = Notification.FLAG_AUTO_CANCEL;

//使用自定义下拉视图时,不需要再调用setLatestEventInfo()方法,但是必须定义contentIntent

mNotification.contentIntent = contentIntent;

mNotificationManager.notify(103, mNotification);

}

}

说明:当自定义的参数中有URL时,会被转义,不要在这里面处理,把整个参数传递出去,在需要的地方进行取缔,不然会收不到推送的消息,我的message如下:

message={

"msg_id":"uu56667143874445555800",

"display_type":"notification",

"alias":"",

"random_min":0,

"body":{

"text":"content",

"title":"title",

"ticker":"ticker",

"play_vibrate":"true",

"play_lights":"true",

"play_sound":"true"

},

"extra":{

"otherParams":"

{\"url\":\"http://www.baidu.com\"}",

"displayType":"DISPLAYONWAP"

}

}

自定义的messageItem如下:

package com.pitaya.daokoudai.model.bean.account;

import org.json.JSONException;

import org.json.JSONObject;

import java.io.Serializable;

/**

* 我的消息  bean  包含類型,時間,類容,狀態,消息未读数

*/

public class MessageItem implements Serializable {

private String msmType;

private Long msmDate;

private String msmcontent;

private boolean msmstatus;

private int unreadmsg;

private Long id;

private String displayType;

private String otherParams;

public String getDisplayType() {

return displayType;

}

public void setDisplayType(String displayType) {

this.displayType = displayType;

}

public String getOtherParams() {

return otherParams;

}

public void setOtherParams(String otherParams) {//将参数中的\全部换成“”

String string=otherParams.replaceAll("\\\\","");//是4杠,不是2杠

try {

JSONObject jsonObject=new JSONObject(string);

this.otherParams = jsonObject.optString("url");

} catch (JSONException e) {

e.printStackTrace();

}

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

private String title;

public int getUnreadmsg() {

return unreadmsg;

}

public void setUnreadmsg(int unreadmsg) {

this.unreadmsg = unreadmsg;

}

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

public String getMsmType() {

return msmType;

}

public void setMsmType(String msmType) {

this.msmType = msmType;

}

public Long getMsmDate() {

return msmDate;

}

public void setMsmDate(Long msmDate) {

this.msmDate = msmDate;

}

public String getMsmcontent() {

return msmcontent;

}

public void setMsmcontent(String msmcontent) {

this.msmcontent = msmcontent;

}

public boolean getMsmstatus() {

return msmstatus;

}

public void setMsmstatus(boolean msmstatus) {

this.msmstatus = msmstatus;

}

}

    2,在AndroidManifest.xml 中声明。

<!-- 请填写实际的类名,下面仅是示例代码-->

<service android:name="com.umeng.message.example.MyPushIntentService" android:process=":push"/>

    3,在主Activity中调用。

/**推送开启 **/

PushAgent mPushAgent = PushAgent.getInstance(this);

mPushAgent.enable();//开启推送

mPushAgent.setDebugMode(true);

mPushAgent.setPushIntentServiceClass(PushIntentService.class)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 22:34:17

实现友盟推送消息的完全自定义处理的相关文章

AppDelegate减负之常用三方封装 - 友盟推送篇

之前分享过集成友盟推送的方法, 需要的朋友可以查看一下链接: http://www.cnblogs.com/zhouxihi/p/6533058.html 一般开发中我们比较多使用的三方有友盟推送, 友盟分享, 友盟登录, 微信支付, 支付宝支付, 融云等等...等等... 光集成一个友盟推送就要好几十行代码, 如果多集成几个AppDelegate就会变得臃肿不堪, 也降低了可读性 为了解决这个问题, 目前想到以Category的方式给AppDelegate添加新的类别去完成这些三方集成 先以友

友盟推送

一.感受 下面讲下我对推送这个功能在IOS下的感受,这个算是我做了服务端的功能和手机端的功能后的一个体会吧, 这功能在IOS上是多少给我带来了点鸡肋的感觉,首先很多时候收到推送有延时现象,还有如果连续推送两条消息给一个Iphone手机,如果遇到延时这个问题,那么第一条推送就会被覆盖.(这里我用的是友盟的推送,这个推送暂时感觉还不错,大多数推送能及时收到,至少我暂时测试是如此,所以我这里也选择了它,以前遇到过两小时后才到的第三方推送.....甚至根本就收不到.),再一个,即使延迟这个问题解决了,关

使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)

为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守护,所以将进程有关的Service都杀掉了,但旧版本还是有这个功能的啊 !真尼玛,后来猜测估计是因为要适配6.0所以低版本的一些代码就删除了,造成低版本的也不行了,接下来分析一下这个问题. 首先我们把Android分为两类机型,一种是原生态的Android系统,比如Nexus,三星等机型,一种是深度

友盟推送(二)

上一篇友盟推送一,我们获取到了Device_Token,可以在友盟的后台推送消息到指定的手机.下面就介绍添加标签,删除标签 iOS 消息推送 (Message) SDK使用指南 本文档包括: 介绍 基本功能集成指南 高级功能集成指南 测试与调试 技术支持 1. 介绍 友盟消息推送组件帮助您实时的推送消息给用户. 下载的压缩包中将包括以下内容: 文件名称 介绍 UMessage_Sdk_Introductions.html 该文件介绍如何使用友盟消息推送SDK UMessage_Sdk_Relea

友盟推送里面的Alias怎么用?可以理解成账号吗?

友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档写着Alias是和设备绑定的,感觉Alias算不上是严格意义的账号.不知道其它集成过友盟推送的兄弟们是否有类似的需求,是否可以通过友盟推送提供的Alias功能来满足我们的需求? 作者:沙漠链接:http://www.zhihu.com/question/31882775/answer/5425406

Android集成友盟推送功能

友盟是中国最大的移动开发者服务平台,为移动开发者提供免费的应用统计分析.社交分享.消息推送.自动更新.在线参数.移动推广效果分析.微社区等app开发和运营解决方案. 如何快速集成友盟推送功能: 1. 注册友盟账号 友盟开发者账号的注册地址:http://www.umeng.com/users/sign_up 2. 创建推送应用 首先进入友盟消息推送的应用中心,创建一个应用,链接地址为:http://message.umeng.com/appList. 应用创建完成后,点击应用名称进入应用详情页面

iOS app 集成友盟推送问题

之前做app推送主要是集成友盟SDK,在程序获取deviceToken时,老是提示如下错误: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x14dc69e0 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串} 打印获取deviceToken错误代码 - (void)application:(UIAp

iOS集成友盟推送

之前有写过利用Python自己写一个推送服务器, 今天说下如果集成友盟的推送服务 在这之前我们需要做一些准备动作 #1. 注册一个App ID #2. Enable Push NotificationSerivice, 并创建和下载开发/发布推送证书 #3. 安装推送证书, 然后把推送证书到处为p12文件 #4. 注意友盟账号 #5. 创建一个推送应用, 并上传推送证书的p12文件和填写密码 #6. 下载SDK, 添加到项目中 在AppDelegatez #import "UMessage.h&

《友盟推送调到指定界面》

给大家讲一点常识,友盟推送分生产环境和开发环境.用手机刷上去的就是开发环境, 发布到苹果商店就是生产环境,没发布前怎么模拟呢, 用普通账号打的ad hoc 包, 用企业账号打的ad hoc 包或者enterprise包都可以测试生产环境. 开发环境下, 你把APP删掉,重新调试上来,就会生成一个新的device_token了! 收到通知的时候APP的状态可能是未启动.前台活跃(任何界面).后台等三种. 未启动时,点击通知栏启动App, 会在didFinishLaunchingWithOption