百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

你有新的推送消息,请注意查收_手机你有新的消息请注意查收

wptr33 2025-02-19 14:09 33 浏览

你如果装了拼夕夕,并且没有禁止通知, 手机一段时间没用后,重新解锁,你会发现通知栏是这样的:

一堆通知消息轰炸过来。其实不仅仅是拼夕夕,基本上你手机上安装的大部分软件,都会时不时的给你弹出这么一条推送,推送产品,推送视频,推送歌曲.......


我们就来看看这些不厌其烦的东西是怎么过来的。天天烦你,也得了解了解消息推送咋来的吧?知道怎么来的还不行,还得知道如何把你不喜欢的推送干掉。


推送是什么 第1节


推送是一种服务器主动push消息到设备端的行为。推送功能必须有一个客户端和服务器的长连接,因为如果客户端和服务器之间不存在一个长连接那么服务器是无法来主动连接客户端的。推送服务的整体的架构和流程如下:

1.设备和推送服务器建立长连接

2.设备会根据某些规则生成或从推送服务器获取到一个DeviceToken,推送服务器可以根据DeviceToken定位到具体的设备

3.设备会上报DeviceToken到应用服务器(由应用自己完成)

4.应用服务器根据需要调用推送的服务端接口发起推送

5.推送服务器收到推送请求,根据请求中的DeviceToken定位到具体的设备,下发推送通知

6.设备收到推送消息,可以进行通知栏弹窗或者其他行为


推送如何关闭 第2节


推送这个东西啊,对于大部分用户来说,都是不胜其烦的,但是对于商户,对于软件供应商来说,那可是香饽饽啊。你要问为啥?还能为啥,为了钱呗,推送给你的,都是给别人打广告呢(当然也有给自己打广告的哈),赚的都是广告费啊。

如果你不是软件开发者,后面的内容可能对你来说,就有点枯燥呢,你就可以不用往后面看啦,但是你都点进来,不让你带走点啥,感觉有点对不起你啊。那就教教你怎么关闭通知栏推送的消息吧,虽然大部分人可能都已经知道了,但难保有些小白啊

注意:虽然关闭了通知栏消息,其实推送还是会过来的,只不过,不会显示再通知栏,正所谓,眼不见为净,自我安慰安慰了。

Android 关闭推送消息,就拿拼多多来说:设置--》应用管理-》拼多多,这个时候,你应该可以看到这个界面:

关闭允许通知就行啦,这样你就不会再收到这些可恶的推送了。


送走了非开发者,那就来点开发者需要的内容,请继续往下看!


Android和IOS推送实现的区别 第3节


推送功能都是基于长连接的基础是上的。因此维护长连接是推送实现的重点,而维护长连接需要心跳机制。心跳机制原理图如下:

客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的。如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个。了解Android和IOS 推送的区别,主要从长连接维护方式来看。


—IOS长连接—


IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:

  • 在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。
  • 省电,不会出现每个应用都各自维护一个自己的长连接。
  • 安全,只有在苹果注册的开发者才能够进行推送,等等。


—Android长连接—


Android的长连接是由每个应用各自维护的,但是google也推出了和苹果技术架构相似的推送框架,C2DM,云端推送功能,但是由于google的服务器不在中国境内,其他的原因你懂的。所以导致这个推送无法使用,目前国内要实现推送,只有两种方式:

  • Android开发者自己去维护一个长链接。于是每个应用如果都24小时在线,那么都得各自维护一个长连接,这种电量和流量的消耗是可想而知的。
  • 依赖手机厂商的推送服务。推送的原理都是类似的,但是厂商推送的优势在于这样的长连接可以和自己的手机系统绑定到一起,从而可以不同应用共享同一条长连接,节省了心跳的流量消耗,并且这样的系统级长连接可以不用担心应用被杀导致的应用内长连接断连导致消息推送不可达。

主流的第三方推送平台 第4节


目前市面上,提供厂商提供的推送服务有很多,包括华为推送、小米推送、极光推送等等。但是推送千千万,各有各不同。比如说吧 华为啊,小米啊,都是基于自己的内核系统做了处理,在自家手机里都能等到很好的应用,当然它也对外免费提供(部分收费),但是嘛,效果方面肯定要大写折扣,但是像个推、极光推送这些,需要收费提供,兼容性以及完善性就做的相对比较好了。


—推送平台分类—


主流的推送平台大概分成三类:

  • 手机厂商类:小米推送、华为推送;
  • 第三方平台类:个推推送、极光推送、友盟推送;
  • BAT大厂:阿里云移动推送、腾讯信鸽推送、百度云推送。


