极光推送问题小结

阅读: 评论:0

极光推送问题小结

极光推送问题小结

极光推送

公司项目集成极光推送,近来修复之前的一些bug,做个小结。废话不多说,容我娓娓道来~~~


一.收不到推送或者之前的登录设备收到推送

RegistrationID的定义
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID
以下代码是自定义广播接收器中部分代码,用来接收RegistrationID

 if (JPushInterface.ACTION_REGISTRATION_ID.Action())) {String regId = String(JPushInterface.EXTRA_REGISTRATION_ID);sp.edit().putString("jpush_regis_id", regId).apply();DLog.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);// send the Registration Id to your server。。。} 

我们后台的逻辑是根据我们在登录的时候传递的这个RegistrationID来推送消息或者通知的,它的保存如上代码,那么问题就出现了,接收推送消息的这个广播 Action-JPushInterface。ACTION_REGISTRATION_ID 只会回调一次,那么就会遇到切换账号的时候,或者在开发的时候运行项目的时候,实例化极光推送,并不会接收到这个广播,导致共享文件中的这个RegistrationID为空,登录传给后台的也为空,后台就会推送给上次登录并且记录下RegistrationID的设备而不是当前登录设备。

解决方案: getRegistrationID(Context context) 调用该方法可以获取当前的RegistrationID,传递给后台即可。

二.推送通知图标和样式不统一

我们后台目前直接给我们推送的通知,在有些手机上,默认的推送通知样式不能很好的展示在我们的状态栏还有下拉通知栏上,部分手机会出现状态栏上图标展示不全等问题。。。

解决方案: 使用自定义通知栏的方法,注意最顶层状态栏小图标大小需要适配,通知的图标大小 drawable-xhdpi 4848 drawable-hdpi 3636 drawable-mdpi 24*24,下拉状态栏时显示的通知图标直接使用应用图标就行,代码如下:

  CustomPushNotificationBuilder builder = Instance(),R.layout.customer_notitfication_layout,R.id.icon,R.id.title,);// 指定定制的 Notification Layoutbuilder.statusBarDrawable = R.drawable.jpush_notification_icon;// 指定最顶层状态栏小图标builder.layoutIconDrawable = R.mipmap.dp_icon;// 指定下拉状态栏时显示的通知图标JPushInterface.setPushNotificationBuilder(1, builder);

三.前后台推送的关闭和开启

应需求,我们需要应用在后台的时候才能收到通知,在前台的时候不需要收到通知

解决方案: 通过监听应用切换到前台还是后台,来对极光推送进行设置,具体看代码

	private int mStartedActivityCount = 0; //活动的Activity个数private Set<Integer> mDaySetClear = new HashSet<>();private Set<Integer> mDaySetAll = new HashSet<>();
		mDaySetAll.add(0);mDaySetAll.add(1);mDaySetAll.add(2);mDaySetAll.add(3);mDaySetAll.add(4);mDaySetAll.add(5);mDaySetAll.add(6);
//监听前后台registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle bundle) {}@Overridepublic void onActivityStarted(Activity activity) {mStartedActivityCount++;if (!mAppIsForeGround) {mAppIsForeGround = true;JPushInterface.Instance(), mDaySetClear, 0, 23);//设置推送时间来控制推送能否收到}}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {mStartedActivityCount--;if (mStartedActivityCount == 0) {if (mAppIsForeGround) {mAppIsForeGround = false;JPushInterface.Instance(), mDaySetAll, 0, 23);}}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle bundle) {}@Overridepublic void onActivityDestroyed(Activity activity) {}});

四.通知栏样式适配

通知有两种,默认的和自定义的。

默认通知不存在样式适配的问题,因为默认通知的布局、颜色、背景什么的都是系统的,系统总会正确的显示默认通知。
但自定义通知就不一样了,自定义通知的布局完全由我们自己掌控,我们可以为元素设置任何背景、颜色。那么,问题来了。Android通知栏的背景各种各样,不同的ROM有不同的背景,白色、黑色、透明等。不同的Android版本通知栏背景也不一样,一旦我们为自定义通知上的元素设置了特定背景或颜色,就肯定会带来兼容性问题(主要是文本啦)

解决方案:1.直接指定好一种背景颜色,字体颜色,这种简单易行,但是和系统的通知栏不够沉浸,影响整体美观。2.另一种方案就稍微合理一些:通过读取系统的通知栏样式文件,获取到title和content的颜色,进而将这个颜色设置到自定义通知上。读取通知栏样式文件本身有兼容性问题,不同Android版本的样式文件有变,具体可参考这篇博客 通知栏设置系统字体颜色 ,这种方式也不是在所有手机上生效,实际测试发现,还是有小部分机型没法读取或是读取到的是错误的。拿到title和content的颜色后,还可以通过算法(后面细说)判断这个颜色是近似白色还是近似黑色,进而能判断出通知栏的背景是近似黑色还是近似白色,这样就能根据不同的通知栏背景加载不同的自定义通知布局。进而做到良好的适配。
通知栏存在各式各样的背景色,字体大小和颜色也不尽相同。通过上述方法,有一部分机型是拿不到系统通知栏颜色的,但通过观察可以发现,所有拿不到字体颜色的机型都是暗色或黑色背景(实测7.0此经验失效),因此可以使用白色字体。

参考链接:

本文发布于:2024-02-04 05:48:26,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170700362852773.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:极光   小结
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23