极光推送问题小结

极光推送

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


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

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

 if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(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 48*48 drawable-hdpi 36*36 drawable-mdpi 24*24,下拉状态栏时显示的通知图标直接使用应用图标就行,代码如下:

  CustomPushNotificationBuilder builder = new
                CustomPushNotificationBuilder(YMApplication.getInstance(),
                R.layout.customer_notitfication_layout,
                R.id.icon,
                R.id.title,
                R.id.text);
        // 指定定制的 Notification Layout
        builder.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() {
                        @Override
                        public void onActivityCreated(
                                Activity activity, Bundle bundle) {

                        }

                        @Override
                        public void onActivityStarted(Activity activity) {
                            mStartedActivityCount++;
                            if (!mAppIsForeGround) {
                                mAppIsForeGround = true;
                             JPushInterface.setPushTime(YMApplication.getInstance(), mDaySetClear, 0, 23);
                             //设置推送时间来控制推送能否收到
                            }
                        }

                        @Override
                        public void onActivityResumed(Activity activity) {

                        }

                        @Override
                        public void onActivityPaused(Activity activity) {

                        }

                        @Override
                        public void onActivityStopped(Activity activity) {
                            mStartedActivityCount--;
                            if (mStartedActivityCount == 0) {
                                if (mAppIsForeGround) {
                                    mAppIsForeGround = false;
                                    JPushInterface.setPushTime(YMApplication.getInstance(), mDaySetAll, 0, 23);
                                }
                            }
                        }

                        @Override
                        public void onActivitySaveInstanceState(
                                Activity activity, Bundle bundle) {

                        }

                        @Override
                        public void onActivityDestroyed(Activity activity) {

                        }
                    });

四.通知栏样式适配

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

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

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

扫描二维码关注公众号,回复: 138189 查看本文章

参考链接:
https://www.jianshu.com/p/426d85f34561

http://iluhcm.com/2017/03/12/experience-of-adapting-to-android-notifications/#%E5%B0%8F%E5%9B%BE%E6%A0%87%E6%98%BE%E7%A4%BA%E5%BC%82%E5%B8%B8

猜你喜欢

转载自blog.csdn.net/u013651026/article/details/79207483