这是一份详细集成友盟推送SDK的心酸历程,也集成了华为、小米、OPPO、vivo厂商通道,处理了app进程关闭、app在后台、app前台通知点击的处理

1  根据友盟自动集成文档,集成友盟SDK    友盟地址 点击这里

2 集成后查看友盟demo,进行预初始化那些,打印友盟token等

3 使用友盟的推送工具测试集成是否OK

以上这三步最简单,就不多说了。

重点来了:

1 友盟的自定义点击通知时的打开动作 UmengNotificationClickHandler

UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {@Overridepublic void dealWithCustomAction(Context context, UMessage msg) {super.dealWithCustomAction(context, msg);Log.i(TAG, "dealWithCustomAction: " + msg.getRaw().toString());}@Overridepublic void openActivity(Context context, UMessage msg) {super.openActivity(context, msg);Log.i(TAG, "click openActivity: " + msg.getRaw().toString());}@Overridepublic void launchApp(Context context, UMessage msg) {super.launchApp(context, msg);Log.i(TAG, "click launchApp: " + msg.getRaw().toString());}@Overridepublic void dismissNotification(Context context, UMessage msg) {super.dismissNotification(context, msg);Log.i(TAG, "click dismissNotification: " + msg.getRaw().toString());}
};
pushAgent.setNotificationClickHandler(notificationClickHandler);

这个自定义只有在app位于前台的时候有作用,很多机型在app home回桌面后就没有反应了,所以用这个不好。如果你要用这个,那么在通知类型为自定义的时候(大多时候通知都为自定义,然后根据参数进行跳转),那么dealWithCustomAction()这个方法中,你的自定义处理需要写在super方法之前,不然没反应。

下面我将正确的处理方法:

1 集成厂商通道,集成的方法根据友盟的文档就可以了,比各大厂商自己的文档简单多了,集成后不要看友盟文档里面说的日志,自己调方法打印regId就可以了,有了regId 然后用各大厂商的推送测试工具,测试app关闭的情况下,能否收到通知。这个各大厂商里面都有的,小米、OPPO等有申请一下通道ID,不然小米会给你整一个不重要通知里面,看不懂通知了。这里再讲一个大坑,vivo的厂商推送,一天一个设备只有5个机会,5次完了后就收不到了,然后推送的标题和消息里面不能加 测试 test这样的文字,不然一样收不到

2 根据友盟给的文档,创建一个用于接受厂商通道消息的activity

public class MfrMessageActivity extends UmengNotifyClickActivity {private static final String TAG = "MfrMessageActivity";@Overrideprotected void onCreate(Bundle bundle) {super.onCreate(bundle);setContentView(R.layout.activity_push);}@Overridepublic void onMessage(Intent intent) {super.onMessage(intent);Bundle bundle = intent.getExtras();if (bundle != null) {Log.d(TAG, "bundle: " + bundle);}String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);Log.d(TAG, "body: " + body);if (!TextUtils.isEmpty(body)) {runOnUiThread(() -> ((TextView) findViewById(R.id.tv)).setText(body));}}
}

所有的厂商通道推送的离线消息,都在这里处理,点击消息的时候,会调用这里的onMessage方法,拿到里面的body信息,然后再打开app传递进去就可以了,这个可以设置这个Activity和splash一样的主题,不然打开app初始化的时候是白屏的。

OK 以上就是app离线时消息的处理

下面再说app位于后台时候的处理,上面我们讲到了不行的例子,打开友盟Demo,里面有这样的设置

pushAgent.setPushIntentServiceClass(MyCustomMessageService.class);

找到这个MyCustomMessageService,直接复制,记住SDK要最新版本,不然会报错的

