做手机控车项目,需求是车在遭受非法侵入的时候要及时报警,之前是用短信的方式,一开始量少还可以,随着用户越来越多,短信的开销越来越大,决定做成推送方式,这就要求客户一定能够收到推送,无论后台进程是否被杀死.

首先登陆阿里云官方平台,创建应用 阿里云创建应用

然后就是下载各种包配置应用,有maven库快速集成方式,但我不知道为什么下载不下来,所以还是选择了手动配置,以下是用到的包

配置appkey和appsecret(创建应用时候生成的)

    <application android:name="*****"><meta-data android:name="com.alibaba.app.appkey" android:value="*****"/> <!-- 请填写你自己的- appKey --><meta-data android:name="com.alibaba.app.appsecret" android:value="****"/> <!-- 请填写你自己的appSecret --></application>

清单文件里增加权限和注册service和receiver

手动创建消息接收Receiver,继承自com.alibaba.sdk.android.push.MessageReceiver,并在对应回调中添加业务处理逻辑

    public class MyMessageReceiver extends MessageReceiver {// 消息接收部分的LOG_TAGpublic static final String REC_TAG = "receiver";@Overridepublic void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {// TODO 处理推送通知Log.e("MyMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);}@Overridepublic void onMessage(Context context, CPushMessage cPushMessage) {Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());}@Overridepublic void onNotificationOpened(Context context, String title, String summary, String extraMap) {Log.e("MyMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);}@Overrideprotected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {Log.e("MyMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);}@Overrideprotected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {Log.e("MyMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);}@Overrideprotected void onNotificationRemoved(Context context, String messageId) {Log.e("MyMessageReceiver", "onNotificationRemoved");}}

并在清单文件中配置该receiver

    <!-- 消息接收监听器 (用户可自主扩展) --><receiverandroid:name=".MyMessageReceiver"android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 --><intent-filter><action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /></intent-filter><intent-filter><action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /></intent-filter><intent-filter><action android:name="com.alibaba.sdk.android.push.RECEIVE" /></intent-filter></receiver>

然后官方文档里有这样一句提示

如果是从V2.3.7及以下版本升级到V3.0.0及以上版本的用户,需将<action android:name="org.agoo.android.intent.action.RECEIVE" />改为<action android:name="com.alibaba.sdk.android.push.RECEIVE" />,否则会接收不到推送。

虽然我不是这样的用户,但还是做了修改

然后再application里初始化推送通道(此处考虑了8.0以上限制推送的情况:即定义了一个通知渠道的id)

/*** 初始化云推送通道* @param applicationContext*/private void initCloudChannel(Context applicationContext) {if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);// 通知渠道的idString id = "1";// 用户可以看到的通知渠道的名字.CharSequence name = "notification channel";// 用户可以看到的通知渠道的描述String description = "notification description";int importance = NotificationManager.IMPORTANCE_HIGH;NotificationChannel mChannel = new NotificationChannel(id, name, importance);//            // 设置渠道描述
//            mChannel.setDescription("测试通知组");
//            // 是否绕过请勿打扰模式mChannel.canBypassDnd();
//            // 设置绕过请勿打扰模式mChannel.setBypassDnd(true);
//            // 桌面Launcher的消息角标mChannel.canShowBadge();
//            // 设置显示桌面Launcher的消息角标mChannel.setShowBadge(true);
//            // 设置通知出现时声音,默认通知是有声音的
//            mChannel.setSound(null, null);
//            // 设置通知出现时的闪灯(如果 android 设备支持的话)
//            mChannel.enableLights(true);
//            mChannel.setLightColor(Color.RED);
//            // 设置通知出现时的震动(如果 android 设备支持的话)
//            mChannel.enableVibration(true);// 配置通知渠道的属性mChannel.setDescription(description);// 设置通知出现时的闪灯(如果 android 设备支持的话)mChannel.enableLights(true);mChannel.setLightColor(Color.RED);// 设置通知出现时的震动(如果 android 设备支持的话)mChannel.enableVibration(true);mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});//最后在notificationmanager中创建该通知渠道if (mNotificationManager != null) {mNotificationManager.createNotificationChannel(mChannel);}}//        AdvancedCustomPushNotification notification = new AdvancedCustomPushNotification(R.layout.notitfication_layout, R.id.m_icon, R.id.m_title, R.id.m_text);
//        notification.setServerOptionFirst(true);
//        notification.setBuildWhenAppInForeground(true);
//        notification.setRemindType(BasicCustomPushNotification.REMIND_TYPE_VIBRATE_AND_SOUND);
//        boolean res = CustomNotificationBuilder.getInstance().setCustomNotification(2, notification);PushServiceFactory.init(applicationContext);pushService = PushServiceFactory.getCloudPushService();pushService.register(applicationContext, new CommonCallback() {@Overridepublic void onSuccess(String response) {Log.d("MyMessageReceiver", "init cloudchannel success"+response+ pushService.getDeviceId());}@Overridepublic void onFailed(String errorCode, String errorMessage) {Log.d("MyMessageReceiver", "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);}});}

至此,就可以在控制台测试阿里云推送了

接下来才是重点

以上操作只能保证APP开启或者进程在后台运行的情况下才能收到推送(有时候后台运行也收不到),在后台进程被杀死的情况下,是不能收到推送的,好在阿里云提供的有移动推送辅助通道,这个东西,个人理解就是阿里云与各个手机厂商的合作,需要去各个手机厂商的开发平台去申请,申请成功就相当于借用厂商通道向厂商自己制造的手机发送通知,这样就不再受进程限制

那就要一个一个来:辅助通道配置

一:华为

首先在华为开发者联盟注册APP,得到APPID和APPsecret,并开启push功能 开启push服务

下载辅助通道扩展包 阿里云maven库地址,可搜索并下载扩展包 这里其实可以直接连接maven库,很不幸,我还是不能从maven中取包,所以只能手动集成

另外阿里云官方文档里添加的辅助推送扩展包依赖是3.0.10版本,但maven里最新的只有3.0.9版本

这里很矛盾,暂且不问(至于他说的OPPO,vivo需使用3.0.10版本,鉴于本人在写这篇文章时只做了华为,所以先搁置,车到山前必有路,做到了再说)

项目里添加华为推送sdk依赖:

    dependencies {......compile 'com.aliyun.ams:huawei-push:2.6.3.305'compile 'com.aliyun.ams:huawei-push-base:2.6.3.305'}

同时在AndroidManifest文件中添加如下配置:

    <meta-dataandroid:name="com.huawei.hms.client.appid"android:value="华为开放平台申请的ID信息(appid)" />

在application.onCreate()方法中初始化厂商通道. 注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败

    // 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。HuaWeiRegister.register(application);//GCM/FCM辅助通道注册GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数// OPPO通道注册OppoRegister.register(applicationContext, appKey, appSecret); // appKey/appSecret在OPPO开发者平台获取// 魅族通道注册MeizuRegister.register(applicationContext, "appId", "appkey"); // appId/appkey在魅族开发者平台获取// VIVO通道注册VivoRegister.register(applicationContext);

可打印日志查看通道初始化是否成功

如不成功,检查是否在华为控制台配置SHA256指纹证书,目前华为需要配置 生成并配置指纹证书

这里我一开始初始化失败了,配置指纹证书之后就成功了

通过辅助通道(厂商通道)送达的通知,要定义一个activity去接收数据:官方文档如下:

  • 服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类AndroidPopupActivityMiPushSystemNotificationActivity已废弃,小米、华为、OPPO等厂商通道弹窗统一继承AndroidPopupActivity),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;
  • AndroidPopupActivity中提供抽象方法onSysNoticeOpened(),实现该方法后可获取到辅助弹窗通知的标题内容额外参数,在通知点击时触发,原本的通知回调onNotification()onNotificationOpened()不适用于辅助弹窗;
  • 指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true

    import com.alibaba.sdk.android.push.AndroidPopupActivity;public class PopupPushActivity extends AndroidPopupActivity {static final String TAG = "PopupPushActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}/*** 实现通知打开回调方法,获取通知相关信息* @param title     标题* @param summary   内容* @param extMap    额外参数*/@Overrideprotected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);}}

服务端在推送时,需自己配置好appkey和appsecret,还要置顶辅助弹框对应的activity

在控制台的表现就是

至此,华为手机上的app无论后台进程存在与否,都能收到推送

其他手机厂商也差不多都是这样的流程,等我做完了,哪个有特别需要注意的地方,再来更新

手把手教你集成阿里云推送(app杀死仍可推送)相关推荐

  1. 手把手教你创建阿里云平台

    手把手教你创建阿里云平台 创建: 1.打开阿里云平台官网https://account.aliyun.com/,注册账号 2.登录账号,找到产品界面并创建产品 3.新建产品,设置如下 4.产片创建成功 ...

  2. 手把手教你在阿里云ECS上搭建惊艳的博客

    手把手教你在阿里云ECS上搭建惊艳的博客 相信大多数人都有自己搭建博客网站的想法,本文就手把手一步一步的进行,最终结果类似如下样式: 网站软件的选择 软件选择成熟而免费的WordPress,WordP ...

  3. 手把手教你使用阿里云搭建个人网站(上云良心品,细致到想哭)

    时间过得真快,备案快要通过下来了,自己也马上要成为一个真正的站长了,今天就来说一下我如何使用"云平台方案调研/技术选型"."云上建站/开发过程"."架 ...

  4. SpringBoot-短信验证码-快速入门Demo(含redis)(手把手教你开通阿里云短信服务到写出个最终代码来)

    B站小狂神-此博客的内容就是看了这个视频的总结(博主自己写的哦~并非转载) 视频链接-[狂神说]通俗易懂的阿里云短信业务实战教程(露脸) 您是否还在为别人的项目有短信功能自己的却没有? 您是否还在为自 ...

  5. Android手把手教你使用阿里云接口实现人脸定位、人脸检测、人脸对比功能。

    前言 现如今,人工智能越来越火,以至于我们必须了解和掌握它,今天我们就来结合阿里云的接口来实现人脸定位,人脸检测等功能. 废话不多说,先上效果图: 随便在网上找了三张图片进行检测,检测结果只显示了每一 ...

  6. 手把手教你在阿里云服务器上安装Java环境(图文教程)

    前言:最近闲买了个阿里云的服务器,主要有三个用途: 1.学习Redis 2.复习一下Linux命令 3.尝试将一个Spring项目搭建到云服务器上. 1.准备工具 磨刀不误砍柴功,我们先准备好需要用到 ...

  7. 手把手教你对接阿里云短信服务

    正好双十二,最近在做一个小项目需要用到短信业务,注册了新用户125买了5000条短信,有效期2年. 那么如何对接阿里云短信,需要做哪些操作? 可以参考https://help.aliyun.com/d ...

  8. 手把手教你配置阿里云服务器安全组规则完整教程

    阿里云安全组概述 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程 在购买阿里云ECS服务器的时候,阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组.那么,这个安 ...

  9. 安卓手把手教你结合阿里云OSS存储实现视频(音频,图片)的上传与下载

    首先,明白阿里云OSS是个什么鬼 阿里云对象存储(Object Storage  Service,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务.用户可以通过调用API,在任何 ...

  10. 手把手教你在阿里云服务器部署一个属于自己的项目(一)新用户领取阿里云服务器

    FRIDAY9 II - kkluv - 单曲 - 网易云音乐 闲来没事上gitee看别人的代码,突然想到,我能不能把自己的项目部署到服务器,跟自己的农村土鳖小伙伴装装*,让他们看看我一飞冲天的进步. ...

最新文章

  1. windows命令行切换盘目录
  2. 传输文件过程中遇到异常被中断
  3. SpringXML方式配置bean的懒加载lazy-init
  4. ❤️六W字《计算机基础知识》(一)(建议收藏)❤️
  5. 信息学奥赛一本通 1122:计算鞍点 | OpenJudge NOI 1.8 05:计算鞍点
  6. Smartmail外贸CRMBuild1.0版系统白皮书
  7. yum update upgrade 区别_CentOS与RedHat的区别
  8. Cracking The Coding Interview5.3 暂存
  9. Web静态服务器-7-gevent版
  10. 活久见: maven pom 竟然都会崩溃!
  11. webpack系列之-原理篇
  12. 秩为1的矩阵的性质总结
  13. 2020年中国共享电单车市场现状与格局分析,青桔、哈啰和美团占据市场主要份额「图」
  14. 掌握 Dojo 工具包
  15. 原始资料的收集方法———定性资料的收集
  16. 【报告分享】2021小红书食饮品牌研究报告-艺恩(附下载)
  17. matlab 计算变异系数,[转载]用Matlab编的计算结构可靠指标的改进一次二阶矩法程序(验算点法)...
  18. IDRLP: Image Dehazing Using Region Line Prior
  19. 分享几个苹果CMS采集资源站
  20. Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)

热门文章

  1. 信道估计的理解(转载借鉴)
  2. 同义词(近义词)算法总结(附代码)
  3. HTML5期末大作业:动漫人物介绍网站设计——哆啦A梦(5页) HTML+CSS+JavaScript 学生动漫网页设计模板下载 哆啦A大学生HTML网页制作作品 简单漫画网页设计成品
  4. geek软件是干什么的_geektool--一款很geek的工具
  5. 机器视觉之表面缺陷检测
  6. android u盘检测工具,android 检测是否插入U盘方法之一
  7. 使用HttpClient4来构建Spring RestTemplate
  8. html网页如何导入word,怎么把网页导入word
  9. android请求网络接口(xutils3进行网络请求)
  10. 修正Linux下WPS字体库缺失