android信鸽推送demo 信鸽怎样关闭通知

1017人阅读
信鸽使用(1)
使用信鸽的过程,感觉一路艰辛,各种坑,想必各位使用过的也是深有体会的吧。而且官方文档也太简洁了。demo功能也不全,没办法只能自己摸索着来,这不刚把自定义通知弄明白,就给各位看官献上来了。
1. XGPushManager功能类
自定义本地通知样式
void setPushNotificationBuilder(Context context, int notificationBulderId, XGPushNotificationBuilder notificationBuilder)
本地通知,调用下面这个方法,就可以起来一个推送通知
long addLocalNotification(Context context, XGLocalMessage msg)
2 如何自定义通知
这里主要就是需要构造一个XGPushNotificationBuilder
XGCustomPushNotificationBuilder build = new XGCustomPushNotificationBuilder();
build.setSound(
RingtoneManager.getActualDefaultRingtoneUri(
context, RingtoneManager.TYPE_ALARM)) // 设置声音
// setSound(
// Uri.parse("android.resource://" + getPackageName()
// + "/" + R.raw.wind)) 设定Raw下指定声音文件
.setDefaults(Notification.DEFAULT_VIBRATE) // 振动
.setFlags(Notification.FLAG_NO_CLEAR); // 是否可清除
// 设置自定义通知layout,通知背景等可以在layout里设置
build.setLayoutId(R.layout.layout_notification);
// 设置自定义通知内容id
build.setLayoutTextId(R.id.ssid);
// 设置自定义通知标题id
build.setLayoutTitleId(R.id.title);
// 设置自定义通知图片id
build.setLayoutIconId(R.id.icon);
// 设置自定义通知图片资源
build.setLayoutIconDrawableId(R.drawable.ic_launcher);
// 设置状态栏的通知小图标
build.setIcon(R.drawable.ic_launcher);
// 设置时间id
build.setLayoutTimeId(R.id.time);
// 若不设定以上自定义layout,又想简单指定通知栏图片资源
build.setNotificationLargeIcon(R.drawable.tenda_icon);
3如何使用我们自定义的通知
这个是替换默认的通知,build是上面的那段代码的,这样通知就是使用我们自定义的形式了。
XGPushManager.setDefaultNotificationBuilder(context, build);
4 启动本地通知
XGLocalMessage
localMessage = new XGLocalMessage();
XGPushManager.addLocalNotification(context, localMessage);
5如何根据推送信息的不同,来显示不同的推送通知式样
最初我总是入不了这个门,原因是没有理解到推送消息和推送通知的区别,如果我们要想使用自定义通知来显示,我们就需要使用推送消息,信鸽就只是将推送的内容传递过来,它说这是透传,然后用户根据这些消息,自己做自己想做的事情。
XGPushBaseReceiver类提供透传消息的接收和操作结果的反馈,需要开发者继承本类,并重载相关的方法;
void onTextMessage(Context context,XGPushTextMessage message)该方法就是接收透传消息的方法。这样我们需要写一个receiver来继承XGPushBaseReceiver,直接上代码了
public class MessageReceiver extends XGPushBaseReceiver {
private Intent intent = new
Intent("com.qq.xgdemo.activity.UPDATE_LISTVIEW");
public static final String LogTag = "TPushReceiver";
private void show(Context context, String text) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
// 通知展示
public void onNotifactionShowedResult(Context context,
XGPushShowedResult notifiShowedRlt) {
if (context == null || notifiShowedRlt == null) {
show(context, "您有1条新消息, " + "通知被展示 , " + notifiShowedRlt.toString());
public void onUnregisterResult(Context context, int errorCode) {
if (context == null) {
String text = "";
if (errorCode == XGPushBaseReceiver.SUCCESS) {
text = "反注册成功";
text = "反注册失败" + errorC
Log.d(LogTag, text);
show(context, text);
public void onSetTagResult(Context context, int errorCode, String tagName) {
if (context == null) {
String text = "";
if (errorCode == XGPushBaseReceiver.SUCCESS) {
text = "\"" + tagName + "\"设置成功";
text = "\"" + tagName + "\"设置失败,错误码:" + errorC
Log.d(LogTag, text);
show(context, text);
public void onDeleteTagResult(Context context, int errorCode, String tagName) {
if (context == null) {
String text = "";
if (errorCode == XGPushBaseReceiver.SUCCESS) {
text = "\"" + tagName + "\"删除成功";
text = "\"" + tagName + "\"删除失败,错误码:" + errorC
Log.d(LogTag, text);
show(context, text);
// 通知点击回调 actionType=1为该消息被清除,actionType=0为该消息被点击
public void onNotifactionClickedResult(Context context,
XGPushClickedResult message) {
if (context == null || message == null) {
String text = "";
sendIconCountMessage(context);
samsungShortCut(context, "25");
if (message.getActionType() == XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) {
// 通知在通知栏被点击啦。。。。。
// APP自己处理点击的相关动作
// 这个动作可以在activity的onResume也能监听,请看第3点相关内容
text = "通知被打开 :" +
} else if (message.getActionType() == XGPushClickedResult.NOTIFACTION_DELETED_TYPE) {
// 通知被清除啦。。。。
// APP自己处理通知被清除后的相关动作
text = "通知被清除 :" +
Toast.makeText(context, "广播接收到通知被点击:" + message.toString(),
Toast.LENGTH_SHORT).show();
// 获取自定义key-value
String customContent = message.getCustomContent();
if (customContent != null && customContent.length() != 0) {
JSONObject obj = new JSONObject(customContent);
// key1为前台配置的key
if (!obj.isNull("ID")) {
String value = obj.getString("ID");
Log.d(LogTag, "get custom value:" + value);
} catch (JSONException e) {
e.printStackTrace();
// APP自主处理的过程。。。
Log.d(LogTag, text);
show(context, text);
public void onRegisterResult(Context context, int errorCode,
XGPushRegisterResult message) {
// TODO Auto-generated method stub
if (context == null || message == null) {
String text = "";
if (errorCode == XGPushBaseReceiver.SUCCESS) {
text = message + "注册成功";
// 在这里拿token
String token = message.getToken();
text = message + "注册失败,错误码:" + errorC
Log.d(LogTag, text);
show(context, text);
// 消息透传
public void onTextMessage(Context context, XGPushTextMessage message) {
// TODO Auto-generated method stub
show(context, "haha");
String text = "收到消息:" + message.toString();
// 获取自定义key-value
String customContent = message.getCustomContent();
if (customContent != null && customContent.length() != 0) {
JSONObject obj = new JSONObject(customContent);
// key1为前台配置的key
if (!obj.isNull("key")) {
String value = obj.getString("key");
Log.d(LogTag, "get custom value:" + value);
} catch (JSONException e) {
e.printStackTrace();
// APP自主处理消息的过程...
XGLocalMessage
localMessage = new XGLocalMessage();
localMessage.setTitle("haha");
localMessage.setContent(message.getContent());
XGCustomPushNotificationBuilder build = new XGCustomPushNotificationBuilder();
build.setSound(
RingtoneManager.getActualDefaultRingtoneUri(
context, RingtoneManager.TYPE_ALARM)) // 设置声音
// setSound(
// Uri.parse("android.resource://" + getPackageName()
// + "/" + R.raw.wind)) 设定Raw下指定声音文件
.setDefaults(Notification.DEFAULT_VIBRATE) // 振动
.setFlags(Notification.FLAG_NO_CLEAR); // 是否可清除
// 设置自定义通知layout,通知背景等可以在layout里设置
build.setLayoutId(R.layout.layout_notification);
// 设置自定义通知内容id
build.setLayoutTextId(R.id.ssid);
// 设置自定义通知标题id
build.setLayoutTitleId(R.id.title);
// 设置自定义通知图片id
build.setLayoutIconId(R.id.icon);
// 设置自定义通知图片资源
build.setLayoutIconDrawableId(R.drawable.ic_launcher);
// 设置状态栏的通知小图标
build.setIcon(R.drawable.ic_launcher);
// 设置时间id
build.setLayoutTimeId(R.id.time);
// 若不设定以上自定义layout,又想简单指定通知栏图片资源
build.setNotificationLargeIcon(R.drawable.tenda_icon);
// 客户端保存build_id
XGPushManager.setDefaultNotificationBuilder(context, build);
XGPushManager.addLocalNotification(context, localMessage);
Log.d(LogTag, text);
show(context, text);
private void sendIconCountMessage(Context context)
Intent it = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
it.putExtra("android.intent.extra.update_application_component_name", "com.example.wujie.xungetest/.MainActivity");
String iconCount = "50";
it.putExtra("android.intent.extra.update_application_message_text", iconCount);
context.sendBroadcast(it);
这样就可以完美自定义了,觉得有用,就请顶一下,谢谢
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5747次
排名:千里之外
原创:20篇
评论:18条
(1)(6)(2)(2)(4)(6)(1)1715人阅读
工作记载(13)
由于信鸽接入文档比较详细,这里我不对如何接入进行阐述,想知道具体如何接入可以参考信鸽帮助手册:,这里我只对如何控制收到推送通知点击后打开新面板回退时依然可以返回到用户指定的上一级面板,这里也是工作中碰到的一些问题进行存档。
1、如果主应用已经被杀死并且不存在任何Activity后就无法跳到用户指定面板;
2、只有在主应用未被杀死的情况下可以跳到用户上次依然打开的面板;
3、如果主应用被杀死后点击通知栏依然可以重新启动主应用效果;
4、从信鸽的Service外部进程打开Activity必须指定FLAG_ACTIVITY_NEW_TASK标记;
5、我这里的主Activity主要做一些版本升级,门户校验之内就会进行关闭,不会有核心业务的处理。
3.代码片段
3.1.收到通知并点击的事件处理
public void onNotifactionClickedResult(Context context, XGPushClickedResult message) {
if (message.getCustomContent() == null) {
Map&String, Object& map = BaseModel.parse(message.getCustomContent(), Map.class);
map = (Map&String, Object&) map.get("params");
String pushType = map.get("pushType").toString();
if (StringUtils.equalsIgnoreCase(pushType, "ORDER_DETAIL")) {
Double id = (Double)map.get("orderId");
Intent intent = new Intent(context, BookingOrderDetailActivity.class);
intent.putExtra("data", id.intValue());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
3.2.主入口Laucher被创建处理
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XGPushClickedResult click = XGPushManager.onActivityStarted(this);
if (click != null) {
if (isTaskRoot()) {
如果有疑问可以给我反馈,我会尽快回复大家,谢谢!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8604次
排名:千里之外
原创:14篇
评论:16条
(1)(1)(1)(1)(3)(7)android 使用信鸽推送通知栏不显示推送的通知? - 推酷
android 使用信鸽推送通知栏不显示推送的通知?
跟往常一样使用信鸽推送,不过这次却怎么也没反应。经过查看log发现确实是收到了推送过来的消息了,其中有这么一行:
W/dalvikvm(23255): VFY: unable to resolve virtual method 1345: Landroid/support/v4/app/NotificationCompat$B.build ()Landroid/app/N
貌似c调用android的构造通知的那些函数调用不到,导致通知不能正常显示。看来问题出在&android-support-v4.jar 这个文件上面。
与以前项目不同的是这个项目引用了SlidingMenu,SlidingMenu又用到了Actionbarsherlock。在copy信鸽sdk中的libs文件夹中的文件的时候因为android-support-v4.jar与项目中SlidingMenu 的&android-support-v4.jar冲突了导致jar mismatch。我就把信鸽的libs中的的那个删掉了。所以试着把SlidingMenu的那个android-support-v4.jar 替换为最新的,一试果然是这个问题。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致微笑的江豚
一、快速上手
第一步:引入SDK
下载android-SDK,解压,引入AS,这里要注意的是,先切换到project项目结构下,把jar文件引入到libs(该文件夹无需新建,与src同级)文件夹下。这里有个坑,信鸽的SDK中带有一个support-v4包,如果原项目中用到v4包了,这里就不要再引入了,否则会发生冲突!
然后在src/main下新建一个文件夹,名叫『jniLibs』(必须叫这个名字,其他名字无效),把所有的.so文件连同.so文件所在的文件夹一起粘贴到jniLibs文件夹下。
第二部:修改manifests文件
&application
&!-- APP项目的其它配置... --&
&!-- 【必须】 信鸽receiver广播接收 --&
android:name="com.tencent.android.tpush.XGPushReceiver"
android:process=":xg_service_v2" &
&intent-filter android:priority="0x7fffffff" &
&!-- 【必须】 信鸽SDK的内部广播 --&
&action android:name="com.tencent.android.tpush.action.SDK" /&
&action android:name="com.tencent.android.tpush.action.INTERNAL_PUSH_MESSAGE" /&
&!-- 【必须】 系统广播:开屏和网络切换 --&
&action android:name="android.intent.action.USER_PRESENT" /&
&action android:name="android.net.conn.CONNECTIVITY_CHANGE" /&
&!-- 【可选】 一些常用的系统广播,增强信鸽service的复活机会,请根据需要选择。当然,你也可以添加APP自定义的一些广播让启动service --&
&action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /&
&action android:name="android.intent.action.ACTION_POWER_CONNECTED" /&
&action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /&
&/intent-filter&
&/receiver&
&!-- 【必须】 (2.30及以上版新增)展示通知的activity --&
&!-- 【注意】 如果被打开的activity是启动模式为SingleTop,SingleTask或SingleInstance,请根据通知的异常自查列表第8点处理--&
android:name="com.tencent.android.tpush.XGPushActivity"
android:exported="false" &
&intent-filter&
&!-- 若使用AndroidStudio,请设置android:name="android.intent.action"--&
&action android:name="" /&
&/intent-filter&
&/activity&
&!-- 【必须】 信鸽service --&
android:name="com.tencent.android.tpush.service.XGPushService"
android:exported="true"
android:persistent="true"
android:process=":xg_service_v2" /&
&!-- 【必须】 通知service,此选项有助于提高抵达率 --&
android:name="com.tencent.android.tpush.rpc.XGRemoteService"
android:exported="true" &
&intent-filter&
&action android:name="应用包名.PUSH_ACTION" /&
&/intent-filter&
&/service&
&!-- 【必须】 请将YOUR_ACCESS_ID修改为APP的AccessId,“21”开头的10位数字,中间没空格 --&
&meta-data
android:name="XG_V2_ACCESS_ID"
android:value="YOUR_ACCESS_ID" /&
&!-- 【必须】 请将YOUR_ACCESS_KEY修改为APP的AccessKey,“A”开头的12位字符串,中间没空格 --&
&meta-data
android:name="XG_V2_ACCESS_KEY"
android:value="YOUR_ACCESS_KEY" /&
&/application&
&!-- 【必须】 信鸽SDK所需权限 --&
&uses-permission android:name="android.permission.INTERNET" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&
&uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /&
&uses-permission android:name="android.permission.RESTART_PACKAGES" /&
&uses-permission android:name="android.permission.BROADCAST_STICKY" /&
&uses-permission android:name="android.permission.WRITE_SETTINGS" /&
&uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&
&uses-permission android:name="android.permission.WAKE_LOCK" /&
&uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /&
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="android.permission.READ_LOGS" /&
&uses-permission android:name="android.permission.VIBRATE" /&
&!-- 【可选】 信鸽SDK所需权限 --&
&uses-permission android:name="android.permission.BLUETOOTH" /&
&uses-permission android:name="android.permission.BATTERY_STATS" /&
这里要注意把accessID和accessKey替换成自己的!
&!-- 【必须】 请将YOUR_ACCESS_ID修改为APP的AccessId,“21”开头的10位数字,中间没空格 --&
&&&&&meta-data
&&&&&&&&android:name="XG_V2_ACCESS_ID"
&&&&&&&&android:value="YOUR_ACCESS_ID" /&
&&&&&!-- 【必须】 请将YOUR_ACCESS_KEY修改为APP的AccessKey,“A”开头的12位字符串,中间没空格 --&
&&&&&meta-data
&&&&&&&&android:name="XG_V2_ACCESS_KEY"
&&&&&&&&android:value="YOUR_ACCESS_KEY" /&
还要改一下这里:
&!-- 【必须】 通知service,此选项有助于提高抵达率 --&
&&&&&service
&&&&&&&&android:name="com.tencent.android.tpush.rpc.XGRemoteService"
&&&&&&&&android:exported="true" &
&&&&&&&&&intent-filter&
&&&&&&&&&&&&&action android:name="应用包名.PUSH_ACTION" /&
&&&&&&&&&/intent-filter&
&&&&&/service&
&!-- 【必须】 (2.30及以上版新增)展示通知的activity --&
&&&&&!-- 【注意】 如果被打开的activity是启动模式为SingleTop,SingleTask或SingleInstance,请根据通知的异常自查列表第8点处理--&
&&&&&&activity
&&&&&&&&&android:name="com.tencent.android.tpush.XGPushActivity"
&&&&&&&&&android:exported="false" &
&&&&&&&&&&intent-filter&
&&&&&&&&&&&&&!-- 若使用AndroidStudio,请设置android:name="android.intent.action"--&
&&&&&&&&&&&&&&action android:name="" /&
&&&&&&&&&&/intent-filter&
&&&&&/activity&
第三部:注册App
完成工程配置后,打开工程的主Activity,在其onCreate(Bundle savedInstanceState)重载方法内,添加以下代码,完成信鸽服务的启动与APP注册过程。
// 开启logcat输出,方便debug,发布时请关闭
// XGPushConfig.enableDebug(this, true);
// 如果需要知道注册是否成功,请使用registerPush(getApplicationContext(), XGIOperateCallback)带callback版本
// 如果需要绑定账号,请使用registerPush(getApplicationContext(),account)版本
// 具体可参考详细的开发指南
// 传递的参数为ApplicationContext
Context context = getApplicationContext();
XGPushManager.registerPush(context);
// 2.36(不包括)之前的版本需要调用以下2行代码
Intent service = new Intent(context, XGPushService.class);
context.startService(service);
// 其它常用的API:
// 绑定账号(别名)注册:registerPush(context,account)或registerPush(context,account, XGIOperateCallback),其中account为APP账号,可以为任意字符串(qq、openid或任意第三方),业务方一定要注意终端与后台保持一致。
// 取消绑定账号(别名):registerPush(context,"*"),即account="*"为取消绑定,解绑后,该针对该账号的推送将失效
// 反注册(不再接收消息):unregisterPush(context)
// 设置标签:setTag(context, tagName)
// 删除标签:deleteTag(context, tagName)
代码嵌入完成后,启动APP,如果在logcat中的TPush标签看到以下类似的输出,说明已经注册成功,并返回token。
Android Token长度为40位
iOS Token长度为64位
在这里,可以在logcat中直接搜索『Token』字段查找出来,如果能找到,就代表android端已成功配置信鸽!
接下来启动app,在信鸽的管理后台发个推送试一试吧~
目前测试结果:分别在红米1S和tcl两部手机上测试,只要App处于运行中,后后台运行,就可接受到推送。但是一旦用活动管理器强制终止App的活动线程,就不能接收到推送了。官方的解释是:
service被终止后,由系统、安全软件和用户操作限定是否能够再次启动。
信鸽SDK通过唯一的service与信鸽后台保持通讯,在android中,service被杀死后在没有被系统/安全软件禁止的条件下是能够自启动的,具体可自行网上搜索“android service onstartcommand START_STICKY”
目前,在某些定制的系统(如MIUI)或被安全软件禁止自启动后,只有用户再次打开APP才能重启信鸽service
信鸽service何时能够启动由系统调度确定
在锁屏触屏、网络切换、安装APP、系统重启等条件,信鸽会主动尝试启动service。
二、分类推送
如何区分目标人群,做分类推送?To be continue ...
阅读排行榜10:23 提问
腾讯信鸽Android推送时收不到消息,哪位大哥帮我解决下
腾讯信鸽Android推送时收不到消息,哪位大哥帮我解决下,又没有 做过的大哥啊,急求啊
按赞数排序
你这个问题没法回答,可能性太多,你先对着官方文档,一步步,看看自己设置对不对,你可用demo程序,看看是否运行正常,还有你用的什么手机,现在小米手机较新的系统,需要你把自己的app添加到白名单才能收到推送
这个确实可能性很多,有可能是你没有完全按照api文档集成,丢了什么步骤,有可能是你的信鸽sdk jar的版本不是最新的,有bug,也有能是手机的问题,我之前也遇到过三星s6注册信鸽推送没有注册成功,就收不到推送的情况,后来过了一段时间自己就好了。
显示推送成功,可是手机根本收不到啊
显示推送成功,可是手机根本收不到啊
是不是你的手机没联网呀?
我也显示推送成功,但是需要把手机上对应的apk运行起来才能有notification,不会唤醒手机收通知。
其他相似问题

我要回帖

更多关于 android 关闭通知声音 的文章

 

随机推荐