public class MyCustomMessageService extends UmengMessageService {private static final String TAG = "MyCustomMessageService";private Context context;@Overridepublic void onMessage(Context context, Intent intent) {this.context = context;Log.i(TAG, "onMessage");try {String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);UMessage message = new UMessage(new JSONObject(body));if (UMessage.DISPLAY_TYPE_NOTIFICATION.equals(message.display_type)) {//处理通知消息handleNotificationMessage(message);} else if (UMessage.DISPLAY_TYPE_CUSTOM.equals(message.display_type)) {//TODO: 处理自定义消息handleCustomMessage(message);}} catch (Exception e) {e.printStackTrace();}}private void handleCustomMessage(UMessage message) {}private void handleNotificationMessage(UMessage msg) {Notification.Builder builder;NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {String channelId = UPushNotificationChannel.PRIMARY_CHANNEL;String channelName = PushAgent.getInstance(this).getNotificationChannelName();NotificationChannel channel = manager.getNotificationChannel(channelId);if (channel == null) {channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);manager.createNotificationChannel(channel);}builder = new Notification.Builder(this, UPushNotificationChannel.PRIMARY_CHANNEL);} else {builder = new Notification.Builder(this);}builder.setContentTitle(msg.title).setContentText(msg.text).setTicker(msg.ticker).setWhen(System.currentTimeMillis()).setSmallIcon(R.drawable.umeng_push_notification_default_small_icon).setAutoCancel(true);Notification notification = builder.getNotification();PendingIntent clickIntent = getClickPendingIntent(this, msg);notification.deleteIntent = getDismissPendingIntent(this, msg);notification.contentIntent = clickIntent;manager.notify((int) SystemClock.elapsedRealtime(), notification);UTrack.getInstance().trackMsgShow(msg, notification);}public PendingIntent getClickPendingIntent(Context context, UMessage msg) {Intent intent = new Intent(context, MyCustomNotificationClickActivity.class);intent.setPackage(context.getPackageName());intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra(MyCustomNotificationClickActivity.EXTRA_BODY, msg.getRaw().toString());int flags = PendingIntent.FLAG_CANCEL_CURRENT;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {flags |= PendingIntent.FLAG_IMMUTABLE;}return PendingIntent.getActivity(context, (int) (System.currentTimeMillis()), intent, flags);}public PendingIntent getDismissPendingIntent(Context context, UMessage msg) {return new UmengMessageHandler().getDismissPendingIntent(context, msg);}}
getClickPendingIntent方法里面有个 MyCustomNotificationClickActivity

这个activity在app位于后台时候消息点击,也能接受到点击事件

public class MyCustomNotificationClickActivity extends Activity {public static final String EXTRA_BODY = "body";private static final String TAG = "MyCustomMessageService";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = getIntent();if (intent != null) {String body = intent.getStringExtra(EXTRA_BODY);
//            LogCook.i(XiYaYaApplicationLike.TAG,"测试日志i MyCustomNotificationClickActivity" + body);
//            LogCook.i(XiYaYaApplicationLike.TAG,"测试日志i XiYaYaApplicationLike.haveActivity" + XiYaYaApplicationLike.haveActivity);if (body != null) {try {UMessage message = new UMessage(new JSONObject(body));UTrack.getInstance().trackMsgClick(message);//TODO: 处理通知消息if (XiYaYaApplicationLike.haveActivity > 1){MessageBean messageBean = new Gson().fromJson(body, MessageBean.class);if ("go_custom".equals(messageBean.getBody().getAfter_open())){// 自定义行为PushMessageClick.customMessageClick(MainActivity.gson,messageBean.getBody().getCustom(),this);}else if ("go_activity".equals(messageBean.getBody().getAfter_open())){// 打开指定AcPushMessageClick.openAcMessageClick(MainActivity.gson,messageBean.getBody().getActivity(),messageBean.getExtra(),this);}
//                        new UmengNotificationClickHandler().handleMessage(this, message);}else {Intent intent1 = new Intent(this, SplashActivity.class);intent1.putExtra("messagebody",body);intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent1);}} catch (Exception e) {e.printStackTrace();}}}finish();}}

这个地方,就能处理app活着时候的所有消息点击的处理,这样app活着有这个Ac,app关闭了有厂商通道的Ac,所有的消息点击都能处理了。

注:离线消息一般要几分钟才能收到,

然后app要设置关闭推送的按钮,不然应用市场不给过。这些友盟文档都有的。

Android 友盟推送SDK集成---一路艰辛相关推荐

  1. Android开发——集成友盟推送SDK遇到的坑(一)

    前言 Android开发的小伙伴们一定会集成第三方SDK,这里记录一下我在遇到的集成友盟推送SDK遇到的坑. Project with path ':push' could not be found ...