—各推送平台比较—


虽然提供推送服务的平台有很多,但每个平台都有自己的优缺点,没法做到完美。通过:安全、稳定、省电省流省成本、体积,这四个方面对对各个平台进行一个大致的对比,结果如下:


—推送平台选择—


具体选择那个平台,这个看业务需求了:

  • 如果对推送量不高,同时需要保证到达率,用户群体精确(手机或华为居多)并且想省钱,可以自己兼容多个手机厂商来处理
  • 但要是推送的量比较大,想要兼容性高,而且还不缺钱,并且有很好的后台监控,可以选择第三方平台
  • 对于BAT大厂的推送方案,优势都不及厂商和第三方,就我个人而言是不推荐的。

怎么接入各个推送平台,直接去各个平台的官网,都有详细的文档,这里就不在赘述了。

注意:推送系统会共享一条推送渠道。这意味着假设你接入了友盟推送,而恰好今日头条也接入了友盟。有一天你的App被杀死了,但这时用户启动了今日头条,那么推送系统也就会通过共享的推送通道顺便把你推送消息送达到手机上,然后还可能把你的进程也唤醒(被“保活”了)。


通知栏消息 第5节


推送最终的效果是,发出消息给客户端,显示消息在通知栏或者相关数据,作为移动开发者,我们来着重看看通知栏相关的知识。


— 通知栏基本形式—


这里借用官网的说明,请细看:

从上面看,很详细了吧,一个基本的通知栏包含了6个部分:小图标、应用名称、通知栏消息时间、大图标、通知消息标题、通知消息内容。其中时间和大图标可选,其他的必须要设置。更多其他类型的通知栏就去参考官网啦

(https://developer.android.google.cn/guide/topics/ui/notifiers/notifications?hl=en)


—创建通知栏消息—


创建通知栏消息,主要是组装通知栏包含的六个内容,然后通过NotificationManager发送通知,具体实现如下:

Notification.Builder builder = new Notification.Builder(this);builder.setSmallIcon(R.mipmap.ic_launcher) //必须设置        .setLargeIcon( BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher_background))        .setContentText("点击通知消息,打开Activity") //内容        .setContentTitle("测试通知")                  //标题        .setPriority(Notification.PRIORITY_DEFAULT)     //优先级        .setAutoCancel(true);                       //点击自动取消?// 创建Notification管理实例NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);// 发送通知消息notificationManager.notify(NOTIFY_ID,builder.build());?

这样,就可以在手机上显示一个通知栏(android 6.0 以上的手机系统权限设置页面,手动开启通知权限,android 9.0 以上需要设置渠道才能显示,暂时不在讨论范围),点击通知,通知栏就会取消。


—通知栏跳转和监听—


点击通知栏跳转页面以及监听通知栏点击事件都离不开 PendingIntent,讲解之前,我们先看看官网的说明:

从上述描述可以知道,PendingIntent 是对要使用它执行的意图和目标操作的描述, 并且实例可以通过四个方法获取:

1.getActivities(Context context, int requestCode, Intent[] intents, int flags)

2.getActivity(Context context, int requestCode, Intent intent, int flags)

3.getBroadcast(Context context, int requestCode, Intent intent, int flags)

4.getService(Context context, int requestCode, Intent intent, int flags)

根据方法名,我们可以看出,PendingIntent可以暂存 activity,Broadcast以及Service行为,等合适的实际再执行, 什么是合适的时机呢?对的,就是你点击通知栏的时候。


—页面跳转实现—


分析:先创建一个打开Activity的Inent,然后通过getActivity 创建一个PendingIntent的实例,最后将PendingInent 添加到通知栏消息中,具体实现如下:

// 定义 一个消息IDfinal int NOTIFY_ID = 1;// 创建一个打开Activity的 IntentIntent intent = new Intent(MainActivity.this,Main2Activity.class);// 通过 getActivity 获取一个可以打开Activity 的PendingIntentPendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);?NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setSmallIcon(R.mipmap.ic_launcher)        .setLargeIcon( BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher_background))        .setContentText("点击通知消息,打开Activity")        .setContentTitle("测试通知")        .setPriority(NotificationCompat.PRIORITY_DEFAULT)        .setContentIntent(pendingIntent) // 将PendingIntent 添加到Notification中        .setAutoCancel(true);// 创建Notification管理实例NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);// 发送通知消息notificationManagerCompat.notify(NOTIFY_ID,builder.build());


通过上述代码,会弹出一个通知栏消息,点击就会打开一个Activity页面。


—点击监听实现—


有时,我们点击通知栏时,并不一定打开一个对应的界面,而是执行一个特定的操作,基于页面跳转,我们就可以在PendingIntent中封装一个广播,当点击时发送广播,来达到监听点击事件的效果。具体实现如下:

a.创建一个广播,继承BroadcastReceiver,并在onReceive里面显示一个Toast,如下:

public class NotificationClickReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Log.d("NotificationReceiver","通知栏消息被点击啦");    }}

