美文网首页我爱编程
魅族Notification神坑问题

魅族Notification神坑问题

作者: lxbnjupt | 来源:发表于2018-05-28 16:45 被阅读0次

    App实现每日打卡提醒功能,按说这是个比较常见的需求,难度也不是很大。具体实现思路是利用Android系统的AlarmManager,将提醒时间加入系统闹钟并同广播关联,在闹钟到点提醒时,触发广播,然后弹出通知栏提醒。

    1.每日提醒实现代码:

    public class DailyCheckInReceiver extends BroadcastReceiver {
    
        private static final String TAG = DailyCheckInReceiver.class.getName();
        private static String[] tips = {"让每一个小坚持都有大意义,快来打卡!", "卡是谁?为什么我们每天都要打TA?",
                "厉害的人都会对自己狠一点,比如坚持打卡这件事!", "站住!不要走!你还没打卡!", "今天还没打卡哦!改变自己,从不放弃开始!"};
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent target = new Intent(context, MainActivity.class);
            target.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
            target.putExtra(MainActivity.KEY_ONNEWINTENT, MainActivity.DAILY_CHECK_IN);
            setNotification(context, target);
        }
    
        @SuppressWarnings("deprecation")
        private void setNotification(Context context, Intent intent) {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
            builder.setSmallIcon(R.drawable.icon);
            builder.setContentTitle(context.getString(R.string.boohee_remind));
            builder.setContentText(tips[new Random().nextInt(5)]);
            builder.setWhen(System.currentTimeMillis());
            builder.setDefaults(Notification.DEFAULT_SOUND);
            builder.setAutoCancel(true);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
            builder.setContentIntent(pendingIntent);
            NotificationManager nfcManager = (NotificationManager) context
                    .getSystemService(Context.NOTIFICATION_SERVICE);
            if (nfcManager != null) {
                Helper.showLog(TAG, "notify");
                nfcManager.notify(1, builder.build());
            }
        }
    
        //每天中午12点提醒
        public static void start(Context ctx) {
            AlarmManager manager = (AlarmManager) ctx.getSystemService(Service.ALARM_SERVICE);
            Intent intent = new Intent(ctx, DailyCheckInReceiver.class);
            PendingIntent pending = PendingIntent.getBroadcast(ctx, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();
            calSet.setTimeInMillis(System.currentTimeMillis());
            calSet.set(Calendar.HOUR_OF_DAY, 12);
            calSet.set(Calendar.MINUTE, 0);
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);
            if (calSet.compareTo(calNow) <= 0) {
                calSet.add(Calendar.DATE, 1);
            }
            if (manager != null) {
                Helper.showLog(TAG, "DailyCheckInReceiver start");
                manager.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), 24 * 60 * 60 * 1000, pending);
            }
        }
    }
    

    当然,不要忘了在AndroidManifest.xml文件中注册我们的DailyCheckInReceiver:

    <receiver
            android:name=".receiver.DailyCheckInReceiver" />
    

    2.魅族机型神坑

    撸好代码,就开始用自己的魅族手机开始测试,第一遍测试成功的弹出了通知,很开心,以为大功告成了。本着严谨的测试态度,想着继续多测试几次。第二遍测试,到点通知没有弹出,我靠什么鬼,刚刚明明是可以弹出了。而且,从日志上看,nfcManager.notify(1, builder.build())已经执行了,但问题就是没有弹出来。从此刻开始,我经历了漫长的填坑之路。。。各种换机型测试,各种控制变量法。最后发现貌似除了魅族机型会有这种问题,其他测试机型都可以顺利弹出通知提醒,而且是到通知的时间一会儿能够弹出通知提醒,一会又弹不出通知提醒,而且是大多数时候都弹不出,甚是郁闷。
    最后,问题定位到Notification的contentText()方法上面,对于魅族手机,如果contentText内容含有感叹号(!),Notification通知就无法显示。坑的都特么吐血了,居然是感叹号惹的祸,把感叹号替换掉之后可以顺利进行通知提醒。

    if ("Meizu".equals(android.os.Build.MANUFACTURER)) {
                // 魅族神坑,如果内容含有感叹号,Notification通知无法显示
                builder.setContentText(tipsStr[new Random().nextInt(5)].replaceAll("!", "~"));
            } else {
                builder.setContentText(tipsStr[new Random().nextInt(5)]);
            }
    

    相关文章

      网友评论

        本文标题:魅族Notification神坑问题

        本文链接:https://www.haomeiwen.com/subject/taugjftx.html