  2. 友盟小米收不到推送消息_友盟推送SDK集成测试、常见问题以及注意事项总结

    最近为了解决公司APP在一些手机出现的推送问题重新集成了最新版的友盟推送SDK,花费了几天时间终于把集成和测试工作完成,最终在华为,Nexus,三星,小米,HTC,魅族等10多部手机上测试并达到了预想 ...

  3. java服务器端集成友盟,Android友盟推送集成

    第一次认真集成推送,碰到了一些问题,记录一下. 首先讲一下实现原理,我们用的是友盟.Android比iOS要麻烦很多. 友盟集成是需要后端配合的,具体就是后端调用友盟的接口,向友盟推送一条消息,然后友 ...

  4. php upush 友盟 推送_react-native集成友盟推送

    react-native-upush 近期由于产品需求,需要在react-native项目上集成友盟推送,笔者翻阅各种这方面资料后,看到RN论坛上面有位大神给出了具体的集成方案,请参考:react-n ...

  5. android 友盟推送获取不到devicetoken,使用友盟消息推送中遇到的哪些问题--索引(开发者必读)...

    友盟推送服务器容量如何?每天耗电.耗流量多少?开发者自己的推送如何与友盟推送系统进行通讯?用户如何关闭推送服务?集成中有哪些坑?等等等等,汇总贴,供参考. 先来介绍下友盟推送有啥功能吧. 第一,支持多 ...

  6. android 友盟服务端推送给客户端,Android 友盟推送 厂商通道 接入Notes

    image 前言 本文章也是就在接入过程中遇到的一些小问题做个记录,希望对遇到问题的开发者有些许帮助. 接入的SDK 版本为:Push SDK 6.1.0 官方文档 目前,友盟推送仅支持以下五家厂商的 ...

  7. Android 友盟推送收不到

    最近接触友盟推送遇到一个问题很是头疼: 友盟推送集成好了之后在在友盟后台推送测试消息的时候能够进入 dealWithCustomAction处理推送来的消息,但是在我们后台推送来的消息总是进不去,一直 ...

  8. Android 友盟推送开发

    推送厂商集成文档:https://developer.umeng.com/docs/67966/detail/98589?spm=a311a.9588098.0.0#h1-vivo-push-5 SD ...

  9. Android集成友盟推送最详细介绍

    前言 如今大部分应用都会涉及到推送,正好最近的项目推送是我在搞,今天就分享一下我的使用过程. 集成方式 关于友盟推送的集成方式,文档已经介绍的很详细了,我就不在此多做解释. 友盟推送完整集成过程 完全 ...

最新文章

  1. Tomcat Servlet学习
  2. 浅谈osi模型 三次握手 四次挥手 ddos攻击原理
  3. ccf画图java详细解析_ccfjava答案
  4. oracle 安装ora 27102,ORA-27102 解决办法
  5. Windows10电脑系统时间校准
  6. Android App优化之ANR详解
  7. HTML静态网页作业-篮球网页
  8. JS 字符串常用函数
  9. Visual paradigm Db Archtecture Database config
  10. 强悍的 Linux —— 文件解压与解压
  11. Cisco路由器配置静态路由
  12. csapp--键盘驱动程序的分析与修改
  13. 常用的红色的RGB值
  14. springboot+vue医院预约挂号系统java
  15. 做人晶莹剔透,做事水滴石穿
  16. Win10怎么设置有线网络和WiFi网络优先级?
  17. 快讯丨 “工业大智 戴卡制造” 清华AI大数据走进中信戴卡
  18. Flex Ethernet (FlexE) 初识
  19. 阿里新零售事业部电面
  20. CentOS7 Elasticsearc 安装 与部署

热门文章

  1. 大数据用户画像系统架构设计
  2. CSS color中常用英文色值
  3. [L1 - 10分合集]奇偶分家
  4. 基于Java实现的设备模拟器
  5. python实现列队
  6. 提高工作效率的宝藏网站和宝藏工具
  7. 路飞学城python全栈开发_python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)...
  8. 一篇文章了解 Java IO 流
  9. 【Python爬虫】 验证码图像识别 --- 第三弹 (极验验证码识别)
  10. 1.10 API 和字符串