b.在AndroidManifest.xml中注册广播 ,并设置匹配的Action

                

c.创建一个打开发送广播的Intent,然后通过getBroadcast获取一个PendingIntent 实例,并将PendingIntent 加入消息中,代码如下:

final?String?BROADCAST_ACTION_DISC?=?"com.test.broadcast.action";// 定义 一个消息IDfinal int NOTIFY_ID = 2;// 创建一个发送广播的 IntentIntent intent = new Intent(MainActivity.this,NotificationClickReceiver.class);// 设置打开广播匹配的actionintent.setAction(BROADCAST_ACTION_DISC);// 通过 getBroadcast 获取一个可以发送广播 的PendingIntentPendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,intent,0);?Notification.Builder builder = new Notification.Builder(this);builder.setSmallIcon(R.mipmap.ic_launcher) //必须设置        .setLargeIcon( BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher_background))        .setContentText("点击通知消息,打开Activity") //内容        .setContentTitle("测试通知")                  //标题        .setContentIntent(pendingIntent) // 将PendingIntent 添加到Notification中        .setPriority(Notification.PRIORITY_DEFAULT)     //优先级        .setAutoCancel(true);                       //点击自动取消?// 创建Notification管理实例NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);// 发送通知消息notificationManager.notify(NOTIFY_ID,builder.build());

这样弹出通知栏消息后,点击通知栏消息,就可以在控制台查看日志输出啦。


—通知栏还有啥可以操作?—


还可以获取验证码。现在注册验证都需要验证码,短息发过来,都会在通知栏显示,但是需要自己手动去输入,比较麻烦,可以去监听通知栏消息,当有消息来的时候,就检查是不是自己App发送的验证信息,然后就可以获取验证信息,自动填充。具体操作如下:

a. 监听通知栏消息,需要应用授予读取应用的权限,具体操作如下:

// 获取 已授权的应用列表(获取应用通知权限)String string = Settings.Secure.getString(getContentResolver(),        "enabled_notification_listeners");System.out.println("zyf 已经允许使用通知权的应用:" + string);// 判断当前应用是否已授权if (!string.contains(NotificationService.class.getName())) {    // 若没有授权则跳转到 设置页面授权    startActivity(new Intent(            "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));}?

b.创建服务用来监听通知栏消息,继承
NotificationListenerService,该类有两个方法onNotificationPosted和 onNotificationRemoved ,前者监听通知消息显示,后者监听通知消息删除,实现如下:

public class NotificationService extends NotificationListenerService {    @Override    public void onNotificationPosted(StatusBarNotification sbn) {        super.onNotificationPosted(sbn);        Log.d("NotificationService","收到推送消息啦");        Notification mNotification = sbn.getNotification();        if (mNotification != null) {            String packageName=sbn.getPackageName();//发送通知的包名            Bundle bundle = mNotification.extras;            bundle.getString(Notification.EXTRA_TITLE);            bundle.getString(Notification.EXTRA_TEXT);            Log.d("NotificationService",bundle.toString());        }?    }?    @Override    public void onNotificationRemoved(StatusBarNotification sbn) {        super.onNotificationRemoved(sbn);        Log.d("NotificationService","推送消息被移除啦");    }}

c. 在AndroidManifest.xml中注册服务,并配置Action

                                          

d.发送一个推送消息,然后点击消息,可看到如下信息:

这样就可以获取到推送的消息,然后找出自己的验证码啦!


正所谓,存在即合理,既然有推送这么个玩意,肯定有它存在的意义,比如新闻类应用给你推送实时的报道,音乐类应用给你推送好听的音乐。。。这些还是很让人舒适的。虽然一直推荐你买东西让人很讨厌,但是你可以关掉啊,关掉它你的世界就清静了。而显示的通知栏可不仅仅这么简单,还有很多丰富多彩的表现形式,有兴趣可以自己了解了解哦!


关于作者:哆啦猫,普元移动端开发工程师,擅长Java,专注于Andriod开发。目前参与Mobile 8.0项目的开发,主要接触RN技术的应用,黏合前端代码 与Android底层之间的交互。

关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...